0

我有两个 android 应用程序 A 和 B。我正在将一个文件从应用程序 A 传递到应用程序 B,我看到应用程序 B 正在获取 URI。我FLAG_GRANT_READ_URI_PERMISSION在应用程序 A 中设置标志,我看到这mFlags是一个 1,它是FLAG_GRANT_READ_URI_PERMISSION来自应用程序 B 的值。这一切都很好,但是当我尝试FileInputStream从 URI 创建一个时,我得到一个FileNotFoundException (Permission denied)异常。我究竟做错了什么?

以下是相关的代码片段:

在应用程序 A 中:

public void openTest Intent(String filePath) {
    Intent testIntent = new Intent("com.example.appB.TEST");
    testIntent.addCategory(Intent.CATEGORY_DEFAULT);
    testIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
    testIntent.setDataAndType(Uri.parse("file://"+filePath),"text/plain");
    try {
        startActivityForResult(testIntent, OPEN_NEW_TERM);      
    } catch (ActivityNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

在应用 B 中:

@Override 
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    if (intent.getAction().equals("com.example.appB.TEST")) {
        Uri fileUri = intent.getData();
        File srcFile = new File(fileUri.getPath());
        File destFolder = getFilesDir();
        File destFile = new File(destFolder.getAbsolutePath()+srcFile.getName());
        try {
            copyFile(srcFile,destFile);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

public void copyFile(File src, File dst) throws IOException {
    InputStream in = new FileInputStream(src);  //**this is where it dies**
    OutputStream out = new FileOutputStream(dst);

    // Transfer bytes from in to out
    byte[] buf = new byte[1024];
    int len;
    while ((len = in.read(buf)) > 0) {
        out.write(buf, 0, len);
    }
    in.close();
    out.close();
}

正是当我创建它时in,它才会出现异常。关于为什么的任何想法?

4

1 回答 1

2

我究竟做错了什么?

您正在尝试使用FLAG_GRANT_READ_URI_PERMISSION文件。这仅适用于content:// Uri值,指向由 a 服务的流ContentProvider

Use FileProvider to serve up your files via such a ContentProvider. This is also covered in a training guide, and here is a sample project demonstrating its use.

于 2014-08-20T23:59:58.033 回答