Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/205.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 什么';安卓系统之间的区别是:权限=”;packagename.permissions.BROWSER“提供程序”;还有安卓:grantUriPermissions?_Android - Fatal编程技术网

Android 什么';安卓系统之间的区别是:权限=”;packagename.permissions.BROWSER“提供程序”;还有安卓:grantUriPermissions?

Android 什么';安卓系统之间的区别是:权限=”;packagename.permissions.BROWSER“提供程序”;还有安卓:grantUriPermissions?,android,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() 但是,该应用程序中的提供商实际上有: &l

我很好奇,只是因为我试图访问的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>
那么收到的错误是:

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">
...

...
所以我的问题是,为什么错误会说我需要那个许可证或授权许可证,当一个很明显存在的时候?

如果你看这个,你会看到这个许可证的声明

<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\u PROVIDER
来直接访问该提供商,正如我上面指出的,您不能拥有。但是,在提供程序中是关键部分。这个元素的意思是,如果您持有android.permission.GLOBAL\u search权限,您可以访问以
/search\u suggest\u query
开头的路径


由于您试图访问
/history
,因此出现安全异常。您不允许这样做。

您可以发布清单的其余部分吗?如果你没有声明你的应用程序使用该权限,你将无法访问
android:grantUriPermissions
主要用于一次性访问类型的场景。我被这个链接弄糊涂了。如果是你的提供商,那么你不需要android:grantUriPermissions,因为你只需授予自己所需的权限即可。如果是其他人的提供商,您需要使用他们的权限。或者,如果他们的
android:grantUriPermissions
设置为true,您可以在Intent中请求权限。它不是我的供应商。请阅读更新后的问题,这完全回答了我的问题。现在,让我们假设提供商的所有者希望允许我的应用程序访问提供商——并且只有我的应用程序——这可能吗?我不确定如何(或者是否)可能。你可能想为此提出一个新问题。同样。我会那样做的。
<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>