我有一些需要存儲在內容提供者中的大文件(圖片和視頻)。 Android的文件表明...如何在android內容提供者中存儲大塊?
如果你露出那 太大,放在表本身字節數據 - 如大的位圖文件 - 在 場暴露的數據給客戶 應實際上包含一個內容:URI 字符串。這是允許 客戶端訪問數據文件的字段。 記錄還應該有另一個字段,名爲「_data」的 ,該字段在該設備上列出該文件的確切文件路徑 。 此字段不打算由客戶端讀取 ,而是由 ContentResolver讀取。客戶將撥打 ContentResolver.openInputStream() 面向用戶的字段,該字段爲該項目保存URI 。該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 /基/核心/ JAVA /安卓/空間/ 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;
}
糟糕!我通過編輯原始文本而不是發佈答案來回答我自己的問題,即「如何在Android內容提供商中存儲大型斑點」。在任何情況下,簡短的回答是你使用openFile和朋友描述的方式。 – phreed 2010-11-13 20:18:22