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();
}
}
到目前为止,我一直在努力从存储中获取文件路径, 例如文件路径是 /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();
}
}