ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

android – FileProvider无法使用找不到包含的已配置根目录

2019-09-10 14:24:19  阅读:852  来源: 互联网

标签:android android-fileprovider android-download-manager


我正在尝试使用FileProvider方式在Android上轻松下载和共享PDF文件以供其他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

我首先将URL发送到Android DownloadManager以执行下载,然后使用BroadcastReceiver接收结果

我的实施如下:

file_paths.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>

从MainActivity:

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);
}

最后来自我的自定义BroadcastReceiver:

uriString是使用downloadManager.query(myQuery)通常的方式从cursor.getString(uriIndex)获取的.

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) 

解决方法:

<paths>

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

</paths>

将路径指定为docs时,不包含子目录.您得到异常,因为它不期望共享子目录.要包含它们/最后添加/如下:

<paths>

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

</paths>

标签:android,android-fileprovider,android-download-manager
来源: https://codeday.me/bug/20190910/1799176.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有