मैं एक इन-एप गतिविधि प्रदान करने की कोशिश कर रहा हूं जो डिवाइस के मीडिया स्टोर में फ़ोटो के थंबनेल प्रदर्शित करता है, और उपयोगकर्ता को एक का चयन करने की अनुमति देता है। उपयोगकर्ता चयन करने के बाद, एप्लिकेशन मूल पूर्ण आकार की छवि को पढ़ता है और इसके साथ चीजें करता है।एंड्रॉइड मीडियास्टोर सामग्री प्रदाता से पूछताछ कैसे करें, अनाथ छवियों से परहेज करें?
मैं बाहरी संग्रहण का पूरा छवियों पर एक 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 उत्पन्न। अंतिम परिणाम है कि ऐप्लिकेशन छवियों है कि वास्तव में मौजूद नहीं है के लिए थंबनेल प्रदर्शित है।
- वहाँ एक प्रश्न मैं
MediaStore
सामग्री प्रदाता लौटेCursor
में मीडिया लापता साथ छवियों को फ़िल्टर कर देगा के लिए कर सकते है:मैं कुछ प्रश्न हैं?
- वहाँ एक साधन, या
MediaStore
पुन: स्कैन करने के लिए मजबूर है, और अनाथ प्रविष्टियों को खत्म करने के लिए एक एपीआई है? मेरे फोन पर, मैंने यूएसबी-माउंटेड को बाहरी मीडिया को अनमाउंट किया, जिसे एक रेस्कैन ट्रिगर करना माना जाता है। लेकिन अनाथ प्रविष्टियों रहते हैं। - या क्या मेरे दृष्टिकोण के साथ कुछ मौलिक रूप से गलत है जो इस समस्या का कारण बन रहा है?
धन्यवाद।