你怎么理解这个笔记
Note: A ContentProvider might be a more appropriate place to store
cached images if they are accessed more frequently,for example in an
image gallery application.
在这篇培训文章https://developer.android.com/training/displaying-bitmaps/cache-bitmap.html中?由于我无法从Cursor获取Bitmap或File,我如何通过ContentProvider缓存位图?
要在您自己的ContentProvider中支持此功能,您必须在getStreamTypes()方法中包含支持的文件MIME类型.检查Android ContentProvider tutorial here for more info的MIME类型部分.
您还需要实现openFile(Uri uri,String mode) method,您可以根据提供给ContentResolver的Uri实际选择文件目录和名称.以下是该方法的示例实现:
@Override
public ParcelFileDescriptor openFile(Uri uri,String mode) throws FileNotFoundException {
File root = getContext().getFilesDir();
File path = new File(root,uri.getEncodedPath());
path.mkdirs();
File file = new File(path,"file_"+uri.getLastPathSegment());
int imode = 0;
if (mode.contains("w")) {
imode |= ParcelFileDescriptor.MODE_WRITE_ONLY;
if (!file.exists()) {
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
}
if (mode.contains("r"))
imode |= ParcelFileDescriptor.MODE_READ_ONLY;
if (mode.contains("+"))
imode |= ParcelFileDescriptor.MODE_APPEND;
return ParcelFileDescriptor.open(file,imode);
}
您可以使用此处的任何逻辑来选择文件目录.此代码只使用应用程序文件目录,但出于Bitmap缓存的目的,这应该使用临时缓存目录.
最后,访问ContentProvider文件数据的代码应如下所示:
ContentResolver cr = getContext().getContentResolver();
InputStream inputStream = cr.openInputStream(uri);
或者,您可以使用ContentResolver.openOutputStream(uri)将文件数据写入ContentProvider.
Bitmap缓存教程需要进行相当多的修改才能将ContentProvider用作磁盘缓存,但我确实认为这是该笔记所指的内容.