6

क्योंकि मुझे यकीन है कि Mediastore रिबूट करने मैं मैं पर पाया लोकप्रिय तरीका का उपयोग कर MediaScanner आरंभ करवाना चाहते बिना नवीनतम जानकारी है बनाना चाहते अतःनेक्सस 7 पर मीडियास्केन कैसे ट्रिगर करें?

context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, 
           Uri.parse("file://" + Environment.getExternalStorageDirectory()))); 

यह मेरा सैमसंग एस 2 पर ठीक काम करता है w/आईसीएस लेकिन मेरे नेक्सस 7 डब्ल्यू/जेलीबीन पर नहीं। Logcat मेरी Nexus 7 पर इस से पता चलता:

WARN/ActivityManager(480): Permission denied: checkComponentPermission() owningUid=10014 
WARN/BroadcastQueue(480): Permission Denial: broadcasting Intent { act=android.intent.action.MEDIA_MOUNTED dat=file:///storage/emulated/0 flg=0x10 } from com.example.foo.bar (pid=17488, uid=10046) is not exported from uid 10014 due to receiver com.android.providers.downloads/.DownloadReceiver 
INFO/ActivityManager(480): Start proc com.google.android.music:main for broadcast com.google.android.music/.store.MediaStoreImportService$Receiver: pid=17858 uid=10038 gids={50038, 3003, 1015, 1028} 
INFO/MusicStore(17858): Database version: 50 
INFO/MediaStoreImporter(17858): Update: incremental Added music: 0 Updated music: 0 Deleted music: 0 Created playlists: 0 Updated playlists: 0 Deleted playlists: 0 Inserted playlist items: 0 Deleted playlist items: 0 Removed orphaned playlist items: 0 

अंतिम पंक्ति सिद्धांत रूप में प्रोत्साहित करने के लिए लगता है, लेकिन मूल्यों हमेशा 0 के बाद भी नई फ़ाइलें SD कार्ड पर धकेल दिया गया (एडीबी धक्का के माध्यम से) कर रहे हैं। मेरे पुराने डिवाइस (एस 2) पर यह एसडी कार्ड को रिमाउंट करता है।

मैं अपने AndroidManifest.xml के लिए निम्न अनुमतियाँ जोड़ दिया है, लेकिन यह उन अनुमतियों के बिना के रूप में ही व्यवहार करती है:

<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> 
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 

कोई भी विचार/विकल्प?


संपादित करें 1:

ध्यान दें कि मैं नई या संशोधित या नष्ट कर दिया फ़ाइलों के किसी भी फ़ाइल पथ पता नहीं है। मैं सिर्फ यह सुनिश्चित करना चाहता हूं कि मीडियास्टोर अद्यतित है।

+0

इस ([इस मुद्दे] से कोई लेना देना http://stackoverflow.com/questions/14346160/saving है: लेकिन यह अभी भी मंशा ACTION_MEDIA_SCANNER_SCAN_FILE उपयोग करने के लिए मीडिया की दुकान में एक फ़ाइल जोड़ने के लिए संभव है -फाइल-ऑन-बाहरी-स्टोरेज-ऑन-नेक्सस -7-और-पुनर्प्राप्ति-से-पीसी) समस्या? –

+0

यह काफी संभव है। लिंक के लिए धन्यवाद। मैं यह देखने जा रहा हूं कि क्या मैं अन्य उपकरणों तक पहुंच प्राप्त कर सकता हूं यह देखने के लिए कि क्या यह केवल नेक्सस 4/7 है। –

+0

मुझे [Mediascan ट्रिगर करने के लिए इस फ़ंक्शन का उपयोग करके नेक्सस 4 पर कोई समस्या नहीं है] (https://gist.github.com/danoz73/5061888) –

उत्तर

8

अतः

ACTION_MEDIA_MOUNTED प्रसारण Faking मैं पर पाया लोकप्रिय तरीका का उपयोग कर कभी नहीं एक उचित समाधान IMHO किया गया है।

कोई विचार/विकल्प?

Use MediaScannerConnection, जैसे its scanFile() static method के माध्यम से।

+0

अच्छा बिंदु! कुछ प्रयोगों के बाद यह केवल तब काम करता प्रतीत होता है जब मुझे पहले से ही पता था कि कौन सी फाइल जोड़ा गया था, यानी अगर मैं फ़ाइल नाम सहित फ़ाइल को पूरा पथ प्रदान करता हूं। मेरे मामले में मुझे यह नहीं पता। यदि कोई निर्देशिका प्रदान की जाती है तो यह केवल उस निर्देशिका को मीडियास्टोर में जोड़ने का प्रयास करती है, लेकिन नीचे कोई भी फाइल या निर्देशिका नहीं है। –

+0

@ बर्डस: "मेरे मामले में मुझे यह नहीं पता" - उम, तो आप 'मीडियास्टोर' के साथ क्यों गड़बड़ कर रहे हैं? – CommonsWare

+0

क्योंकि डिवाइस पर सभी मीडिया फ़ाइलों के बारे में जानकारी प्राप्त करने का यह एक आसान तरीका है। फाइल सिस्टम को क्रॉल करने से भी तेज़ है। –

12

यहाँ नमूना CommonsWare के उत्तर के आधार पर कोड है:

MediaScannerConnection.scanFile(activity, new String[]{path}, null, 
           new MediaScannerConnection.OnScanCompletedListener() { 
    @Override 
    public void onScanCompleted(final String path, final Uri uri) { 
     Log.i(TAG, String.format("Scanned path %s -> URI = %s", path, uri.toString())); 
    } 
}); 

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

Uri uri = Uri.fromFile(Environment.getExternalStorageDirectory()); 
activity.sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, uri)); 

बीटीडब्ल्यू, समाधान के लिए कोई अनुमति आवश्यक नहीं है।

+11

ऐसा प्रतीत होता है कि आपका 'ACTION_MEDIA_MOUNTED' दृष्टिकोण अब एंड्रॉइड 4.4 पर गैर-सिस्टम ऐप्स के लिए अवरुद्ध है। – CommonsWare

+1

यूप और इसे करने वाले ऐप्स "प्रसारण औरroid.intent.action.MEDIA_MOUNTED को भेजने की अनुमति नहीं" के साथ क्रैश हो जाएंगे:/ – markostamcar

+1

कोड के लिए धन्यवाद। बहुत अच्छा काम करता है। – Ray

7

मेरा उत्तर थोड़ा देर हो गया है, लेकिन यह उन लोगों की मदद कर सकता है, जो एक नई फाइल को सहेजते हैं, और एंड्रॉइड किटकैट पर उस फाइल द्वारा मीडिया स्टोर का विस्तार करना चाहते हैं: एंड्रॉइड किटकैट पर इरादा ACTION_MEDIA_MOUNTED गैर- सिस्टम ऐप (मुझे लगता है, क्योंकि पूरे फाइल सिस्टम स्कैनिंग काफी महंगा है)।

File f = new File(path to the file you would like to add to the media store ...); 
try { 
    Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); 
    Uri uri = Uri.fromFile(f); 
    mediaScanIntent.setData(uri); 
    sendBroadcast(mediaScanIntent); 
} catch(Exception e) { 
    ... 
} 
+0

धन्यवाद। यह मैंने देखा है सबसे अच्छा जवाब है, और यह मेरे लिए अच्छा काम करता है। – Wookie

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