Android 11 无法从外部存储获取所有文件路径

发布于 2025-01-13 05:19:04 字数 5210 浏览 1 评论 0原文

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

浪漫人生路 2025-01-20 05:19:04

如果您仍然没有收到文件,那么也许我的答案可以帮助您。

尝试一下 - 在 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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文