Android Studio Android 11无法获取文件的路径

e37o9pze  于 2023-02-16  发布在  Android
关注(0)|答案(5)|浏览(929)

到目前为止,我一直在努力从存储中提取文件路径,例如文件路径是/storage/emulated/0/Download/NTL_ANDRODI_DOGMA_SYSTEMS_SRL_A_SOCIO_UNICO_TEST NEW. afglick
在android 11之后,无法获取FilePath。

uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"

它也允许Android 11,但应用程序被拒绝播放商店.因为权限不能使用没有特定的原因,它只允许文件管理器或防病毒应用程序.现在的重点是其他应用程序如何管理工作在Android 11获取文件.
我一直在使用读写存储权限从外部存储访问文件。需要文件来从其他库信息验证许可证。

afdcj2ne

afdcj2ne1#

Android 11中,如果想要完全访问存储,则必须使用Scoped Storage
如果你想访问公共目录,如文档,下载等,你可以使用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;
        }
    }
0g0grzrc

0g0grzrc2#

我已经通过从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();
}     
}
p8h8hvxi

p8h8hvxi3#

android11引入了作用域存储来处理存储,请参考https://developer.android.com/about/versions/11/privacy/storage

bvhaajcl

bvhaajcl4#

很难回答你的问题。我们需要一些信息,比如你是如何处理应用程序中的文件的。你的应用程序中文件路径的使用情况是什么。

  • 如果你真的需要通过文件路径访问文件,那么你可以将文件复制到你的应用程序私人目录(不适合处理大型视频或其他文件)。
  • 您可以使用contentResolver打开fileDescriptor以访问文件。
  • 您可以打开folderSelector Intent,让用户选择一个文件夹,在该文件夹中,您可以使用DocumentFile类获得对此文件夹的完全访问权限。

最好的方法是用uri替换文件路径依赖(如果可能的话)。
Here了解更多关于作用域存储的信息

2w2cym1i

2w2cym1i5#

在android11,有作用域存储功能来处理外部存储.为了更好的残余文件管理和访问管理.这里是菲利普Lackner的播放列表,我遵循:https://www.youtube.com/watch?v=TkOzcyzH1hU&list=PLQkwcJG4YTCR9jZq8O19nUL2hLqmLYX4M

相关问题