我有两个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
时,它会获得异常。有什么想法吗?
答案 0 :(得分:2)
我做错了什么?
您正在尝试将FLAG_GRANT_READ_URI_PERMISSION
用于文件。这仅适用于content://
Uri
值,指向由ContentProvider
提供的流。
Use FileProvider
通过此类ContentProvider
提供您的文件。 a training guide以及here is a sample project证明了它的使用也包含了这一点。