android:permission =“packagename.permissions.BROWSER_PROVIDER”和android:grantUriPermissions之间有什么区别?

时间:2014-02-21 23:30:36

标签: android

我很好奇,因为我试图访问的uri说明如下:

java.lang.SecurityException: Permission Denial: reading com.foo.MyProvider uri content://com.foo/history from pid=20735, uid=10080 requires com.foo.permissions.BROWSER_PROVIDER, or grantUriPermission()

但是,该应用程序中的提供程序实际上具有:

<provider android:name="com.foo.MyProvider"
          android:authorities="com.foo.db.mydb"
          android:permission="com.foo.permissions.BROWSER_PROVIDER">=
</provider>

这是否意味着我实际上也需要提供商上的android:grantUriPermissions=true?这两个声明之间有什么区别?


实施例

以下是我将尝试从我自己的应用程序中访问的提供程序:

http://dxr.mozilla.org/mozilla-central/source/mobile/android/base/AndroidManifest.xml.in#274

如果我尝试使用以下代码向该提供者的uri(恰好是content://org.mozilla.firefox.db.browser/history)注册观察者:

    private ContentObserver mFirefoxObserver;
    resolver.registerContentObserver("content://org.mozilla.firefox.db.browser/history", true, mFirefoxObserver);

然后收到的错误是:

java.lang.SecurityException: Permission Denial: reading org.mozilla.gecko.db.BrowserProvider uri content://org.mozilla.firefox.db.browser/history from pid=20735, uid=10080 requires org.mozilla.firefox.permissions.BROWSER_PROVIDER, or grantUriPermission()

但是,您会注意到提供者中设置了权限:

<provider android:name="org.mozilla.gecko.db.BrowserProvider"
              android:authorities="@ANDROID_PACKAGE_NAME@.db.browser"
              android:permission="@ANDROID_PACKAGE_NAME@.permissions.BROWSER_PROVIDER">
...

所以我的问题是,为什么错误说我需要那个许可或grantUriPermissions,当一个人显然在那里?

1 个答案:

答案 0 :(得分:1)

如果您查看此line,您会看到此权限的声明

<permission android:name="@ANDROID_PACKAGE_NAME@.permissions.BROWSER_PROVIDER"
            android:protectionLevel="signature"/>

由于这是签名级别权​​限,因此您无法保留此权限。只有使用与该应用相同的开发人员密钥签名的应用才能。

现在回到提供者,这是完整的声明:

<provider android:name="org.mozilla.gecko.db.BrowserProvider"
          android:authorities="@ANDROID_PACKAGE_NAME@.db.browser"
          android:permission="@ANDROID_PACKAGE_NAME@.permissions.BROWSER_PROVIDER">

        <path-permission android:pathPrefix="/search_suggest_query"
                         android:readPermission="android.permission.GLOBAL_SEARCH" />

</provider>

这里说你需要org.mozilla.firefox.permissions.BROWSER_PROVIDER直接访问提供者,正如我上面指出的那样,你不能拥有。尽管是提供者内部的关键部分<path-permission>。该元素的含义是,如果您持有/search_suggest_query权限,则可以访问以android.permission.GLOBAL_SEARCH开头的路径。

您收到安全例外是因为您尝试访问/history,但您不允许这样做。