尽管设置了FLAG_GRANT_READ_URI_PERMISSION,但在使用URI时获取权限被拒绝

时间:2014-08-20 23:21:55

标签: android uri android-sharing

我有两个Android应用程序A和B.我正在将应用程序A中的文件传递给应用程序B,我看到应用程序B正在获取URI。我在应用A中设置FLAG_GRANT_READ_URI_PERMISSION标记,我看到mFlags是一个1,这是FLAG_GRANT_READ_URI_PERMISSION的值,来自应用B内。这一切都很好,但是当我尝试从URI创建FileInputStream时,我得到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时,它会获得异常。有什么想法吗?

1 个答案:

答案 0 :(得分:2)

  

我做错了什么?

您正在尝试将FLAG_GRANT_READ_URI_PERMISSION用于文件。这仅适用于content:// Uri值,指向由ContentProvider提供的流。

Use FileProvider通过此类ContentProvider提供您的文件。 a training guide以及here is a sample project证明了它的使用也包含了这一点。