我已经搜索这个有一段时间了,但我无法使其正常工作。让我解释。
我有一个保存文件的 Android 应用程序(图像、文档……)在缓存目录中。起初我曾经getExternalCacheDir()
方法并将它们保存在那里,但因为它应该缓存在没有 SD 卡的设备上,所以我必须使用getCacheDir()
.
当我以前getExternalCacheDir()
方法,在另一个应用程序中打开这些文件是没有问题的,如下所示:
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(file), mimetype);
但当使用getCacheDir()
,这些文件保存在应用程序沙箱中,无法从应用程序外部访问。所以我谷歌搜索它并来到 **ContentProvider。 ContentProvider 使得使用外部应用程序打开私有文件成为可能。但当我尝试实现它时,它不起作用。
由于这篇文章,我尝试实现 ContentProvider:如何使用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;
}
}
将此提供程序添加到应用程序清单中
<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);
提前致谢!