我很好奇,因为我试图访问的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,当一个人显然在那里?
答案 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
,但您不允许这样做。