2012-07-01 10 views
5

Szuka sposobu na uzyskanie tylko ścieżek folderów plików muzycznych z Android MediaStore dla wprowadzonej ścieżki do katalogu. Więc właściwie pytanie dotyczy sposobu, w jaki należy utworzyć odpowiednie zapytanie do MediaStore.Android MediaStore pobiera oddzielne foldery z plikami muzycznymi

Oto przykład. Mój bieżący kod:

String dirPath="/mnt/sdcard/Music/"; 
    String selection =MediaStore.Audio.Media.DATA +" like ?"; 
    String[] projection = {MediaStore.Audio.Media.DATA};  
    String[] selectionArgs={dirPath+"%"}; 
    Cursor cursor = this.managedQuery(
     MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, 
     projection, 
     selection, 
     selectionArgs, 
     null); 
    List<String> songs = new ArrayList<String>(); 
    while(cursor.moveToNext()) 
     songs.add(cursor.getString(0)); 

W efekcie będziemy mieć w czymś songs listę:

/mnt/sdcard/Music/song1.mp3 
/mnt/sdcard/Music/song2.mp3 
/mnt/sdcard/Music/FolderWithSongs/song3.mp3 
/mnt/sdcard/Music/AnotherFolderWithSongs/song4.mp3 
/mnt/sdcard/Music/AndOneMoreFolder/song5.mp3 
/mnt/sdcard/Music/AndOneMoreFolder/song6.mp3 
/mnt/sdcard/Music/AndOneMoreFolder/song7.mp3 
/mnt/sdcard/Music/AndOneMoreFolder/SomeFolder/song8.mp3 
/mnt/sdcard/Music/AndOneMoreFolder/SomeFolder/song9.mp3 

Co ja właściwie szuka - aby uzyskać taką listę DISTINCT jednym poziomie zagnieżdżone ścieżki z dirPath takie jak ten:

/mnt/sdcard/Music/FolderWithSongs/ 
/mnt/sdcard/Music/AnotherFolderWithSongs/ 
/mnt/sdcard/Music/AndOneMoreFolder/ 

Jeśli tu będzie aktualne pliki Folder - /mnt/sdcard/Music/song1.mp3 i /mnt/sdcard/Music/song2.mp3 - jest to również do przyjęcia.

Wszelkie pomysły?

EDIT Znalazłem dwa możliwe rozwiązania: Android list music by folders and play them i Construct a tree structure from list of string paths , ale myślę, że lepszym sposobem rozwiązania tego problemu jest możliwe.

Odpowiedz

0

To może prace: - stosować metodę walkDir aby wyszukać wszystkie pliki muzyczne w swojej lokalizacji, a następnie można uzyskać ścieżkę każdego pliku z getPath() metoda - wykorzystanie subsString() metoda ze wszystkich plików ścieżki, aby uzyskać nazwa folderu poziomu 1: - zapisz całą nazwę folderu w ArrayList użyj Hashset do usunięcia zduplikowanej nazwy folderu (z warunkiem)

2

To jest moje rozwiązanie.

  1. skanowania wszystkie pliki audio ex) Cursor mCursor = getContentResolver().query( MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, ...
  2. zadeklarować nowa tablica
  3. pętla
  4. Folder name = MediaStore.Audio.Media.DATA - MediaStore.Audio.Media.DISPLAY_NAME
  5. umieścić nowy do zmiennej tablicowej
  6. tablicę jest odrębną listę folderów
+0

mam manipulowane kodu trochę tak, że łatwiej jest czytać; czy możesz sprawdzić i upewnić się, że nie usunąłem niczego, co dodaje znaczenia? – andrewsi

+0

@andrewsi, dobrze. dzięki. – jeonggu

+0

Dowolny przykładowy kod na github? – TheOnlyAnil

9

Będziesz musiał użyć obu technik. MediaStore i eksplorator plików.

public class MainActivity extends ActionBarActivity { 
private File file; 
private List<String> myList; 
private ListView listView; 
private TextView pathTextView; 
private String mediapath = new String(Environment.getExternalStorageDirectory().getAbsolutePath()); 

private final static String[] acceptedExtensions= {"mp3", "mp2", "wav", "flac", "ogg", "au" , "snd", "mid", "midi", "kar" 
    , "mga", "aif", "aiff", "aifc", "m3u", "oga", "spx"}; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    listView=(ListView) findViewById(R.id.pathlist); 
    pathTextView=(TextView) findViewById(R.id.path); 

    myList = new ArrayList<String>(); 

    String root_sd = Environment.getExternalStorageDirectory().toString(); 
    Log.e("Root",root_sd); 

    String state = Environment.getExternalStorageState(); 
    File list[] = null ; 
    /* if (Environment.MEDIA_MOUNTED.equals(state) || Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) { // we can read the External Storage... 
     list=getAllFilesOfDir(Environment.getExternalStorageDirectory()); 
    }*/ 

    pathTextView.setText(root_sd); 

    file = new File(root_sd) ;  
    list = file.listFiles(new AudioFilter()); 
    Log.e("Size of list ","" +list.length); 
    //LoadDirectory(root_sd); 

    for(int i=0; i< list.length; i++) 
    { 

     String name=list[i].getName(); 
    int count =  getAudioFileCount(list[i].getAbsolutePath()); 
    Log.e("Count : "+count, list[i].getAbsolutePath()); 
    if(count!=0) 
    myList.add(name); 
     /*int count=getAllFilesOfDir(list[i]); 
     Log.e("Songs count ",""+count); 

     */ 

    } 


    listView.setAdapter(new ArrayAdapter<String>(this, 
      android.R.layout.simple_list_item_1, myList)); 

    listView.setOnItemClickListener(new OnItemClickListener() { 

     @Override 
     public void onItemClick(AdapterView<?> arg0, View arg1, int position, 
       long arg3) { 
      File temp_file = new File(file, myList.get(position)); 

      if(!temp_file.isFile())   
      { 
       //LoadDirectory(myList.get(position)); 

       file = new File(file, myList.get(position)); 
       File list[] = file.listFiles(new AudioFilter()); 

       myList.clear(); 

       for(int i=0; i< list.length; i++) 
       { 
        String name=list[i].getName(); 

        int count =  getAudioFileCount(list[i].getAbsolutePath()); 
         Log.e("Count : "+count, list[i].getAbsolutePath()); 
         if(count!=0) 
         myList.add(name); 
        /*int count=getAllFilesOfDir(list[i]); 
        Log.e("Songs count ",""+count); 
        if(count!=0) 
         myList.add(name);*/ 
       } 

       pathTextView.setText(file.toString()); 
       //Toast.makeText(getApplicationContext(), file.toString(), Toast.LENGTH_LONG).show(); 
       listView.setAdapter(new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1, myList)); 

      } 


     } 
    }); 



} 

private int getAudioFileCount(String dirPath) { 

     String selection =MediaStore.Audio.Media.DATA +" like ?"; 
     String[] projection = {MediaStore.Audio.Media.DATA};  
     String[] selectionArgs={dirPath+"%"}; 
     Cursor cursor = this.managedQuery(
      MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, 
      projection, 
      selection, 
      selectionArgs, 
      null); 
     return cursor.getCount(); 
    } 


@Override 
public void onBackPressed() { 
    try { 
     String parent = file.getParent().toString(); 
     file = new File(parent) ;   
     File list[] = file.listFiles(new AudioFilter()); 

     myList.clear(); 

     for(int i=0; i< list.length; i++) 
     { 
      String name=list[i].getName(); 
      int count =  getAudioFileCount(list[i].getAbsolutePath()); 
       Log.e("Count : "+count, list[i].getAbsolutePath()); 
       if(count!=0) 
       myList.add(name); 
      /*int count=getAllFilesOfDir(list[i]); 
      Log.e("Songs count ",""+count); 
      if(count!=0)*/ 

     } 
     pathTextView.setText(parent); 
    // Toast.makeText(getApplicationContext(), parent,   Toast.LENGTH_LONG).show(); 
     listView.setAdapter(new ArrayAdapter<String>(this, 
       android.R.layout.simple_list_item_1, myList)); 
    } catch (Exception e) { 
     finish(); 
    } 


} 



// class to limit the choices shown when browsing to SD card to media files 
public class AudioFilter implements FileFilter { 

    // only want to see the following audio file types 
    private String[] extension = {".aac", ".mp3", ".wav", ".ogg", ".midi", ".3gp", ".mp4", ".m4a", ".amr", ".flac"}; 

    @Override 
    public boolean accept(File pathname) { 

     // if we are looking at a directory/file that's not hidden we want to see it so return TRUE 
     if ((pathname.isDirectory() || pathname.isFile()) && !pathname.isHidden()){ 
      return true; 
     } 

     // loops through and determines the extension of all files in the directory 
     // returns TRUE to only show the audio files defined in the String[] extension array 
     for (String ext : extension) { 
      if (pathname.getName().toLowerCase().endsWith(ext)) { 
       return true; 
      } 
     } 

     return false; 
    }  
} 



} 

plik .xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical" > 

<TextView 
    android:textSize="21sp" 
    android:typeface="monospace" 
    android:id="@+id/path" 
    android:layout_width="fill_parent" 
    android:layout_height="100dp" 
    android:layout_margin="10dp" 
    android:gravity="bottom" 
    android:text="PATH : " /> 

<View 
    android:layout_width="fill_parent" 
    android:layout_height="2dp" 
    android:background="#111111" /> 

<ListView android:id="@+id/pathlist" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" > 
</ListView> 

</LinearLayout> 

Uprawnienia w manifiest pliku:

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

Smutne demo. Zwraca błąd logcat w linii: list = plik.listFiles (new AudioFilter()); – TheOnlyAnil

+0

działa idealnie na moim urządzeniu –

+1

Dokładnie to, czego szukałem. Ta odpowiedź powinna mieć więcej pozytywnych opinii. Ładnie wykonane. – crysis

Powiązane problemy