8

पर एंड्रॉइड गैलरी में छवि फ़ाइल को चित्रित करें मैं गैलरी में दिखाई देने वाले ऐप में कुछ तस्वीरें लेने की कोशिश कर रहा हूं (इसलिए उन्हें साझा किया जा सकता है और ऐप के बाहर देखा जा सकता है), लेकिन मैं रखना चाहता हूं छवियों को स्वयं ऐप की डेटा निर्देशिका के अंदर, इसलिए जब ऐप हटा दिया जाता है तो वे हटा दिए जाते हैं (इसलिए वे "{sdcard}/एंड्रॉइड/डेटा/{एपीआईडी}/पिक्चर्स/{सबफोल्डर} /") में संग्रहीत होते हैं।लॉलीपॉप

मैं जवाब का एक बहुत पर और Android नीचे दिए समाधान दोनों काम के पुराने संस्करणों के लिए देखा है, लेकिन वे लॉलीपॉप में काम करने के लिए नहीं है:

MediaScannerConnection.scanFile(this, 
    new String[]{file.toString()}, new String[] { "image/jpeg" }, 
    new MediaScannerConnection.OnScanCompletedListener() { 
     public void onScanCompleted(String path, Uri uri) { 
      Log.i("ExternalStorage", "Scanned " + path + ":"); 
      Log.i("ExternalStorage", "-> uri=" + uri); 
     } 
    }); 

Uri contentUri = Uri.fromFile(file); 
Intent mediaScanIntent = new 
    Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,contentUri); 
sendBroadcast(mediaScanIntent); 

मैं एक नेक्सस में यह परीक्षण किया है 4 (एंड्रॉइड 5.0.1) और एक नेक्सस 6 (एंड्रॉइड 5.1) और यह काम नहीं करता है। नेक्सस 7 (एंड्रॉइड 4.2.2) में यह काम करता है। सभी 3 उपकरणों {sdcard} में एक ".onmedia" फ़ाइल/एंड्रॉयड/डेटा/ फ़ोल्डर है, तो कोई सामान्य मीडिया स्कैन उन्हें लेने चाहिए ...

किसी को भी एक काम के आसपास पता है यह प्राप्त करने के लिए सभी उपकरणों/एंड्रॉइड संस्करणों पर काम करते हैं? क्या यह नोमीडिया फ़ाइल की वजह से पहले स्थान पर काम नहीं करना चाहिए और लॉलीपॉप एकमात्र संस्करण है जो इसे सही तरीके से करता है?

संपादित करें: ध्यान दें कि फोन के पुनरारंभ (जो फ़ाइलों के एक rescan भी ट्रिगर करना चाहिए) काम नहीं करता है। और अच्छे कारण के लिए फाइलें ".nomedia" निर्देशिका के सबफ़ोल्डर में हैं ... इसलिए कोई भी समाधान जिसमें MEDIA_MOUNTED प्रसारण शामिल है, मुझे लगता है कि बेकार है।

+0

Plz मेरे उत्तर को देखो मुझे लगता है कि यह आपके लिए काम करता है। – Lokesh

उत्तर

6

कोड नीचे आज़माएं।यह लॉलीपॉपमें मेरे लिए काम कर, आशा है आप के लिए काम के साथ-साथ

ContentValues values = new ContentValues(); 
values.put(MediaStore.Images.Media.DATA,"file path"); 
values.put(MediaStore.Images.Media.MIME_TYPE,"image/jpeg"); 
mContext.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,values); 

संपादित करें: भूल जाते हैं अपने प्रकट में जोड़ने के लिए (हालांकि लॉलीपॉप में यह अब आवश्यक होना चाहिए) नहीं है:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
+1

धन्यवाद। मुझे डर था कि यह जवाब मेरे लिए काम नहीं करता था, लेकिन ऐसा इसलिए था क्योंकि मेरे पास केवल एसडीके 18 और उससे कम के लिए "बाहरी भंडारण लिखना" अनुमति थी। अब सभी एसडीके के लिए अनुमति के साथ यह काम करता है। अभी भी एंड्रॉइड के निचले संस्करणों में परीक्षण करने की आवश्यकता है, लेकिन यह कम से कम सही शुरुआत है! – Kasium

+0

उर wlcm और आपके संपादन सुझाव के लिए धन्यवाद। – Lokesh

+0

मुझे 100 प्रतिष्ठाएं मिलीं क्योंकि मैंने कल स्टैक ओवरफ्लो वेब सर्फ किया था, बस इस अद्भुत जवाब की तलाश में। धन्यवाद @ लोकेश – Leebeedev

2

मैं आपको my answer here पर एक नज़र डालने का सुझाव दूंगा। यह मेरे द्वारा बनाए गए MediaScanner के आसपास के सभी निष्कर्षों को लपेटता है।

साइड नोट: सभी KitKat समस्याएं Lollipop पर चिपकने लगती हैं।

+0

धन्यवाद। लेकिन वे सभी समाधान नहीं लगते हैं। यहां तक ​​कि खोल के माध्यम से "घुड़सवार" प्रसारण भेजने की हैक भी काम नहीं करता है ... – Kasium

+0

सही। जैसा कि मैंने कहा, किटकैट के लिए कोई कामकाजी समाधान नहीं है, और लॉलीपॉप के लिए भी कोई नहीं है। – Sebastiano

0

अगर मीडिया सामग्री प्रदाता को आपकी स्थानीय डेटा निर्देशिका के लिए पढ़ने की अनुमति मिल जाएगी, तो मैं शर्मिंदा नहीं हूं जिसमें कल्पनाएं शामिल हैं। अनुमतियों के बिना आपकी गैलरी एप्रैच काम नहीं कर सका।

पता लगाने के लिए अगर यह है संभव है यदि आप एक संदर्भ के लिए आप के माध्यम से

mMediaProvider = mContext.getContentResolver().acquireProvider("media"); 
    mImagesUri = Images.Media.getContentUri(volumeName); 
    result = mMediaProvider.insert(mImagesUri, values); 

यहाँ एंड्रोइड्स मीडिया डेटाबेस अपने आप में स्थानीय छवियों डाल करने के लिए कोशिश कर सकते हैं एक मीडिया स्कैनर के sourcecode कि सभी आवश्यक कोड के टुकड़े को शामिल करना चाहिए कैसे एक जेपीजी

0

से मूल्यों को भरने के लिए imag सहेजने के बाद गैलरी स्कैन करने के लिए स्कैन विधि को कॉल करें, यह गैलरी में छवियों को दिखाएगा।

scanFile(Environment.getExternalStorageDirectory().getAbsolutePath() + "/appfolder/imgname"+imagenumber+".png"); 


private void scanFile(String file) { 


     MediaScannerConnection.scanFile(this, 
       new String[] { file.toString() }, null, 
       new MediaScannerConnection.OnScanCompletedListener() { 
        public void onScanCompleted(String path, Uri uri) { 
         Log.i("ExternalStorage", "Scanned " + path + ":"); 
         Log.i("ExternalStorage", "-> uri=" + uri); 
        } 
       }); 


    } 
+0

यह वही है जो मैंने पहले ही कहा था कि मूल प्रश्न में काम नहीं कर रहा था ... – Kasium

+0

आपको उस निर्दिष्ट फ़ाइल को रीफ्रेश करना होगा, फिर केवल इसके काम, नेक्सस 5, 5.0.2 में परीक्षण किया गया .. इसके कामकाज, –

+0

मैंने सोचा एक सेकंड यह अंतर हो सकता है कि आप file.toString() के बजाय पूर्ण पथ का उपयोग करते हैं, लेकिन फिर भी file.getAbsolutePath() के साथ यह मेरे नेक्सस 4, 5.0.1 पर काम नहीं करता है, हालांकि लॉग कहता है कि इसे स्कैन किया गया था : I/बाहरी स्टोरेज: स्कैन किए गए/स्टोरेज /emulated/0/Android/data/com.something/files/Pictures/10141/7657/RZ-1430906494186.jpg: I/बाहरी स्टोरेज: -> uri = content: // media/बाहरी/फ़ाइल/43992 गैलरी की जांच के लिए आप किस एप्लिकेशन का उपयोग करते हैं? मैंने गूगल्स "फोटो" और टेलीग्राम (शेयर छवि) की कोशिश की। – Kasium

0

आप ने कहा है कि {sdcard}/एंड्रॉयड/डेटा/ फ़ोल्डर एक .nomedia फ़ाइल के रूप में, तो हम एक प्रसारण MediaScanner के लिए फ़ोल्डर का सबफ़ोल्डर जो .nomedia फ़ाइल स्कैन करने के लिए भेज सकते हैं बोले कोड का उपयोग कर उस सबफ़ोल्डर पथ को निर्दिष्ट करके।

sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file:// "+"Directory path"))); 
संबंधित मुद्दे