从另一个上下文访问uri

问题描述 投票:0回答:1

我正在尝试将我选择的 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
方法时,它就像魅力一样......)

java android permissions storage
1个回答
0
投票

对于您或用户来说,很少拥有多个应用程序是正确的答案。

也就是说,您需要转发权限:

                    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()
)。

© www.soinside.com 2019 - 2024. All rights reserved.