我见过类似的问题,但我认为我遇到了Android M特有的问题。
我有两个Android应用程序。一个扩展ContentProvider来管理SQLiteDatabase。另一个呈现GUI并从/向内容提供者读/写数据。这两个应用程序成功协同工作,直到我尝试在Content Provider上设置权限。
我收到以下错误消息:
引起:java.lang.SecurityException:权限拒绝:打开 来自ProcessRecord的提供者com.example.productkit.ProductKit {ce096cd 27369:com.example.myapplication / u0a60}(pid = 27369,uid = 10060)要求 com.example.productkit.permission.CONTENT_PROVIDER或 com.example.productkit.permission.CONTENT_PROVIDER
Content Provider的AndroidManifest.xml文件如下所示:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.productkit">
<permission android:name="com.example.productkit.permission.CONTENT_PROVIDER"/>
<application>
<provider
android:name=".ProductKit"
android:authorities="com.example.productkit"
android:exported="true"
android:permission="com.example.productkit.permission.CONTENT_PROVIDER"/>
</application>
</manifest>
GUI应用程序的AndroidManifest.xml文件如下所示:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapplication">
<uses-permission android:name="com.example.productkit.permission.CONTENT_PROVIDER"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme">
<activity
android:name=".MainActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
我的理解是,应用程序需要在运行时使用Android M请求权限。作为实验,我尝试使用以下测试代码执行此操作:
int hasPermission = checkSelfPermission("com.example.productkit.permission.CONTENT_PROVIDER");
if (hasPermission != PackageManager.PERMISSION_GRANTED) {
requestPermissions(new String[] {"com.example.productkit.permission.CONTENT_PROVIDER"},
REQUEST_CODE_ASK_PERMISSIONS);
}
hasPermission = checkSelfPermission("com.example.productkit.permission.CONTENT_PROVIDER");
不幸的是,在调用requestPermissions()之后,hasPermission不等于PERMISSION_GRANTED。
如果我使用相同的代码来访问内置权限(例如CAMERA),则会出现一个对话框,我可以向该应用程序授予权限。我的内容提供商的许可不会发生这种情况。