2010-07-21 34 views
44

यह एंड्रॉइड मंचों पर एक सामान्य उपयोगकर्ता प्रश्न के रूप में शुरू हुआ। हालांकि यह एक प्रोग्रामिंग सवाल, आवश्यकता के अनुसार बन गया है। मेरी समस्या यहाँ है।मैं एंड्रॉइड पर मीडियास्टोर को रीफ्रेश कैसे कर सकता हूं?

एंड्रॉइड की एक सेवा है - मीडियास्केनर - जो किसी भी समय पृष्ठभूमि में चलता है (मुझे विश्वास है) एसडी कार्ड अन-घुड़सवार और फिर से घुड़सवार है। यह सेवा कार्ड पर सभी मीडिया फ़ाइलों पर डेटा एकत्र करती है, और एक SQLite डीबी प्रदान करती है जिसे संगीत अनुप्रयोगों द्वारा पूछताछ की जा सकती है। अधिकांश संगीत अनुप्रयोग इस सेवा का उपयोग करते हैं क्योंकि यह एसडी कार्ड स्कैनिंग से जुड़े बैटरी-नाली पर बचाता है।

चूंकि मैंने एंड्रॉइड का उपयोग शुरू किया है, इसलिए मुझे लगातार एक समस्या है जिससे एसडी कार्ड से हटाए जाने के बाद भी इस SQLite डीबी में डिवाइस में सिंक्रनाइज़ एम 3 यू प्लेलिस्ट रहती है। यह उस बिंदु पर पहुंच गया है जहां मेरे पास अब तक किसी भी संगीत ऐप में दिखाई देने वाली लगभग 40 प्लेलिस्ट का संग्रह है, कार्ड के लगभग 10 एम 3 यू फाइलें होने के बावजूद। शेष प्लेलिस्ट नहीं खेलती हैं, और खाली हैं। मैं उन्हें संगीत ऐप से हटाकर मैन्युअल रूप से हटा सकता हूं, लेकिन मैं ऐसा करने में बीमार हूं। इन भूत प्लेलिस्ट को हटाने के लिए एक बेहतर तरीका होना चाहिए।

एंड्रॉइड मार्केट - एसडीआरस्कैन और म्यूजिक स्कैनर पर दो ऐप्स हैं, जो वास्तव में ऐसा करते हैं लेकिन उनमें से कोई भी काम नहीं करता है।

मैंने मीडियास्टोर डेटाबेस को रीफ्रेश या डिलीट करने और स्क्रैच से शुरू करने के लिए अपना स्वयं का ऐप लिखने के बारे में सेट किया है, लेकिन मुझे बहुत दूर नहीं मिल रहा है। मैं जो निम्नलिखित कोड चलाता है एक Android एप्लिकेशन मिल गया है:

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

मैं स्कैन करने के लिए एसडी कार्ड के लिए एक रास्ता के रूप में ऑनलाइन इस कोड के कुछ उदाहरण मिल गया है, लेकिन मैं जो भी इसके साथ किसी भी नसीब होने नहीं कर रहा हूँ । कोई सुझाव?

पूर्ण कोड:

package com.roryok.MediaRescan; 

import android.app.Activity; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.net.Uri; 
import android.os.Bundle; 
import android.os.Environment; 

public class MediaRescan extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, 
       Uri.parse("file://" + Environment.getExternalStorageDirectory()))); 
     setContentView(R.layout.main); 
    } 

    //Rescan the sdcard after copy the file 
    private void rescanSdcard() throws Exception{  
     Intent scanIntent = new Intent(Intent.ACTION_MEDIA_MOUNTED, 
       Uri.parse("file://" + Environment.getExternalStorageDirectory())); 
     IntentFilter intentFilter = new IntentFilter(Intent.ACTION_MEDIA_SCANNER_STARTED); 
     intentFilter.addDataScheme("file");  
     sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, 
       Uri.parse("file://" + Environment.getExternalStorageDirectory())));  
    } 
} 
+0

हाय, तुम्हें पता है अगर sendBroadcast (नई आशय (Intent.ACTION_MEDIA_MOUNTED, Uri.parse (करो "file: //" + Environment.getExternalStorageDirectory()))); एसडीकार्ड के लिए काम करेगा जो अतिरिक्त स्लॉट कार्ड हैं? दूसरे शब्दों में getExternalStorageDirectory() sdcard का पथ देता है जो आंतरिक है लेकिन निर्माता को बाहरी कार्ड प्रदान किया जा सकता है? ऐसे कार्ड के लिए मीडिया स्कैनर कैसे शुरू किया जा सकता है? – Ahmed

+0

इस समय ऐसा करने का कोई तरीका नहीं प्रतीत होता है। यह धागा देखें: http://stackoverflow.com/questions/5453708/android-how-to-use-environment-getexternalstoragedirectory – roryok

उत्तर

18

ठीक है, मैं इसे किया है।

कार्ड को पुन: स्कैन करने के बजाय, ऐप मध्यस्थ में सभी प्लेलिस्ट के माध्यम से पुनरावृत्ति करता है और _डेटा क्षेत्र की लंबाई की जांच करता है। मैंने पाया कि किसी भी संबंधित एम 3 यू फ़ाइल के साथ सभी सूचियों के लिए, यह क्षेत्र हमेशा खाली था। फिर यह मूल एंड्रॉइड संगीत ऐप के लिए स्रोत कोड ढूंढने का एक मामला था, हटाए गए तरीके को ढूंढना और 0 की लंबाई वाले किसी प्लेलिस्ट को हटाने के लिए इसका उपयोग करना। मैंने ऐप प्लेलिस्टपर्ज नाम दिया है (क्योंकि यह 'रीस्कैन नहीं है 'अब और) नीचे कोड पोस्ट कर रहा हूँ।

मैं शायद भी इस कहीं प्रकाशित करेंगे, या तो बाजार पर या मेरे खुद की साइट पर, http://roryok.com

package com.roryok.PlaylistPurge; 

import java.util.ArrayList; 
import java.util.List; 

import android.app.ListActivity; 
import android.content.ContentUris; 
import android.database.Cursor; 
import android.net.Uri; 
import android.os.Bundle; 
import android.provider.MediaStore; 
import android.widget.ArrayAdapter; 
import android.widget.ListAdapter; 

public class PlaylistPurge extends ListActivity { 

    private List<String> list = new ArrayList<String>(); 
    private final String [] STAR= {"*"}; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     ListAdapter adapter = createAdapter(); 
     setListAdapter(adapter); 
    } 

    /** 
    * Creates and returns a list adapter for the current list activity 
    * @return 
    */ 
    protected ListAdapter createAdapter() 
    { 
     // return play-lists 
     Uri playlist_uri= MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI;  
     Cursor cursor= managedQuery(playlist_uri, STAR, null,null,null); 
     cursor.moveToFirst(); 
     for(int r= 0; r<cursor.getCount(); r++, cursor.moveToNext()){ 
      int i = cursor.getInt(0); 
      int l = cursor.getString(1).length(); 
      if(l>0){ 
       // keep any playlists with a valid data field, and let me know 
       list.add("Keeping : " + cursor.getString(2) + " : id(" + i + ")"); 
      }else{ 
       // delete any play-lists with a data length of '0' 
       Uri uri = ContentUris.withAppendedId(MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI, i); 
       getContentResolver().delete(uri, null, null); 
       list.add("Deleted : " + cursor.getString(2) + " : id(" + i + ")"); 
      } 
     }  
     cursor.close(); 
     // publish list of retained/deleted playlists 
     ListAdapter adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, list); 

     return adapter; 
    } 
} 

अद्यतन:

यहाँ एप्लिकेशन http://roryok.com/blog/index.php/2010/07/23/clearing-out-deleted-playlists-in-android/ के बारे में अपने ब्लॉग पर एक पोस्ट का लिंक है

अद्यतन 2: मंगलवार, 9 अप्रैल, 2013

मैं इस पोस्ट से अपने ब्लॉग पर यातायात का एक बहुत मिल गया है, और एक लोगों के लिए मुझे धन्यवाद देने वाले लोगों की बड़ी संख्या में ईमेल। खुशी हुई यह मदद की! किसी भी संभावित उपयोगकर्ताओं को यह पता होना चाहिए कि जैसे ही आप इसे चलाते हैं, मेरा क्रैपी ऐप वर्तमान में क्रैश हो जाता है, लेकिन वास्तव में ऐसा करता है जो इसे करना है! मैं हमेशा वापस जाने और इस क्रैशिंग व्यवहार को ठीक करने और इसे बाजार में रखने का इरादा रखता हूं, उम्मीद है कि 2013 वह वर्ष होगा जो मैं करता हूं।

+0

क्या यह उन प्लेलिस्ट को हटा देगा जिन्हें हटाया नहीं गया है लेकिन उनके पास कोई गीत भी नहीं है? –

+0

हाय विनी। नहीं, यह केवल प्लेलिस्ट के लिए प्रविष्टियों को हटा देगा जिन्हें हटा दिया गया है। 0 प्रविष्टियों वाले प्लेलिस्ट प्रभावित नहीं होंगे – roryok

+0

धन्यवाद! अच्छा समाधान –

10

आप निम्न कोड का उपयोग कर विशिष्ट फ़ाइलों के पुनर्विक्रय का अनुरोध कर सकते हैं।

नोट: माइम प्रकार बीईपीई महत्वपूर्ण है। मैं एमपी 3 ID3 टैग में किए गए परिवर्तनों पर ध्यान SQLite में ठीक से ताज़ा नहीं था अगर मैं इस्तेमाल किया "*/*", फिर भी "ऑडियो/एमपी 3" का उपयोग कर काम किया

MediaScannerConnection.scanFile(
    context, 
    new String[]{ pathToFile1, pathToFile2 }, 
    new String[]{ "audio/mp3", "*/*" }, 
    new MediaScannerConnectionClient() 
    { 
     public void onMediaScannerConnected() 
     { 
     } 
     public void onScanCompleted(String path, Uri uri) 
     { 
     } 
    }); 
+1

आपको वास्तव में माइम प्रकार को पास करने की ज़रूरत नहीं है। अगर फ़ाइल ठीक से नामित है (* .mp3, * .m4a, आदि) तो स्कैनर एक्सटेंशन से माइम प्रकार निर्धारित करेगा। तो, नए स्ट्रिंग [] {** माइम प्रकार **} के बजाय, बस शून्य पास करें। – Baron

+0

यह मेरे लिए हटाए गए और स्थानांतरित फ़ाइलों को हटाने का पता लगाने के लिए काम करता है। मेरे मामले में मैं एमटीपी (मीडिया ट्रांसफर प्रोटोकॉल) पर संचार कर रहा हूं और फ़ाइलों को फिर से स्कैन किए बिना वे अभी भी रीबूट, आदि – egfconnor

+0

तक वहां दिखाई देते हैं, जहां तक ​​मुझे पता है कि यह अभी भी _playlists_ को प्रभावित नहीं करेगा जो हटाए गए मीडिया को संदर्भित करता है, केवल लाइब्रेरी संदर्भ – roryok

42

यहाँ एक आसान 'एकल फाइल आधारित समाधान' है :

जब भी आप एक फ़ाइल जोड़ने , Mediastore सामग्री प्रदाता जानता जाने के बारे में यह

sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(imageAdded))); 

का उपयोग कर विलोपन के लिए:। बस getContentResolver() का उपयोग को नष्ट (uri , अशक्त, नल) (क्रेडिट DDSports को जाता है)

+0

संभवतः अनाथ फ़ाइलों के मुद्दे को ठीक करने के लिए एक फिक्स के रूप में है। मेरा ऐप _other_ ऐप्स द्वारा छोड़ी गई गड़बड़ी को साफ करना था जो यह – roryok

+1

नहीं करता है, मैंने इसे एक अपवित्र दिया क्योंकि यह सही समस्या का समाधान नहीं करता है, यह जानकारी का एक बहुत ही मूल्यवान टुकड़ा है जो मुझे लगता है कि प्रासंगिक है। – Matt

+2

यह वास्तव में केवल एक फ़ाइल जोड़ते समय काम करता है। जब फ़ाइल को हटाना है तो यह काम नहीं करता है। आपको getContentResolver() की आवश्यकता है। हटाएं (यूरी, शून्य, शून्य); उस के लिए विधि। – DDSports

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

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