gpt4 book ai didi

android - 使用 ACTION_VIEW 打开缓存目录中的文件

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:17:42 27 4
gpt4 key购买 nike

我一直在寻找这个,但我无法让它正常工作。让我解释一下。

我有一个 android 应用程序,它在缓存目录中保存文件 (图像、文档、...)。起初我使用 getExternalCacheDir() 方法并将它们保存在那里但是因为它应该缓存在没有 SD 卡的设备上,所以我必须使用 getCacheDir().

当我使用 getExternalCacheDir() 方法时,在另一个应用程序中打开这些文件是没有问题的:

Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(file), mimetype);

但是当使用 getCacheDir() 时,这些文件保存在应用程序沙箱中并且无法从应用程序外部访问。所以我用谷歌搜索并找到了**ContentProvider。 ContentProvider 使使用外部应用程序打开私有(private)文件成为可能。但是当我尝试实现它时,它不起作用。

由于这篇文章,我尝试实现了 ContentProvider:How to open private files saved to the internal storage using Intent.ACTION_VIEW?但没有成功。

package com.myapplication.providers;

import java.io.File;
import java.io.FileNotFoundException;

import android.content.ContentProvider;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.os.ParcelFileDescriptor;

public class FileProvider extends ContentProvider {

@Override
public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException {
File privateFile = new File(getContext().getCacheDir(), uri.getPath());
return ParcelFileDescriptor.open(privateFile, ParcelFileDescriptor.MODE_READ_ONLY);
}

@Override
public int delete(Uri arg0, String arg1, String[] arg2) {
return 0;
}

@Override
public String getType(Uri arg0) {
return null;
}

@Override
public Uri insert(Uri arg0, ContentValues arg1) {
return null;
}

@Override
public boolean onCreate() {
return false;
}

@Override
public Cursor query(Uri arg0, String[] arg1, String arg2, String[] arg3,
String arg4) {
return null;
}

@Override
public int update(Uri arg0, ContentValues arg1, String arg2, String[] arg3) {
return 0;
}
}

将此提供程序添加到应用程序 list

<provider
android:name="com.myapplication.providers.FileProvider"
android:authorities="com.myapplication"
android:exported="true" />

并使用此代码打开文件:

Uri uri = Uri.parse("content://com.myapplication/" + filename);

Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setDataAndType(uri, mimetype);

提前致谢!

最佳答案

我发现我必须以不同的方式做事。

v4 支持库提供了一个可以使用的 FileProvider 类,而不是创建我自己的 ContentProvider。

AndroidManifest.xml中添加

<application ...>

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

</application>

FILE_PROVIDER_PATHS 是一个 xml 文件,描述了哪些文件可以被其他应用程序读取。

所以我在res/xml文件夹下添加了一个file_paths.xml文件。

<paths xmlns:android="http://schemas.android.com/apk/res/android">
<cache-path name="my_cache" path="." />
</paths>

然后您唯一需要做的就是创建并启动显示文件的 Intent 。

File file = new File(getCacheDir(), "test.pdf");

Uri uri = FileProvider.getUriForFile(context, "be.myapplication", file);

Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.setDataAndType(uri, "application/pdf");

startActivity(intent);

实际上就是这样。

IMPORTANT: Please do not forget setting FLAG_GRANT_READ_URI_PERMISSION flags for the intent. Otherwise it will not work.

关于android - 使用 ACTION_VIEW 打开缓存目录中的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23830157/

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