我想读取Android/数据,这样我就可以提取文档用于备份。安卓11有禁止/限制这一点的变化,但这仍然可能吗?我不想使用遗留方法(如果可能的话(。
根据这一点,管理存储设备上的所有文件,谈论MANAGE_EXTERNAL_STORAGE
权限,谷歌似乎声称这现在应该是不可能的(至少用这种方法(:
被授予此权限的应用程序仍然无法访问属于其他应用程序的应用程序特定目录,因为这些目录在存储卷上显示为Android/data/的子目录。
https://developer.android.com/training/data-storage/manage-all-fileshttps://developer.android.com/about/versions/11/privacy/storage#other-应用程序数据
这里存储#其他应用程序数据谷歌还表示,应用程序无法再访问其他应用程序安卓/数据
访问外部存储上的应用程序特定目录在Android 11上,应用程序无法再访问外部存储中任何其他应用程序专用、特定于应用程序的目录中的文件。
stackoveflow Thoryia向我们展示了如何申请许可。
但是,我们可以使用它(或任何其他方法(读取那些被禁止的其他应用程序数据文件夹,Android/data/*吗?
安卓应用程序"Total Commander"(在安卓11上(做到了这一点,它似乎正在使用StorageAccessFramework IntentIntent.ACTION_OPEN_DOCUMENT_TREE
来访问文件(这是根据弹出的gui进行的猜测(,但我也不知道如何实现这一点。其可能的Total Commander使用传统方法。
Pr请求我在OneDrive上有Total Comander(TC(的截图。
我强烈怀疑TC只是使用了target-29访问方法,我在这里找到了它的权限列表,但找不到它的目标版本:Aptoide:TC v3.21
您的问题与您询问时的解决方案相同
"How can i let ACTION_OPEN_DOCUMENT_TREE open in a predifined directory?".
好吧,我已经有了一个解决方案。
尝试过DCIM和Android等,但从未尝试过Android/data。
但这也行得通!
您不能将它与经典的文件方式一起使用,而只能与Storage Access Framework一起使用。
我们将手动从StorageManager获得INITIAL_URI。。getPrimaryStorageVolume((.createOpenDocumentTreeContent((。
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.Q)
{
StorageManager sm = (StorageManager) context.getSystemService(Context.STORAGE_SERVICE);
Intent intent = sm.getPrimaryStorageVolume().createOpenDocumentTreeIntent();
//String startDir = "Android";
//String startDir = "Download"; // Not choosable on an Android 11 device
//String startDir = "DCIM";
//String startDir = "DCIM/Camera"; // replace "/", "%2F"
//String startDir = "DCIM%2FCamera";
// String startDir = "Documents";
String startDir = "Android/data";
Uri uri = intent.getParcelableExtra("android.provider.extra.INITIAL_URI");
String scheme = uri.toString();
Log.d(TAG, "INITIAL_URI scheme: " + scheme);
scheme = scheme.replace("/root/", "/document/");
startDir = startDir.replace("/", "%2F");
scheme += "%3A" + startDir;
uri = Uri.parse(scheme);
intent.putExtra("android.provider.extra.INITIAL_URI", uri);
Log.d(TAG, "uri: " + uri.toString());
((Activity) context).startActivityForResult(intent, REQUEST_ACTION_OPEN_DOCUMENT_TREE);
return;
}