代码之家  ›  专栏  ›  技术社区  ›  malhobayyeb

无法使用的文件提供程序无法找到包含

  •  9
  • malhobayyeb  · 技术社区  · 7 年前

    我正在尝试使用fileprovider方式下载和共享pdf文件,供android上的其他pdf阅读器应用程序(dropbox、drive pdf reader或adobe reader)读取。

    但是,我一直得到以下异常:

    Failed to find configured root that contains /storage/emulated/0/Android/data/com.my.app/files/docs/my_file_name.pdf
    

    我先把网址发到android DownloadManager 执行下载,然后使用 BroadcastReceiver

    我的实现如下:

    文件路径.xml

    <paths>
    
        <external-files-path
            name="my_docs"
            path="docs" />
    
    </paths>
    

    androidmanifest.xml文件

    <provider
        android:name="android.support.v4.content.FileProvider"
        android:authorities="${applicationId}.fileprovider"
        android:exported="false"
        android:grantUriPermissions="true">
    
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/file_paths" />
    
    </provider>
    

    从主要活动:

    public void downloadFile(String urlString) {
        Uri uri = Uri.parse(urlString);
    
        String filename = "my_file_name.pdf";
    
        DownloadManager.Request request = new DownloadManager.Request(uri);
        request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_MOBILE | DownloadManager.Request.NETWORK_WIFI);
    
        request.setTitle("App is Downloading a File");
        request.setDescription("Downloading PDF File For App");
    
        request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
        request.setDestinationInExternalFilesDir(mContext, "docs", filename);
    
        request.allowScanningByMediaScanner();
    
        mDownloadManager.enqueue(request);
    }
    

    最后从我的自定义广播接收器:

    uriString 是从一个 cursor.getString(uriIndex) 使用 downloadManager.query(myQuery) 通常的方式。

    private void startDocumentReaderUsingFileProvider(Context context, String uriString) {
        Uri parsedUri = Uri.parse(uriString);
    
        File file = new File(parsedUri.getPath());
        String packageName = context.getApplicationContext().getPackageName();
    
        // Exception thrown from the following line.
        Uri uri = FileProvider.getUriForFile(context, packageName + ".fileprovider", file);
    
        startActivity(context, uri);
    }
    
    private void startActivity(Context context, Uri uri) {
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setDataAndType(uri, "application/pdf");
        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
    
        Intent chooser = Intent.createChooser(intent, "Display PDF Reader");
    
        context.startActivity(chooser);
    }
    

    异常堆栈跟踪:

    FATAL EXCEPTION: main
        Process: com.my.app, PID: 8972
        java.lang.RuntimeException: Error receiving broadcast Intent { act=android.intent.action.DOWNLOAD_COMPLETE flg=0x10 pkg=com.my.app bqHint=4 (has extras) } in com.my.app.FileBroadcastReceiver@82a2a7
            at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:1003)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:158)
            at android.app.ActivityThread.main(ActivityThread.java:7229)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
         Caused by: java.lang.IllegalArgumentException: Failed to find configured root that contains /storage/emulated/0/Android/data/com.my.app/files/docs/my_file_name.pdf
            at android.support.v4.content.FileProvider$SimplePathStrategy.getUriForFile(FileProvider.java:678)
            at android.support.v4.content.FileProvider.getUriForFile(FileProvider.java:377)
            at com.my.app.FileBroadcastReceiver.startDocumentReaderUsingFileProvider(FileBroadcastReceiver.java:85)
            at com.my.app.FileBroadcastReceiver.startDocumentReader(FileBroadcastReceiver.java:69)
            at com.my.app.FileBroadcastReceiver.onReceive(FileBroadcastReceiver.java:43)
            at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:993)
            at android.os.Handler.handleCallback(Handler.java:739) 
            at android.os.Handler.dispatchMessage(Handler.java:95) 
            at android.os.Looper.loop(Looper.java:158) 
            at android.app.ActivityThread.main(ActivityThread.java:7229) 
            at java.lang.reflect.Method.invoke(Native Method) 
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 
    06-07 12:56:50.981 8972-9463/com.my.app E/com.worklight.common.Logger$UncaughtExceptionHandler: Logger$UncaughtExceptionHandler.uncaughtException in Logger.java:442 :: Uncaught Exception
        java.lang.RuntimeException: Error receiving broadcast Intent { act=android.intent.action.DOWNLOAD_COMPLETE flg=0x10 pkg=com.my.app bqHint=4 (has extras) } in com.my.app.FileBroadcastReceiver@82a2a7
            at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:1003)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:158)
            at android.app.ActivityThread.main(ActivityThread.java:7229)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
         Caused by: java.lang.IllegalArgumentException: Failed to find configured root that contains /storage/emulated/0/Android/data/com.my.app/files/docs/my_file_name.pdf
            at android.support.v4.content.FileProvider$SimplePathStrategy.getUriForFile(FileProvider.java:678)
            at android.support.v4.content.FileProvider.getUriForFile(FileProvider.java:377)
            at com.my.app.FileBroadcastReceiver.startDocumentReaderUsingFileProvider(FileBroadcastReceiver.java:85)
            at com.my.app.FileBroadcastReceiver.startDocumentReader(FileBroadcastReceiver.java:69)
            at com.my.app.FileBroadcastReceiver.onReceive(FileBroadcastReceiver.java:43)
            at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:993)
            at android.os.Handler.handleCallback(Handler.java:739) 
            at android.os.Handler.dispatchMessage(Handler.java:95) 
            at android.os.Looper.loop(Looper.java:158) 
            at android.app.ActivityThread.main(ActivityThread.java:7229) 
            at java.lang.reflect.Method.invoke(Native Method) 
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   Sagar    7 年前
    <paths>
    
        <external-files-path
            name="my_docs"
            path="docs" />
    
    </paths>
    

    当您将路径指定为 docs 不包括子目录。出现异常是因为它不希望共享子目录。包括它们附加 / 最后如下:

    <paths>
    
        <external-files-path name="my_docs" path="docs/" />
    
    </paths>