Android 11 无法从外部存储获取所有文件路径
Android 11 无法从外部存储获取媒体文件路径 (uri content://com.android.providers.media.documents/document/
)。我有所有权限。在另一个设备中我可以获取文件路径。但在 Realmi 8 Android 11 中,我感到空刺。 也许这个模型中有一些我不知道的存储和访问功能? 我没有检查这个问题是否存在于其他 Realme 型号中。 这是我的代码:
///////////
myButton.setOnclickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
checkWritePermission();
}
});
private void checkWritePermission() {
if (isWritePermissionGranted()) {
sendNewMessage(titleEditText.getText().toString(), messageEditText.getText().toString(),
files, false);
} else {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE}, PERMISSIONS_REQUEST_WRITE_ACCESS);
}
}
private Boolean isWritePermissionGranted() {
return ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED &&
ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED;
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
if (requestCode == PERMISSIONS_REQUEST_READ_STORAGE) {
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// permission was granted, yay! Do the
// contacts-related task you need to do.
navigateToCustomPhotoGallary();
}
} else if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED
&& requestCode == REQUEST_FROM_DIALOG) {
AttachmentDialog.newInstance().show(getSupportFragmentManager());
}
if (requestCode == PERMISSIONS_REQUEST_WRITE_ACCESS && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
sendNewMessage(titleEditText.getText().toString(), messageEditText.getText().toString(),
files, false);
}
}
///////
{
String[] mimeTypes = CommonConstants.ALLOWED_MIME_TYPES;
Intent intent;
intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.putExtra(Intent.EXTRA_LOCAL_ONLY, true);
intent.setType("*/*");
intent.putExtra(Intent.EXTRA_MIME_TYPES, mimeTypes);
startActivityForResult(intent, PICK_PDF_SINGLE);
}
//////
String filePath = "";
String selection = null;
String[] selectionArgs = null;
// Uri is different in versions after KITKAT (Android 4.4), we need to
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && DocumentsContract.isDocumentUri(context.getApplicationContext(), uri)) {
if (isExternalStorageDocument(uri)) {
final String docId = DocumentsContract.getDocumentId(uri);
final String[] split = docId.split(":");
final String type = split[0];
if ("primary".equalsIgnoreCase(type)) {
return Environment.getExternalStorageDirectory() + "/" + split[1];
if (isMediaDocument(uri)) {
final String docId = DocumentsContract.getDocumentId(uri);
final String[] split = docId.split(":");
final String type = split[0];
if ("image".equals(type)) {
uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
} else if ("video".equals(type)) {
uri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
} else if ("audio".equals(type)) {
uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
} else if ("document".equals(type)) {
uri = MediaStore.Files.getContentUri("external");
}
selection = "_id=?";
selectionArgs = new String[]{
split[1]
};
}
}
if ("content".equalsIgnoreCase(uri.getScheme())) {
String[] projection = {
MediaStore.Images.Media.DATA
};
try (Cursor cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null)) {
if (cursor != null) {
return getFilePathFromCursor(cursor, projection[0]);
}
}
} else if ("file".equalsIgnoreCase(uri.getScheme())) {
return uri.getPath();
}
return null;
}
Android 11 Can not get media files path from external storage (uri content://com.android.providers.media.documents/document/
) . I have all permissions. In another devices I can get files path. But in Realmi 8 Android 11 I get empty sting.
maybe there are some features of storage and access in this model that I do not know about?
I didn't check if this problem is in another Realme model.
Here is my code:
///////////
myButton.setOnclickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
checkWritePermission();
}
});
private void checkWritePermission() {
if (isWritePermissionGranted()) {
sendNewMessage(titleEditText.getText().toString(), messageEditText.getText().toString(),
files, false);
} else {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE}, PERMISSIONS_REQUEST_WRITE_ACCESS);
}
}
private Boolean isWritePermissionGranted() {
return ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED &&
ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED;
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
if (requestCode == PERMISSIONS_REQUEST_READ_STORAGE) {
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// permission was granted, yay! Do the
// contacts-related task you need to do.
navigateToCustomPhotoGallary();
}
} else if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED
&& requestCode == REQUEST_FROM_DIALOG) {
AttachmentDialog.newInstance().show(getSupportFragmentManager());
}
if (requestCode == PERMISSIONS_REQUEST_WRITE_ACCESS && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
sendNewMessage(titleEditText.getText().toString(), messageEditText.getText().toString(),
files, false);
}
}
///////
{
String[] mimeTypes = CommonConstants.ALLOWED_MIME_TYPES;
Intent intent;
intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.putExtra(Intent.EXTRA_LOCAL_ONLY, true);
intent.setType("*/*");
intent.putExtra(Intent.EXTRA_MIME_TYPES, mimeTypes);
startActivityForResult(intent, PICK_PDF_SINGLE);
}
//////
String filePath = "";
String selection = null;
String[] selectionArgs = null;
// Uri is different in versions after KITKAT (Android 4.4), we need to
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && DocumentsContract.isDocumentUri(context.getApplicationContext(), uri)) {
if (isExternalStorageDocument(uri)) {
final String docId = DocumentsContract.getDocumentId(uri);
final String[] split = docId.split(":");
final String type = split[0];
if ("primary".equalsIgnoreCase(type)) {
return Environment.getExternalStorageDirectory() + "/" + split[1];
if (isMediaDocument(uri)) {
final String docId = DocumentsContract.getDocumentId(uri);
final String[] split = docId.split(":");
final String type = split[0];
if ("image".equals(type)) {
uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
} else if ("video".equals(type)) {
uri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
} else if ("audio".equals(type)) {
uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
} else if ("document".equals(type)) {
uri = MediaStore.Files.getContentUri("external");
}
selection = "_id=?";
selectionArgs = new String[]{
split[1]
};
}
}
if ("content".equalsIgnoreCase(uri.getScheme())) {
String[] projection = {
MediaStore.Images.Media.DATA
};
try (Cursor cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null)) {
if (cursor != null) {
return getFilePathFromCursor(cursor, projection[0]);
}
}
} else if ("file".equalsIgnoreCase(uri.getScheme())) {
return uri.getPath();
}
return null;
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
如果您仍然没有收到文件,那么也许我的答案可以帮助您。
尝试一下 - 在 Android 10 及更高版本中加载媒体文件
If you're stil not getting your files then maybe my answer can help you.
Try it - Load media files in android 10 and above