1

所以我一直在制作这两个应用程序,我希望应用程序 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% 确定用于启动活动以获得结果的意图具有读写访问权限,并且在外部存储上授予了读写权限。

任何建议或帮助将不胜感激。

4

0 回答 0