コンテンツ プロバイダーに保存する必要がある大きなファイル (画像とビデオ) がいくつかあります。アンドロイドのドキュメントは示しています...
テーブル自体に入れるには大きすぎるバイト データ (大きなビットマップ ファイルなど) を公開している場合、データをクライアントに公開するフィールドには、実際には content: URI 文字列が含まれている必要があります。これは、クライアントがデータ ファイルにアクセスできるようにするフィールドです。レコードには、そのファイルのデバイス上の正確なファイル パスをリストする「_data」という名前の別のフィールドも必要です。このフィールドは、クライアントによる読み取りではなく、ContentResolver による読み取りを意図しています。クライアントは、アイテムの URI を保持するユーザー向けフィールドで ContentResolver.openInputStream() を呼び出します。ContentResolver はそのレコードの「_data」フィールドを要求し、クライアントよりも高い権限を持っているため、そのファイルに直接アクセスして、ファイルの読み取りラッパーをクライアントに返すことができるはずです。-- http://developer.android.com/guide/topics/providers/content-providers.html#creating
例を見つけるのに苦労しています。特に、ImageView のコンテキストでビットマップを使用したいと考えています。次のコードの準コードを検討してください(機能しません)...
ImageView iv = ....
String iconUri = cursor.getString(cursor.getColumnIndex(Table.ICON));
iv.setImageURI(Uri.parse(iconUri));
観察/問題...
- 保存/回復されたURIを正しく再構築するにはどうすればよいですか? (表中のテキストです)
setImageURI 実装はコンテンツ解決 openInputStream を利用するため、これは機能するはずです。
String scheme = mUri.getScheme(); ... } else if (ContentResolver.SCHEME_CONTENT.equals(scheme) || ContentResolver.SCHEME_FILE.equals(scheme)) { try { d = Drawable.createFromStream( mContext.getContentResolver().openInputStream(mUri), null);
--frameworks/base/core/java/android/widget/ImageView.java
私はそれを働かせました。MediaStore と MediaProvider からヒントを得ました。データを含むファイルには、コンテンツ プロバイダー (ディレクトリ)、列名、行 ID、およびメディア タイプに基づいて名前が付けられます。コンテンツ リゾルバーは、次のようにファイル記述子を取得します...
Uri iconUri = Uri.withAppendedPath(Table.getUri(cursor), Table.ICON);
ib.setImageURI(iconUri);
...そして、コンテンツ プロバイダーは親切に対応します...
@Override
public ParcelFileDescriptor openFile (Uri uri, String mode) {
int imode = 0;
if (mode.contains("w")) imode |= ParcelFileDescriptor.MODE_WRITE_ONLY;
if (mode.contains("r")) imode |= ParcelFileDescriptor.MODE_READ_ONLY;
if (mode.contains("+")) imode |= ParcelFileDescriptor.MODE_APPEND;
List<String> pseg = uri.getPathSegments();
if (pseg.size() < 3) return null;
try {
File filePath = filePathFromRecord(pseg.get(2), pseg.get(1));
return ParcelFileDescriptor.open(filePath, imode);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
return null;
}