无法访问其他应用程序创建的外部存储中的文件

Posted

技术标签:

【中文标题】无法访问其他应用程序创建的外部存储中的文件【英文标题】:Not abe to access file in External Storage created by other app 【发布时间】:2021-12-26 00:00:45 【问题描述】:

我正在尝试读取由我的应用程序(应用程序 A)创建的 Documents 文件夹中的目录,由我的应用程序创建的文件(例如文件名:abc.json)我能够读取它,但如果我创建了另一个文件通过其他应用说 xyz.json 让我们说文件资源管理器然后我无法读取它。

我正在使用 Medistore 方法读取文件并在 android 11 中。我该怎么办?

我用来执行读取的代码:

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) 
        if (Environment.isExternalStorageManager()==false) 

            Intent intent = new Intent();
            intent.setAction(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
            Uri uri = Uri.fromParts("package", context.getPackageName(), null);
            intent.setData(uri);
            context.startActivity(intent);


        
    


    try
        Uri contentUri = MediaStore.Files.getContentUri("external");
        String selection = MediaStore.MediaColumns.RELATIVE_PATH + "=?";
        String[] selectionArgs = new String[]Environment.DIRECTORY_DOCUMENTS + "/"+folderName+"/";

        Cursor cursor =context.getContentResolver().query(contentUri, null, selection, selectionArgs, null);

        Uri uri = null;

        if (cursor.getCount() == 0) 
            Toast.makeText(context, "No file found in \"" + Environment.DIRECTORY_DOCUMENTS + "/"+folderName+"\""+cursor.getCount(), Toast.LENGTH_LONG).show();
         else 
            while (cursor.moveToNext()) 
                int filenameTemp=cursor.getColumnIndex(MediaStore.MediaColumns.DISPLAY_NAME);
                String fileName = cursor.getString(filenameTemp);

                if (fileName.equals(readFileName)) 
                    int idTemp=cursor.getColumnIndex(MediaStore.MediaColumns._ID);
                    long id = cursor.getLong(idTemp);

                    uri = ContentUris.withAppendedId(contentUri, id);

                    break;
                
            

            if (uri == null) 
                Toast.makeText(context, "\""+readFileName+"\" not found", Toast.LENGTH_SHORT).show();
             else 
                try 
                    InputStream inputStream = context.getContentResolver().openInputStream(uri);

                    int size = inputStream.available();

                    byte[] bytes = new byte[size];

                    inputStream.read(bytes);

                    inputStream.close();

                    String jsonString = new String(bytes, StandardCharsets.UTF_8);
                    returnJsonString=jsonString;

                 catch (IOException e) 
                    Toast.makeText(context.getApplicationContext(), "Fail to read file", Toast.LENGTH_SHORT).show();
                
            

【问题讨论】:

am using content uri method to read file ???那会是什么? Uri contentUri = MediaStore.Files.getContentUri("external");字符串选择 = MediaStore.MediaColumns.RELATIVE_PATH + "=?"; String[] selectionArgs = new String[]Environment.DIRECTORY_DOCUMENTS + "/"+folderName+"/";光标 cursor =context.getContentResolver().query(contentUri, null, selection, selectionArgs, null); 【参考方案1】:

你有两个选择。

在清单中请求 MANAGE_EXTERNAL_STORAGE。

让用户选择带有ACTION_OPEN_DOCUMENT的文件。

【讨论】:

谢谢会试试!但是你能解释为什么会发生这种情况,即无法访问创建的其他应用程序 那是 Android 11+。 嗨,我正在尝试使用 Intent 请求权限,但它给了我一个错误“无法解析符号'ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION'”。实际上,我已经创建了一个单独的类名作为 FileDataBase,并将上下文传递给使用它的 Activity。所以在那堂课上,我尝试在阅读时请求许可。

以上是关于无法访问其他应用程序创建的外部存储中的文件的主要内容,如果未能解决你的问题,请参考以下文章

无法在Android上写入外部存储

从 nuxtjs 中的外部 js 文件访问存储

无法访问 API-29 中的外部存储

错误记录Android 分区存储下的 SD 卡应用专属外部存储空间目录访问 ( 需手动创建应用专属外部存储空间目录 )

错误记录Android 分区存储下的 SD 卡应用专属外部存储空间目录访问 ( 需手动创建应用专属外部存储空间目录 )

无法使用 Pyspark 访问外部 Hive 元存储