Android ContentProvider的getType()方法在何时被调用以及为什么会被调用?

25

我在getType()方法中放置了一条日志,但它从未被打印出来。我正在使用Notepad示例代码。请解释Java文档注释的第一行。从getType()返回null也可以正常工作。getType()方法的目的是什么?

    /**
 * This is called when a client calls {@link android.content.ContentResolver#getType(Uri)}.
 * Returns the MIME data type of the URI given as a parameter.
 * 
 * @param uri The URI whose MIME type is desired.
 * @return The MIME type of the URI.
 * @throws IllegalArgumentException if the incoming URI pattern is invalid.
 */
@Override
public String getType(Uri uri)
{
    Log.d("Suparna", "******getType()");
    /*switch(uriMatcher.match(uri))
    {
    // ---get all books---
    case BOOK_DETAILS:
        return Book.Book_Details.CONTENT_TYPE;
        // ---get a particular book---
    case BOOK_DETAILS_ID:
        return Book.Book_Details.CONTENT_ITEM_TYPE;
    default:
        throw new IllegalArgumentException("Unsupported URI: " + uri);
    }*/
    return null;
}

6
这个问题没有得到关注的原因是你忘记在标签中加入“android”这个关键词。 :) - Alex Lockwood
这篇Stack Overflow的帖子或许可以帮到你:为什么要使用ContentProvider.getType()获取MIME类型。 - boiledwater
2个回答

37

getType(Uri uri)通常只会在调用ContentResolver#getType(Uri uri)后调用。它被应用程序(包括其他第三方应用程序,如果您的ContentProvider已经被导出或您自己的应用程序)用于检索给定内容URL的MIME类型。如果您的应用程序不关心数据的MIME类型,则简单地使该方法return null即可。


好的。比如说,根据Uri的数据类型,如果你想对检索到的数据执行特定的操作,比如打开浏览器或邮件客户端,那么这就是一个可能的用例。谢谢! - Android Developer
1
不实现getType(Uri)最多是懒惰的。如果你是Provider的唯一使用者,这可能还好。否则,你就在假设别人的用法。 - spaaarky21
2
实际上,与其返回NULL,最好写成: throw new UnsupportedOperationException("getType未实现"); - zkvarz
这样的异常在ContentProvider中如何向调用客户端(ContentResolver)传播回去? - JohnyTex
@AlexLockwood 只有在我们传递有效的 URI 时才会调用 getType()。对于任何其他 URI,它只会返回 null,甚至不会调用我在 ContentProvider 中实现的 getType()。那么它有什么用处呢? - CopsOnRoad
显示剩余2条评论

4

当您允许您的ContentProvider与其他第三方应用程序交互时,该ContentProvidergetType()方法通常被使用。Android系统使用此MIME类型来查找可以处理它的应用程序。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接