は、この絵のようにシナリオを検討して間違ったサムネイルの代わりにNULLを返します。MediaStore.Images.Thumbnails.getThumbnailは
写真3枚を、そのうちの一つは、大規模なGIFファイル(3MP)です。
私は、対応するサムネイルを取得するためにMediaStoreに問い合わせています。
MediaStore.Images.Media.DATE_ADDED + " DESC""
何が起こる:
期待される動作:メディアストアを取得することはできませんメディアストアが以前の取得に成功したサムネイルを返します。私はこのはsortOrderとCursorLoader経由でカーソルを初期化した場合何らかの理由で指定されたイメージのサムネイルがそのJavadocの通りNULLを返さなければならない:"...ビットマップインスタンスを返します。 origIdで目に見えていないか、メモリで十分ではありません。私はこれはsortOrderでカーソルを初期化する場合は
は:
MediaStore.Images.Media.DATE_ADDED + " ASC""
それはうまく動作します:要件は示すことがあるため
がしかし、私は単純にはsortOrderを変更することはできません最新の写真が最初に表示されます。
私のサンプルコードはhere is the complete sample projectとthe three images used to reproduceです。
package com.example.getimagefrommediastore;
import android.app.Activity;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.provider.MediaStore;
import android.support.v4.content.CursorLoader;
import android.widget.ImageView;
import android.widget.TextView;
public class GetThumbnailsFromMediaStoreSampleActivity extends Activity {
TextView mThumb_id_01;
TextView mThumb_id_02;
TextView mThumb_id_03;
ImageView mImg_01;
ImageView mImg_02;
ImageView mImg_03;
boolean isThumb01 = true; // Simple flag to control this example
boolean isThumb02 = true;
Cursor mCursorLoader;
int mColumnIndex;
long mOrigId; // Original image id associated with thumbnail of interest
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Just initializing views
mThumb_id_01 = (TextView) findViewById(R.id.thumb_id_01);
mThumb_id_02 = (TextView) findViewById(R.id.thumb_id_02);
mThumb_id_03 = (TextView) findViewById(R.id.thumb_id_03);
mImg_01 = (ImageView) findViewById(R.id.thumb_01);
mImg_02 = (ImageView) findViewById(R.id.thumb_02);
mImg_03 = (ImageView) findViewById(R.id.thumb_03);
// Initializing CursorLoader
mCursorLoader = initializeCursorLoader();
mColumnIndex = mCursorLoader.getColumnIndex(MediaStore.Images.Media._ID);
// Go thru all the images in the device (EXTERNAL_CONTENT_URI)
// In this example there are only three images
for (int i = 0; i < mCursorLoader.getCount(); i++) {
mCursorLoader.moveToPosition(i);
mOrigId = mCursorLoader.getInt(mColumnIndex);
// Update views
chooseViewToUpdate();
}
}
private Cursor initializeCursorLoader() {
String[] COLUMNS = {
MediaStore.Images.Thumbnails._ID, MediaStore.Images.Media.DATA
};
CursorLoader cursorLoader = new CursorLoader(
GetThumbnailsFromMediaStoreSampleActivity.this, // Context
MediaStore.Images.Media.EXTERNAL_CONTENT_URI, // Uri
COLUMNS, // Projection
null, // Selection
null, // Selection Args
// Sort Order: DESC = newest first
// Sort Order: ASC = oldest first
MediaStore.Images.Media.DATE_ADDED + " DESC");
// *** NOTE ***
// With:
//
// MediaStore.Images.Media.DATE_ADDED + " ASC"
//
// It runs just fine (MediaStore returns 'null' for invalid thumbnails)
// The problem seems to reside on the " DESC" tag.
//
// How bizarre is that?
return cursorLoader.loadInBackground();
}
private void chooseViewToUpdate() {
if (isThumb01) {
updateUI(mThumb_id_01, mImg_01);
isThumb01 = false;
} else if (isThumb02) {
updateUI(mThumb_id_02, mImg_02);
isThumb02 = false;
} else {
updateUI(mThumb_id_03, mImg_03);
}
}
private void updateUI(TextView textView, ImageView imgView) {
textView.setText("ID:" + String.valueOf(mOrigId));
Bitmap mediaStoreThumbmail = MediaStore.Images.Thumbnails.getThumbnail(
this.getContentResolver(),
mOrigId,
MediaStore.Images.Thumbnails.MICRO_KIND, null);
if (mediaStoreThumbmail != null) {
imgView.setImageBitmap(mediaStoreThumbmail);
}
}
何か不足していますか?誰かが間違っているかもしれない考えを持っていますか?
I filled a bug against Android anyway。
EDIT
この問題はfixed in Lollipop.(そのスレッド上の最後のコメント)であるようです。
取得した画像ごとに 'mOrigId'を表示します。画像2と3で同じにすることもできます。また、データを上書きする4番目の画像があります。このようなエラーの原因になるいくつかの理由がコードにあります。特にASC/DESC問合せでイメージIDを取得してから、無関係な2番目の問合せでイメージを解決してください。 – zapl
こんにちは! 2番目の写真(私の2番目のリンク - http://cl.ly/image/2U0z1Z2b1m1v)では、私は写真の上にIDを入れました。彼らは異なっています:7858、7854、7851. "特にASC/DESCクエリでイメージIDを取得してから、無関係な2番目のクエリでイメージを解決しています。 ありがとうございます。 –
私は小さなASC/DESCの例(私にはうまくいく)をハッキングしました(4.0.3エミュレータ)。 https://www.dropbox.com/s/in048v3fh3xae2m/AscDescGallery.zip - 「特に...」は、最初のステップでmediastoreの画像リストを照会します。 ASCまたはDESCのいずれか。次に、MediaStoreにサムネイルを要求します。これは、IDの取得方法を知らない/気にしない独立したクエリです。したがって、最初のクエリの順序を変更すると、正しいIDを使用している限り、Thumbnails.getThumbnailの結果に影響はありません。 – zapl