इस चित्र में के रूप में परिदृश्य पर विचार करें:MediaStore.Images.Thumbnails.getThumbnail गलत बजाय थंबनेल NULL भेजता है
तीन फोटो, उनमें से एक एक बड़ी GIF फ़ाइल (3MP) है।
मैं आदेश संवाददाता थंबनेल पुनः प्राप्त करने में Mediastore क्वेरी करने कर रहा हूँ।
MediaStore.Images.Media.DATE_ADDED + " DESC""
क्या होता है:: Mediastore रिटर्न पिछले सफलतापूर्वक लिया गया थंबनेल:
अपेक्षित व्यवहार: जब Mediastore प्राप्त नहीं कर सकता मैं इस sortOrder साथ CursorLoader के माध्यम से कर्सर को प्रारंभ करते हैं किसी दिए गए चित्र के थंबनेल को किसी कारण से इसे वापस लौटना होगा, इसके जावाडोक के अनुसार: "... एक बिटमैप उदाहरण देता है। मूल छवि गधा अगर यह शून्य हो सकता है origId के साथ ociated मौजूद नहीं है या स्मृति पर्याप्त नहीं है। "
यदि मैं यह 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।
संपादित
ऐसा लगता है कि इस मुद्दे fixed in Lollipop. है (कि धागे पर अंतिम टिप्पणी)।
आपको प्राप्त होने वाली प्रत्येक छवि के लिए 'mOrigId' प्रिंट करें, यह छवि 2 और 3 के लिए समान हो सकता है। या एक चौथी छवि है जो डेटा को ओवरराइट करती है। आपके कोड में कई कारण हैं जो ऐसी त्रुटि का कारण बन सकते हैं। खासकर जब से आप अपने एएससी/डीईएससी क्वेरी में छवि आईडी प्राप्त करते हैं, तो छवि को एक असंबंधित दूसरी क्वेरी में हल करें। – zapl
हाय! दूसरी तस्वीर में (मेरा दूसरा लिंक - http://cl.ly/image/2U0z1Z2b1m1v) मैंने चित्रों के ऊपर आईडी डाल दी हैं। वे अलग हैं: 7858, 7854 और 7851. मुझे यकीन नहीं है कि आपका क्या मतलब है "विशेष रूप से जब आप केवल अपनी एएससी/डीईएससी क्वेरी में छवि आईडी प्राप्त करते हैं, तो छवि को एक असंबंधित दूसरी क्वेरी में हल करें।" एक नज़र डालने के लिए धन्यवाद। –
मैंने एक छोटे से एएससी/डीईएससी उदाहरण को एक साथ हैक किया है जो मेरे लिए ठीक काम करता है (4.0.3 एम्यूलेटर)। https://www.dropbox.com/s/in048v3fh3xae2m/AscDescGallery.zip - "विशेष रूप से ..." का अर्थ है: आप Mediastore से चित्रों की सूची में पहले कदम के प्रश्न में है। या तो एएससी या डीईएससी। फिर आप मीडियास्टोर से थंबनेल के लिए पूछते हैं, एक स्वतंत्र प्रश्न में जो आपको पता नहीं है कि आपको आईडी कैसे मिली है। तो जब तक आप सही आईडी का उपयोग करते हैं, तब तक पहली क्वेरी में ऑर्डर को 'थंबनेल.get थंबनेल' के परिणाम पर कोई प्रभाव नहीं पड़ता है। – zapl