目前我正在使用getContentResolver().query()/managedQuery()来获取指向从相册应用程序检索图像的光标。由于我使用的API部分已过时,所以我想使用带有LoaderManager的CursorLoader。
/**
* Creates a cursor to access the content defined by the image uri for API
* version 11 and newer.
*
* @return The created cursor.
*/
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
private Cursor createCursorHoneycomb() {
String[] projection = {
MediaStore.Images.Media.DATA
};
Cursor cursor = getContentResolver().query(imageUri, projection, null, null, null);
return cursor;
}
/**
* Creates a cursor to access the content defined by the image uri from API
* version 8 to 10.
*
* @return The created cursor.
*/
@SuppressWarnings("deprecation")
@TargetApi(Build.VERSION_CODES.FROYO)
private Cursor createCursorFroyo() {
String[] projection = {
MediaStore.Images.Media.DATA
};
Cursor cursor = managedQuery(imageUri, projection, null, null, null);
return cursor;
}
由于我没有ListView,所以我不使用任何适配器。我只为ImageView设置图像位图。
/**
* Sets the image bitmap for the image view.
*/
private void setupImageView() {
String imagePath = getImagePathFromUri(imageUri);
Bitmap bitmap = BitmapFactory.decodeFile(imagePath);
ImageView imageView = (ImageView) findViewById(R.id.image_view);
imageView.setImageBitmap(bitmap);
}
/**
* Returns an image path created from the supplied image uri.
*
* @param imageUri The supplied image uri.
* @return Returns the created image path.
*/
@SuppressWarnings("deprecation")
private String getImagePathFromUri(Uri imageUri) {
Cursor cursor = null;
String imagePath = null;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
cursor = createCursorHoneycomb();
} else {
cursor = createCursorFroyo();
}
// if image is loaded from gallery
if (cursor != null) {
startManagingCursor(cursor);
int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
imagePath = cursor.getString(columnIndex);
}
// if image is loaded from file manager
else {
imagePath = imageUri.getPath();
}
return imagePath;
}
可以使用CursorLoader和LoaderManager从相册应用或文件管理器中加载图像吗?我找不到任何解决方案。
getLoaderManager().initLoader(<id>, <args>, <callback>)
来启动加载器,通常是getLoaderManager().initLoader(0, null, this)
。 - Marcus Husar