我在尝试为个人资料图片选择图片时,仅在某些设备中发现此问题。在检查模拟器时,没有看到这些问题,但在应用程序的实时版本中,此用户面临此问题。 从firebase崩溃报告中捕获的屏幕截图。请帮我解决问题。
AndroidMenifest.xml
...
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MANAGE_DOCUMENTS" />
...
SomeActivity.java
private void pickProfilePictureTask() {
Intent intent = null;
if (Build.VERSION.SDK_INT > 19) {
intent = new Intent(Intent.ACTION_OPEN_DOCUMENT, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
intent.addCategory(Intent.CATEGORY_OPENABLE);
} else {
intent = new Intent(Intent.ACTION_GET_CONTENT, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
}
intent.setType("image/*");
startActivityForResult(intent, IMAGE_PICKER_REQUEST);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == IMAGE_PICKER_REQUEST && resultCode == Activity.RESULT_OK) {
if (data != null) {
/**Getting bitmap
*
* InputStream inputStream = getActivity().getContentResolver().openInputStream(data.getData());
* Bitmap userPicBitmap = BitmapFactory.decodeStream(inputStream);
*/
File file = new File(getFileNameFromURI(data.getData()));
String imageName = file.getPath();
uploadProfilePicture.setText(imageName);
userProfilePicUri = data.getData() + "";
}
}
}
private String getFileNameFromURI(Uri contentURI) {
String result;
Cursor cursor = getContentResolver().query(contentURI, null, null, null, null);
if (cursor == null) {
result = contentURI.getPath();
} else {
cursor.moveToFirst();
int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DISPLAY_NAME);
result = cursor.getString(idx);
cursor.close();
}
return result;
}
Android 5.1.1中的错误 异常java.lang.SecurityException:权限拒绝:阅读com.android.providers.media.MediaDocumentsProvider uri content:// com。来自pid = 19207的android.providers.media.documents / document / image%3A6617,uid = 10260 需要android.permission.MANAGE_DOCUMENTS或grantUriPermission()
Android 8.0.0中的错误异常java.lang.SecurityException:权限拒绝:从ProcessRecord打开提供程序com.android.providers.media.MediaDocumentsProvider {5c1039e 5061:com.mobotechnology.cvmaker / u0a219 }(pid = 5061,uid = 10219)要求您使用ACTION_OPEN_DOCUMENT或相关API获取访问权限
答案 0 :(得分:3)
我试图坚持Uri并稍后使用Uri
这适用于Uri
file
计划的Uri
。对于content
方案的大多数Uri
值,它不起作用。这些更类似于经过身份验证的Web站点的HTTP URL - 在您的会话处于活动状态时URL很好,但之后无效。
如果您通过ACTION_OPEN_DOCUMENT
,ACTION_CREATE_DOCUMENT
或ACTION_OPEN_DOCUMENT_TREE
,和获得takePersistableUriPermission()
,请致电{在提供ContentResolver
,然后的Uri
上{1}},您可以安全地保留Uri
。您将无限期地访问内容,直到用户撤消访问权限或内容发生重大变化(例如,已删除),以使其Uri
不再有效。
任何其他content
Uri
(例如ACTION_GET_CONTENT
)只是好for a very short time。这里唯一的选择是将内容复制到您控制的某个文件中(例如,在getCacheDir()
中)并保存该文件的路径。
答案 1 :(得分:1)
试试这个:
public static final int KITKAT_VALUE = 1002;
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) {
if (requestCode == KITKAT_VALUE ) {
if (resultCode == Activity.RESULT_OK) {
// do something here
}
}
}