2010-09-09 19 views
36

मैं एक इन-एप गतिविधि प्रदान करने की कोशिश कर रहा हूं जो डिवाइस के मीडिया स्टोर में फ़ोटो के थंबनेल प्रदर्शित करता है, और उपयोगकर्ता को एक का चयन करने की अनुमति देता है। उपयोगकर्ता चयन करने के बाद, एप्लिकेशन मूल पूर्ण आकार की छवि को पढ़ता है और इसके साथ चीजें करता है।एंड्रॉइड मीडियास्टोर सामग्री प्रदाता से पूछताछ कैसे करें, अनाथ छवियों से परहेज करें?

मैं बाहरी संग्रहण का पूरा छवियों पर एक Cursor बनाने के लिए निम्नलिखित कोड का उपयोग कर रहा:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.image_select); 

    mGridView = (GridView) findViewById(R.id.image_select_grid); 

    // Query for all images on external storage 
    String[] projection = { MediaStore.Images.Media._ID }; 
    String selection = ""; 
    String [] selectionArgs = null; 
    mImageCursor = managedQuery(MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI, 
           projection, selection, selectionArgs, null); 

    // Initialize an adapter to display images in grid 
    if (mImageCursor != null) { 
     mImageCursor.moveToFirst(); 
     mAdapter = new LazyCursorAdapter(this, mImageCursor, R.drawable.image_select_default); 
     mGridView.setAdapter(mAdapter); 
    } else { 
     Log.i(TAG, "System media store is empty."); 
    } 
} 

और निम्नलिखित कोड थंबनेल छवि लोड करने के लिए (Android 2.x कोड दिखाया गया है) :

// ... 
// Build URI to the main image from the cursor 
int imageID = cursor.getInt(cursor.getColumnIndex(MediaStore.Images.Media._ID)); 
Uri uri = Uri.withAppendedPath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, 
           Integer.toString(imageID)); 
loadThumbnailImage(uri.toString()); 
// ... 

protected Bitmap loadThumbnailImage(String url) { 
    // Get original image ID 
    int originalImageId = Integer.parseInt(url.substring(url.lastIndexOf("/") + 1, url.length())); 

    // Get (or create upon demand) the micro thumbnail for the original image. 
    return MediaStore.Images.Thumbnails.getThumbnail(mContext.getContentResolver(), 
         originalImageId, MediaStore.Images.Thumbnails.MICRO_KIND, null); 
} 

और निम्नलिखित कोड URL से मूल छवि को लोड करने में एक बार उपयोगकर्ता एक चयन करता है:

public Bitmap loadFullImage(Context context, Uri photoUri ) { 
    Cursor photoCursor = null; 

    try { 
     // Attempt to fetch asset filename for image 
     String[] projection = { MediaStore.Images.Media.DATA }; 
     photoCursor = context.getContentResolver().query(photoUri, 
                projection, null, null, null); 

     if (photoCursor != null && photoCursor.getCount() == 1) { 
      photoCursor.moveToFirst(); 
      String photoFilePath = photoCursor.getString(
       photoCursor.getColumnIndex(MediaStore.Images.Media.DATA)); 

      // Load image from path 
      return BitmapFactory.decodeFile(photoFilePath, null); 
     } 
    } finally { 
     if (photoCursor != null) { 
      photoCursor.close(); 
     } 
    } 

    return null; 
} 

समस्या जो मैं अपने एंड्रॉइड डिवाइस पर देख रहा हूं, जिसमें मेरा व्यक्तिगत फोन भी शामिल है, कर्सर मुझे onCreate() में क्वेरी से मिलता है जिसमें कुछ प्रविष्टियां होती हैं जिनके लिए वास्तविक पूर्ण आकार की छवि फ़ाइल (जेपीजी या पीएनजी) लापता है। (मेरे फोन के मामले में, छवियों को आयात किया गया था और बाद में iPhoto द्वारा मिटा दिया गया था)।

अनाथ प्रविष्टियों या थंबनेल, पर निर्भर करता है नहीं हो सकता है सकते हैं कि क्या थंबनेल जहां जब वास्तविक मीडिया फ़ाइल से पहले AWOL उत्पन्न। अंतिम परिणाम है कि ऐप्लिकेशन छवियों है कि वास्तव में मौजूद नहीं है के लिए थंबनेल प्रदर्शित है।

  1. वहाँ एक प्रश्न मैं MediaStore सामग्री प्रदाता लौटे Cursor में मीडिया लापता साथ छवियों को फ़िल्टर कर देगा के लिए कर सकते है:

    मैं कुछ प्रश्न हैं?

  2. वहाँ एक साधन, या MediaStore पुन: स्कैन करने के लिए मजबूर है, और अनाथ प्रविष्टियों को खत्म करने के लिए एक एपीआई है? मेरे फोन पर, मैंने यूएसबी-माउंटेड को बाहरी मीडिया को अनमाउंट किया, जिसे एक रेस्कैन ट्रिगर करना माना जाता है। लेकिन अनाथ प्रविष्टियों रहते हैं।
  3. या क्या मेरे दृष्टिकोण के साथ कुछ मौलिक रूप से गलत है जो इस समस्या का कारण बन रहा है?

धन्यवाद।

उत्तर

60

ठीक है, मुझे इस कोड नमूना के साथ समस्या मिली है।

mImageCursor = managedQuery(MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI, 
          projection, selection, selectionArgs, null); 

समस्या यहाँ है कि यह थंबनेल के लिए क्वेरी है, बजाय वास्तविक छवियों से है:

onCreate() विधि में, मैं इस लाइन थी। HTC उपकरणों पर कैमरा ऐप डिफ़ॉल्ट रूप से थंबनेल बनाने नहीं करता है, और इसलिए इस क्वेरी चित्र पहले से ही गणना थंबनेल की जरूरत नहीं है कि वापस जाने के लिए असफल हो जायेगी।

इसके बजाय, वास्तविक चित्र खुद के लिए क्वेरी:

mImageCursor = managedQuery(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, 
          projection, selection, selectionArgs, null); 

यह एक कर्सर प्रणाली पर सभी पूर्ण आकार छवियों वाले वापस आ जाएगी।इसके बाद आप कॉल कर सकते हैं:

Bitmap bm = MediaStore.Images.Thumbnails.getThumbnail(context.getContentResolver(), 
     imageId, MediaStore.Images.Thumbnails.MINI_KIND, null); 

जो संबद्ध पूर्ण आकार छवि के लिए मध्यम आकार के थंबनेल वापस आ जाएगी, यदि आवश्यक हो तो यह पैदा होता है। सूक्ष्म आकार के थंबनेल प्राप्त करने के लिए, बस इसके बजाय MediaStore.Images.Thumbnails.MICRO_KIND का उपयोग करें।

इसने थंबनेल खोजने की समस्या को हल किया जो मूल पूर्ण आकार की छवियों के संदर्भों को लटकता है।

7

कृपया ध्यान दें कि चीजें जल्द ही बदल रही हैं, प्रबंधितQuery विधि बहिष्कृत है। इसके बजाय कर्सर लोडर का उपयोग करें (एपीआई स्तर 11 के बाद से)।

संबंधित मुद्दे