実際には、ContentProviderを使用してファイルの読み取りと書き込みを行うことができます。
独自のContentProviderでこれをサポートするには、サポートされているファイルMIMEタイプをgetStreamTypes()メソッドに含める必要があります。詳細については、AndroidContentProviderチュートリアルのMIMEタイプのセクションを確認してください。
また、 openFile(Uri uri、String mode)メソッドを実装する必要があります。このメソッドでは、ContentResolverに提供されたUriに基づいてFileディレクトリと名前を実際に選択します。そのメソッドのサンプル実装は次のとおりです。
@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);
}
ここで必要なロジックを使用して、ファイルディレクトリを選択できます。このコードはアプリケーションファイルディレクトリを使用するだけですが、ビットマップキャッシュの目的では、おそらく一時キャッシュディレクトリを使用する必要があります。
最後に、ContentProviderファイルデータにアクセスするためのコードは次のようになります。
ContentResolver cr = getContext().getContentResolver();
InputStream inputStream = cr.openInputStream(uri);
または、 ContentResolver.openOutputStream(uri)を使用してファイルデータをContentProviderに書き込みます。
ビットマップキャッシングチュートリアルでは、ContentProviderをディスクキャッシュとして使用するためにかなりの変更が必要になりますが、これがそのメモが参照していたものであると私は信じています。