代码之家  ›  专栏  ›  技术社区  ›  Sanjay Bhalani

在android的MI-Oreo(MI-A2)设备中,无法获取从下载文件夹中选择任何文件的URI

  •  2
  • Sanjay Bhalani  · 技术社区  · 6 年前

    我正在附上一份 fileUtil 类,我一直在使用,它工作良好,直到牛轧糖版本。但是在某些特定的设备中,使用oreo和它,我们会得到一个空路径作为回报。所以,如果有人遇到过这样的错误并找到了解决方法,那么请在这里分享。

    if(resultCode ==RESULT_OK)
    {
        final Uri uri = data.getData();
        // Get the File path from the Uri
        String path = FileUtils.getPath(this, uri);
        // Alternatively, use FileUtils.getFile(Context, Uri)
        if (path != null && FileUtils.isLocal(path)) {
            //File file = new File(path);
            this.file = new File(path);
            profile_imagepath = path;
            filename = file.getName();
            txtselectedfile.setText(filename);
        }
    }
    
    1 回复  |  直到 6 年前
        1
  •  6
  •   Yyy    6 年前

    你可以试着用 ACTION_PICK 如果api级别高于26,则修复此问题,而不是使用 ACTION_GET_CONTENT 希望这对你有帮助。

        2
  •  4
  •   satyawan hajare    5 年前
    1) Open file intent.
           Intent intent = new Intent()
                        .setType("*/*")
                        .setAction(Intent.ACTION_GET_CONTENT);
                intent.putExtra(Intent.EXTRA_LOCAL_ONLY, true);
                intent.addCategory(Intent.CATEGORY_OPENABLE);
                intent.setFlags(FLAG_GRANT_READ_URI_PERMISSION | FLAG_GRANT_WRITE_URI_PERMISSION);
                startActivityForResult(Intent.createChooser(intent, "Select a file"), REQUEST_CODE);
    
    2)get download document path using below method.
    
      if (isDownloadsDocument(uri)) {
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                        final String id;
                        Cursor cursor = null;
                        try {
                            cursor = context.getContentResolver().query(uri, new String[]{MediaStore.MediaColumns.DISPLAY_NAME}, null, null, null);
                            if (cursor != null && cursor.moveToFirst()) {
                                String fileName = cursor.getString(0);
                                String path = Environment.getExternalStorageDirectory().toString() + "/Download/" + fileName;
                                if (!TextUtils.isEmpty(path)) {
                                    return path;
                                }
                            }
                        } finally {
                            if (cursor != null)
                                cursor.close();
                        }
                        id = DocumentsContract.getDocumentId(uri);
                        if (!TextUtils.isEmpty(id)) {
                            if (id.startsWith("raw:")) {
                                return id.replaceFirst("raw:", "");
                            }
                            String[] contentUriPrefixesToTry = new String[]{
                                    "content://downloads/public_downloads",
                                    "content://downloads/my_downloads"
                            };
                            for (String contentUriPrefix : contentUriPrefixesToTry) {
                                try {
                                    final Uri contentUri = ContentUris.withAppendedId(Uri.parse(contentUriPrefix), Long.valueOf(id));
    
                             /*   final Uri contentUri = ContentUris.withAppendedId(
                                        Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));*/
    
                                    return getDataColumn(context, contentUri, null, null);
                                } catch (NumberFormatException e) {
                                    //In Android 8 and Android P the id is not a number
                                    return uri.getPath().replaceFirst("^/document/raw:", "").replaceFirst("^raw:", "");
                                }
                            }
    
    
                        }
    
                    } else {
                        final String id = DocumentsContract.getDocumentId(uri);
                        final boolean isOreo = Build.VERSION.SDK_INT >= Build.VERSION_CODES.O;
                        if (id.startsWith("raw:")) {
                            return id.replaceFirst("raw:", "");
                        }
                        try {
                            contentUri = ContentUris.withAppendedId(
                                    Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));
    
                        } catch (NumberFormatException e) {
                            e.printStackTrace();
                        }
                        if (contentUri != null) {
                            return getDataColumn(context, contentUri, null, null);
                        }
                    }
    
    
                }