我正在尝试将我选择的 uri 发送到另一个应用程序(通过 Intent putExtra),但是,由于某种原因,我只能在原始应用程序(启动文件选择器对话框的应用程序)中访问 uri 文档树,而不能在“接收器”应用程序上。
这是第一个应用程序代码:
private void showFileChooser() {
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.addCategory(Intent.CATEGORY_DEFAULT);
try {
startActivityForResult(
Intent.createChooser(intent, "Select a Directory"),
FILE_SELECT_CODE);
} catch (android.content.ActivityNotFoundException ex) {
// Potentially direct the user to the Market with a Dialog
Toast.makeText(this, "Please install a File Manager.", Toast.LENGTH_SHORT).show();
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case FILE_SELECT_CODE:
if (resultCode == RESULT_OK) {
Uri uri = data.getData();
Intent intent = new Intent();
intent.setComponent(new ComponentName("com.tiferet.update", "com.tiferet.update.MainActivity"));
intent.setData(uri);
startActivity(intent);
}
break;
}
super.onActivityResult(requestCode, resultCode, data);
}
这是第二个应用程序(接收意图)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
HandleBundle();
}
private void HandleBundle() {
Intent intent = getIntent();
Uri uri=getIntent().getData();
// Check if the bundle is not null
if (uri != null) {
ProcessMe(uri);
} else {
// Handle the case where the bundle is null
Log.d("itapimu", "uri is null.");
}
}
public void ProcessMe(Uri uri) {
Uri childrenUri = DocumentsContract.buildChildDocumentsUriUsingTree(
uri,
DocumentsContract.getTreeDocumentId(uri)
);
// get document file from children uri
DocumentFile tree = DocumentFile.fromTreeUri(this, childrenUri);
// get the list of the documents
DocumentFile[] documents = tree.listFiles();
Toast.makeText(this, String.valueOf(documents.length), Toast.LENGTH_SHORT).show();// is 0!!
if (documents != null) {
for (DocumentFile doc : documents) { //doesn't event enter that loop
Log.w("itapiIkosher" , doc.getName());
}
}
}
现在我验证接收到的 Uri 是否有效,并且它的路径良好,一切都正确...但是,我仍然无法访问文件夹文档...
documents
长度为0,它甚至没有进入for
循环..(当我在第一个应用程序上实现ProcessMe
方法时,它就像魅力一样......)
对于您或用户来说,很少拥有多个应用程序是正确的答案。
也就是说,您需要转发权限:
Uri uri = data.getData();
Intent intent = new Intent();
intent.setComponent(new ComponentName("com.tiferet.update", "com.tiferet.update.MainActivity"));
intent.setData(uri);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
startActivity(intent);
请参阅我的这篇博文了解更多信息。
相反,您可以从
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
中删除同一行 (showFileChooser()
)。