我有一个activity/intent启动器,用户可以从外部存储中选择一个目录。选择文件夹后,uri路径存储在共享引用中,文件夹名称显示在文本视图中:
ActivityResultLauncher<Intent> actResLauncher;
actResLauncher = registerForActivityResult( new ActivityResultContracts.StartActivityForResult(),this);
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
actResLauncher.launch(intent);
@Override
public void onActivityResult(ActivityResult result) {
int resultCode = result.getResultCode();
Intent resultIntent = result.getData();
if (resultCode == Activity.RESULT_OK && resultIntent != null) {
Uri uri = resultIntent.getData();
//Safe Uri "path" to shared preference
SharedPreferences.Editor editor = getContext().getSharedPreferences(AppConstants.BACKUP, MODE_PRIVATE).edit();
editor.putString(AppConstants.AUTOMATIC_BACKUP_FOLDER, uri.toString());
editor.commit();
//Display Folderdame on textview
DocumentFile documentFile = DocumentFile.fromTreeUri(getContext(), uri);
automaticBackupFolder.setText(documentFile.getName());
)
}
这就像魅力一样,可以从共享首选项文件夹中恢复Uri:
SharedPreferences prefs = getContext().getSharedPreferences(AppConstants.BACKUP, MODE_PRIVATE);
DocumentFile sourceFile = DocumentFile.fromSingleUri(getContext(), Uri.parse(prefs.getString(AppConstants.AUTOMATIC_BACKUP_FOLDER)));
automaticBackupFolder.setText(sourceFile.getName()); //Throws UnsupportedOperationException: Unsupported Uri content exception
使用DocumentFile
对象,我可以获得父文件,检查文件夹是否存在等,这非常有效。然而,问题是,当重新创建片段时(例如,通过旋转手机(,函数getPath()
抛出以下异常:UnsupportedOperationException: Unsupported Uri content
在onActivityResult函数中显示文件夹名称时不会出现此错误,当Uri存储在Shared Preferences Folder中时会出现此错误AND碎片会再次创建(例如旋转电话(
问题可能是什么?是不是在重新创建片段后,应用程序失去了查看文件夹名称的权限?
在onActivityResult()
中,当您获得Uri
时,在ContentResolver
上调用takePersistableUriPermission()
,传入您的Uri
。否则,您对内容的访问仅限于获得Uri
的任何活动实例,并且在流程终止时完全消失。