所以我一直在制作这两个应用程序,我希望应用程序 1 能够将 pdf 文件发送到应用程序 2。它们都使用不同的密钥签名,因为应用程序 1 也应该可以被任何其他应用程序使用。
我希望它的工作方式如下。应用程序 2 向应用程序 1 发送一个 startActivityForResult,其意图包括一个带有来自 App 2s 文件提供程序的文件的 Uri。然后应用程序 1 应该获取 Uri 并将 pdf 写入应用程序 2 提供的文件。然后回到应用程序 2,文件应该首先写入应用程序 2 拥有的文件。
简单地说,应用程序 2 应该提供一个应用程序 1 应该写入 pdf 的文件。
所以我已经把它全部设置好了,但是当我试图访问要写入的文件时,我收到了java.lang.SecurityException: Permission Denial: opening provider androidx.core.content.FileProvider
错误消息。
完整的错误信息:Permission Denial: opening provider androidx.core.content.FileProvider from ProcessRecord{511cc8 14209:com.eureka.documentscanner/u0a159} (pid=14209, uid=10159) that is not exported from UID 10155
复制pdf的代码:
//This method is called once the app has selected the right pdf file and wants to return back to app 2.
private void writeToSharedFile(){
Intent StartingIntent = getIntent();
//Get the shared file (the file to write to from app 2).
Uri sharedFileUri = StartingIntent.getParcelableExtra(Intent.EXTRA_STREAM);
//Get the file that I need to write into the shared file.
Uri fileToWrite = Uri.fromFile(scanResult.pdfFile);
//Write the file into the shared file.
copyPDFs(fileToWrite,sharedFileUri);
}
private void copyPDFs(Uri from, Uri to){
ParcelFileDescriptor pfdTo = null;
FileOutputStream out = null;
ParcelFileDescriptor pfdFrom = null;
FileInputStream in = null;
ContentResolver cr = context.getContentResolver();
final String WRITE_ACCESS = "w";
final String READ_ACCESS = "r";
try {
pfdTo = cr.openFileDescriptor(to, WRITE_ACCESS);
out = new FileOutputStream(pfdTo.getFileDescriptor());
pfdFrom = cr.openFileDescriptor(from, READ_ACCESS);
in = new FileInputStream(pfdFrom.getFileDescriptor());
//Reads from the input stream and writes the data to the output stream.
int n;
while ((n = in.read()) != -1) {
out.write(n);
}
} catch (SecurityException e){
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
finally {
// Let the document provider know you're done by closing the stream.
if (out != null) {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (in != null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (pfdTo != null) {
try {
pfdTo.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (pfdFrom != null) {
try {
pfdFrom.close();
} catch (IOException e) {
e.printStackTrace();
}
}
} //Close the Streams and Descriptors.
}
总是pfdTo = cr.openFileDescriptor(to, WRITE_ACCESS);
在线抛出安全异常。
我 100% 确定用于启动活动以获得结果的意图具有读写访问权限,并且在外部存储上授予了读写权限。
任何建议或帮助将不胜感激。