gpt4 book ai didi

android - 使用 FileProvider 在 Android N 上打开下载的文件

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:57:43 30 4
gpt4 key购买 nike

由于 FileProvider 的变化,我必须修复我们的 Android N 应用程序。我基本上已经阅读了最后一个主题的所有内容,但没有找到适合我的解决方案。

这是我们之前的代码,它开始从我们的应用程序下载,将它们存储在 Download 文件夹中,并在 DownloadManager 告诉他已完成下载:

BroadcastReceiver onComplete = new BroadcastReceiver() {
public void onReceive(Context ctxt, Intent intent) {
Log.d(TAG, "Download commplete");

// Check for our download
long referenceId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);
if (mDownloadReference == referenceId) {
DownloadManager.Query query = new DownloadManager.Query();
query.setFilterById(mDownloadReference);
Cursor c = mDownloadManager.query(query);
if (c.moveToFirst()) {
int columnIndex = c.getColumnIndex(DownloadManager.COLUMN_STATUS);
if (DownloadManager.STATUS_SUCCESSFUL == c.getInt(columnIndex)) {
String localUri = c.getString(c.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI));
String fileExtension = MimeTypeMap.getFileExtensionFromUrl(localUri);
String mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(fileExtension);

if (mimeType != null) {
Intent openFileIntent = new Intent(Intent.ACTION_VIEW);
openFileIntent.setDataAndTypeAndNormalize(Uri.parse(localUri), mimeType);
openFileIntent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);

try {
mAcme.startActivity(openFileIntent);
}
catch (ActivityNotFoundException e) {
// Ignore if no activity was found.
}
}
}
}
}
}
};

这适用于 Android M,但由于流行的 FileUriExposedException 而在 N 上中断。我现在尝试使用 FileProvider 来解决这个问题,但我无法让它工作。当我尝试获取内容 URI 时出现问题:

无法找到包含/file:/storage/emulated/0/Download/test.pdf 的已配置根目录

从文件的 DownloadManager 返回的 localUri 是:

file:///storage/emulated/0/Download/test.pdf

Environment.getExternalStorageDirectory() 返回 /storage/emulated/0,这是转换代码:

File file = new File(localUri);
Log.d(TAG, localUri + " - " + Environment.getExternalStorageDirectory());
Uri contentUri = FileProvider.getUriForFile(ctxt, "my.file.provider", file);

来自 AndroidManifest.xml

    <provider
android:name="android.support.v4.content.FileProvider"
android:authorities="my.file.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths"/>
</provider>

file_paths.xml:

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="external_path" path="." />
</paths>

而且我已经尝试了我可以在该 xml 文件中找到的所有值。 :(

最佳答案

感谢@greenaps,我能够解决这个问题。从 DownlodManager 检索到的本地 URI 以 file:// 为前缀。对于新的 FileProvider 必须删除它:

if (localUri.substring(0, 7).matches("file://")) {
localUri = localUri.substring(7);
}
File file = new File(localUri);

关于android - 使用 FileProvider 在 Android N 上打开下载的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39996491/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com