11

は、この絵のようにシナリオを検討して間違ったサムネイルの代わりにNULLを返します。MediaStore.Images.Thumbnails.getThumbnailは

Native Galery

写真3枚を、そのうちの一つは、大規模なGIFファイル(3MP)です。

私は、対応するサムネイルを取得するためにMediaStoreに問い合わせています。

MediaStore.Images.Media.DATE_ADDED + " DESC"" 

何が起こる:

DESC

期待される動作:メディアストアを取得することはできませんメディアストアが以前の取得に成功したサムネイルを返します。私はこのはsortOrderとCursorLoader経由でカーソルを初期化した場合何らかの理由で指定されたイメージのサムネイルがそのJavadocの通りNULLを返さなければならない:"...ビットマップインスタンスを返します。 origIdで目に見えていないか、メモリで十分ではありません。私はこれはsortOrderでカーソルを初期化する場合は

は:

MediaStore.Images.Media.DATE_ADDED + " ASC"" 

それはうまく動作します:要件は示すことがあるため

ASC

しかし、私は単純にはsortOrderを変更することはできません最新の写真が最初に表示されます。

私のサンプルコードはhere is the complete sample projectthe 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.(そのスレッド上の最後のコメント)であるようです。

+0

取得した画像ごとに 'mOrigId'を表示します。画像2と3で同じにすることもできます。また、データを上書きする4番目の画像があります。このようなエラーの原因になるいくつかの理由がコードにあります。特にASC/DESC問合せでイメージIDを取得してから、無関係な2番目の問合せでイメージを解決してください。 – zapl

+0

こんにちは! 2番目の写真(私の2番目のリンク - http://cl.ly/image/2U0z1Z2b1m1v)では、私は写真の上にIDを入れました。彼らは異なっています:7858、7854、7851. "特にASC/DESCクエリでイメージIDを取得してから、無関係な2番目のクエリでイメージを解決しています。 ありがとうございます。 –

+1

私は小さなASC/DESCの例(私にはうまくいく)をハッキングしました(4.0.3エミュレータ)。 https://www.dropbox.com/s/in048v3fh3xae2m/AscDescGallery.zip - 「特に...」は、最初のステップでmediastoreの画像リストを照会します。 ASCまたはDESCのいずれか。次に、MediaStoreにサムネイルを要求します。これは、IDの取得方法を知らない/気にしない独立したクエリです。したがって、最初のクエリの順序を変更すると、正しいIDを使用している限り、Thumbnails.getThumbnailの結果に影響はありません。 – zapl

答えて

0

を、それがこの問題と思われますis fixed in Lollipop 。 (そのスレッドの最後のコメント)。
私は自分の質問に答えています。

2

私は「ちょうどあなたがMICRO_KINDを求めるときに、OSが再び同じ画像を生成DESCカーソル上の行の次なる新しいイメージを作成しています。ここで推測し。周り

一つの仕事はArrayListのをロードすることです。画像IDのためにその後のArrayListから作業サムネイル後に行くことに

可能性がMINI_KINDとbmoptions.inSampleSize = 2使用してコードを試してみてください;。3年後

final BitmapFactory.Options bmOptions = new BitmapFactory.Options(); 
      bmOptions.inSampleSize =2; 



        Bitmap bm = MediaStore.Images.Thumbnails.getThumbnail(
          context.getContentResolver(), newImageId, 
          MediaStore.Images.Thumbnails.MINI_KIND, 
          bmOptions); 
関連する問題