Java无法访问安卓根目录,android – FileProvider无法使用找不到包含的已配置根目录...

我正在尝试使用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

name="my_docs"

path="docs" />

AndroidManifest.xml中

android:name="android.support.v4.content.FileProvider"

android:authorities="${applicationId}.fileprovider"

android:exported="false"

android:grantUriPermissions="true">

android:name="android.support.FILE_PROVIDER_PATHS"

android:resource="@xml/file_paths" />

从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)

解决方法:

name="my_docs"

path="docs" />

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

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

来源: https://codeday.me/bug/20190910/1799176.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值