2012-11-30 20 views
11

इस चित्र में के रूप में परिदृश्य पर विचार करें:MediaStore.Images.Thumbnails.getThumbnail गलत बजाय थंबनेल NULL भेजता है

Native Galery

तीन फोटो, उनमें से एक एक बड़ी GIF फ़ाइल (3MP) है।

मैं आदेश संवाददाता थंबनेल पुनः प्राप्त करने में Mediastore क्वेरी करने कर रहा हूँ।

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

क्या होता है:: Mediastore रिटर्न पिछले सफलतापूर्वक लिया गया थंबनेल:

DESC

अपेक्षित व्यवहार: जब Mediastore प्राप्त नहीं कर सकता मैं इस sortOrder साथ CursorLoader के माध्यम से कर्सर को प्रारंभ करते हैं किसी दिए गए चित्र के थंबनेल को किसी कारण से इसे वापस लौटना होगा, इसके जावाडोक के अनुसार: "... एक बिटमैप उदाहरण देता है। मूल छवि गधा अगर यह शून्य हो सकता है origId के साथ ociated मौजूद नहीं है या स्मृति पर्याप्त नहीं है। "

यदि मैं यह sortOrder साथ कर्सर को प्रारंभ:

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

यह ठीक चलाता है:

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

संपादित

ऐसा लगता है कि इस मुद्दे fixed in Lollipop. है (कि धागे पर अंतिम टिप्पणी)।

+0

आपको प्राप्त होने वाली प्रत्येक छवि के लिए 'mOrigId' प्रिंट करें, यह छवि 2 और 3 के लिए समान हो सकता है। या एक चौथी छवि है जो डेटा को ओवरराइट करती है। आपके कोड में कई कारण हैं जो ऐसी त्रुटि का कारण बन सकते हैं। खासकर जब से आप अपने एएससी/डीईएससी क्वेरी में छवि आईडी प्राप्त करते हैं, तो छवि को एक असंबंधित दूसरी क्वेरी में हल करें। – zapl

+0

हाय! दूसरी तस्वीर में (मेरा दूसरा लिंक - http://cl.ly/image/2U0z1Z2b1m1v) मैंने चित्रों के ऊपर आईडी डाल दी हैं। वे अलग हैं: 7858, 7854 और 7851. मुझे यकीन नहीं है कि आपका क्या मतलब है "विशेष रूप से जब आप केवल अपनी एएससी/डीईएससी क्वेरी में छवि आईडी प्राप्त करते हैं, तो छवि को एक असंबंधित दूसरी क्वेरी में हल करें।" एक नज़र डालने के लिए धन्यवाद। –

+1

मैंने एक छोटे से एएससी/डीईएससी उदाहरण को एक साथ हैक किया है जो मेरे लिए ठीक काम करता है (4.0.3 एम्यूलेटर)। https://www.dropbox.com/s/in048v3fh3xae2m/AscDescGallery.zip - "विशेष रूप से ..." का अर्थ है: आप Mediastore से चित्रों की सूची में पहले कदम के प्रश्न में है। या तो एएससी या डीईएससी। फिर आप मीडियास्टोर से थंबनेल के लिए पूछते हैं, एक स्वतंत्र प्रश्न में जो आपको पता नहीं है कि आपको आईडी कैसे मिली है। तो जब तक आप सही आईडी का उपयोग करते हैं, तब तक पहली क्वेरी में ऑर्डर को 'थंबनेल.get थंबनेल' के परिणाम पर कोई प्रभाव नहीं पड़ता है। – zapl

उत्तर

0

तीन साल बाद, ऐसा लगता है इस मुद्दे कि is fixed in Lollipop । (उस धागे पर आखिरी टिप्पणी)।
इसलिए मैं अपने स्वयं के प्रश्न का उत्तर दे रहा हूं।

2

मैं "मी बस यहाँ अनुमान लगा। जब आप MICRO_KIND ओएस जो एक ही छवि फिर से उत्पादन DESC कर्सर पर पंक्ति में अगले हो जाता है एक नई छवि पैदा कर रही है के लिए पूछना।

एक काम के आसपास एक ArrayList लोड करने के लिए है । छवि आईडी के लिए फिर ArrayList से काम थंबनेल के बाद जाने के लिए

संभावना MINI_KIND और bmoptions.inSampleSize = 2 का उपयोग कर अपने कोड की कोशिश;।

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);