[英]Permission Denial: opening provider com.android.providers.media.MediaDocumentsProvider
I am trying to allow the user to access his photo library to get a profile picture, and that save that profile picture to SharedPreferences.我正在尝试允许用户访问他的照片库以获取个人资料图片,并将该个人资料图片保存到 SharedPreferences。 I also have a navbar that gets this picture from SharedPreferences我还有一个导航栏,可以从 SharedPreferences 获取这张图片
I am getting the following error:我收到以下错误:
java.lang.SecurityException:
Permission Denial: opening provider com.android.providers.media.MediaDocumentsProvider from ProcessRecord
{a601c1c 3379:com.example.foo.finalapp/u0a60} (pid=3379, uid=10060) requires android.permission.MANAGE_DOCUMENTS or android.permission.MANAGE_DOCUMENTS
Here is the code for getting the picture:下面是获取图片的代码:
MainActivity主要活动
ImageView prof_pic = (ImageView) header.findViewById(R.id.profPic);
pref = getSharedPreferences(Profile.pref_filename, 0);
String uri = pref.getString("target_uri", "");
TextView tv_name = (TextView) header.findViewById(R.id.tv_name);
String name = pref.getString("name", "");
if(!uri.equals("")) {
Uri urii = Uri.parse(uri);
try {
Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(urii));
tv_name.setText(name);
prof_pic.setImageBitmap(bitmap);
} catch (FileNotFoundException e) {
}
}
else {
prof_pic.setImageResource(R.drawable.ic_android_black_24dp);
}
}
profile_pic.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
/*
Intent intent = new Intent(Intent.ACTION_PICK,
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(intent, 0);
*/
Intent intent;
if (Build.VERSION.SDK_INT < 19) {
intent = new Intent();
intent.setAction(Intent.ACTION_GET_CONTENT);
intent.setType("*/*");
startActivityForResult(intent, KITKAT_VALUE);
} else {
intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("*/*");
startActivityForResult(intent, KITKAT_VALUE);
}
}
});
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == KITKAT_VALUE) {
if (resultCode == RESULT_OK) {
targetUri = data.getData();
//Bitmap bitmap;
try {
bitmap = BitmapFactory.decodeStream(getActivity().getContentResolver().openInputStream(targetUri));
/*
SharedPreferences.Editor edit = pref.edit();
edit.putString("target_uri", targetUri.toString());
edit.apply();
*/
sTargetUri = targetUri.toString();
profile_pic.setImageBitmap(bitmap);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
Here is my manifest这是我的清单
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.finalapp">
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MANAGE_DOCUMENTS" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:theme="@style/AppTheme.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".JobViewActivity"></activity>
</application>
</manifest>
public static final int GALLERY_INTENT_CALLED = 1;
public static final int GALLERY_KITKAT_INTENT_CALLED = 2;
if (Build.VERSION.SDK_INT <19){
Intent intent = new Intent();
intent.setType("*/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(intent, GALLERY_INTENT_CALLED);
} else {
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("*/*");
startActivityForResult(intent, GALLERY_KITKAT_INTENT_CALLED);
}
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
Uri originalUri = null;
if (Build.VERSION.SDK_INT < 19) {
originalUri = data.getData();
} else {
originalUri = data.getData();
final int takeFlags = data.getFlags()
& (Intent.FLAG_GRANT_READ_URI_PERMISSION
| Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
try {
getActivity().getContentResolver().takePersistableUriPermission(originalUri, takeFlags);
}
catch (SecurityException e){
e.printStackTrace();
}
}
try {
bitmap = BitmapFactory.decodeStream(getActivity().getContentResolver().openInputStream(originalUri));
...
In my case, the image resource file in my device was removed and the android system could not find the correct path.在我的情况下,我设备中的图像资源文件被删除,android系统找不到正确的路径。 Clearing my room database and running the app again solved the issue.清除我的房间数据库并再次运行应用程序解决了这个问题。
Once first URI is opened with success run:一旦第一个 URI 打开并成功运行:
getContentResolver().takePersistableUriPermission(myURI, (Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION));
In order to save read and write permissions.为了保存读写权限。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.