Android 11 未获取文件路径

Android 11 not fetching path for file

到目前为止,我一直在努力从存储中获取文件路径, 例如文件路径是 /storage/emulated/0/Download/NTL_ANDRODI_DOGMA_SYSTEMS_SRL_A_SOCIO_UNICO_TEST NEW.afgclic

在 android 11 之后无法获取文件路径。授权后

使用权限 android:name="android.permission.MANAGE_EXTERNAL_STORAGE"

它也允许 Android 11,但应用程序被 Play 商店拒绝。由于没有特定原因不能使用该权限,并且它只允许用于文件管理器或防病毒应用程序。现在的重点是其他应用程序如何设法在 Android 11 上工作以获取文件。

我一直在使用读取和写入存储权限从外部存储访问文件。需要文件来验证来自其他图书馆信息的许可证

正在等待解决问题。感谢您的帮助。

android11 引入了范围存储来处理存储。参考https://developer.android.com/about/versions/11/privacy/storage

很难回答您的问题 question.We 需要一些信息,例如您对文件所做的操作 app.What 是文件路径在您的应用程序中的用例。

  • 如果您确实需要通过文件路径访问文件,那么您可以将文件复制到您的应用程序私有目录(不适合处理大视频或其他文件)。

  • 您可以使用contentResolver打开fileDescriptor来访问文件。

  • 您可以打开 e folderSelector 意图让用户 select 一个文件夹,您可以在其中使用 DocumentFile class.

    获得对该文件夹的完全访问权限

最好的方法是用 uri 替换文件路径依赖项(如果可能)。

Here

了解有关分区存储的更多信息

Android 11 中,如果您想完全访问存储,则必须使用 Scoped Storage

如果要访问 public 目录,如 Documents,下载 etc.You 可以使用 legacyStorage.


在你的Manifest

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

<application
      android:requestLegacyExternalStorage="true" 

/>

如果您想访问完整的存储空间,您可以使用 Scoped Storage

在您的 Manifest

中添加权限
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

<uses-permission
    android:name="android.permission.MANAGE_EXTERNAL_STORAGE"
    tools:ignore="ScopedStorage" />

现在只需在您的代码中请求权限

    if (SDK_INT >= Build.VERSION_CODES.R) {
        ActivityCompat.requestPermissions(this,
                new String[]{Manifest.permission.READ_EXTERNAL_STORAGE,
                        Manifest.permission.MANAGE_EXTERNAL_STORAGE}, 1);

        if (Environment.isExternalStorageManager()) {

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

        return true;

    } else {

        if (Build.VERSION.SDK_INT >= 23) {
            if (checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE)
                    == PackageManager.PERMISSION_GRANTED) {
                Log.v("Permission", "Storage Permission is granted");
                return true;
            } else {
                Log.v("Permission", "Storage Permission is revoked");
                ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
                return false;
            }
        } else { //permission is automatically granted on sdk<23 upon installation
            Log.v("Permission", "Storage Permission is granted");
            return true;
        }
    }

在android11中,有范围存储功能来处理外部存储。 为了更好的残留文件 mgmnt 和访问 mgmnt。 这是我关注的 Philip Lackner 的播放列表: https://www.youtube.com/watch?v=TkOzcyzH1hU&list=PLQkwcJG4YTCR9jZq8O19nUL2hLqmLYX4M

我已通过从 Google 驱动器

获取路径来修复它
private static String getDriveFilePath(Uri uri, Context context) {
Uri returnUri = uri;
Cursor returnCursor = context.getContentResolver().query(returnUri, null, null, null, null);
/*
 * Get the column indexes of the data in the Cursor,
 *     * move to the first row in the Cursor, get the data,
 *     * and display it.
 * */
int nameIndex = returnCursor.getColumnIndex(OpenableColumns.DISPLAY_NAME);
int sizeIndex = returnCursor.getColumnIndex(OpenableColumns.SIZE);
returnCursor.moveToFirst();

String name = (returnCursor.getString(nameIndex));
String size = (Long.toString(returnCursor.getLong(sizeIndex)));
File file = new File(context.getCacheDir(), name);
try {
    InputStream inputStream = context.getContentResolver().openInputStream(uri);
    FileOutputStream outputStream = new FileOutputStream(file);
    int read = 0;
    int maxBufferSize = 1 * 1024 * 1024;
    int bytesAvailable = inputStream.available();

    //int bufferSize = 1024;
    int bufferSize = Math.min(bytesAvailable, maxBufferSize);

    final byte[] buffers = new byte[bufferSize];
    while ((read = inputStream.read(buffers)) != -1) {
        outputStream.write(buffers, 0, read);
    }
    Log.e("File Size", "Size " + file.length());
    inputStream.close();
    outputStream.close();
    Log.e("File Path", "Path " + file.getPath());
} catch (Exception e) {
    Log.e("Exception", e.getMessage());
}
    return file.getPath();
}     
}