Android MediaStore obtiene distintas carpetas de archivos de música
Buscando la manera de obtener sólo carpetas de archivos de música de Android MediaStore para la ruta de directorio de entrada. Así que en realidad la pregunta es acerca de cómo hacer una consulta adecuada a la MediaStore.
Aquí hay un ejemplo. Mi código actual:
- Tratar con WHERE IN (?) En la consulta de SQLite de SQL
- Restricción única del reino en varios campos
- Android 6.0 y superiores no se borran los datos de sqlite del teléfono después de desinstalar la aplicación
- Uso del patrón de diseño Singleton para SQLiteDatabase
- SQLite: Búsqueda eficiente de subcadenas en una tabla grande
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));
Como resultado tendremos en las songs
List smth como:
/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
Lo que realmente estoy buscando – para obtener tal DISTINCT lista de un nivel de rutas anidadas de dirPath
como este:
/mnt/sdcard/Music/FolderWithSongs/ /mnt/sdcard/Music/AnotherFolderWithSongs/ /mnt/sdcard/Music/AndOneMoreFolder/
Si aquí están los archivos de carpetas actuales – /mnt/sdcard/Music/song1.mp3
y /mnt/sdcard/Music/song2.mp3
– es aceptable también.
¿Algunas ideas?
EDIT He encontrado dos posibles soluciones: lista de música de Android por las carpetas y reproducirlos y Construir una estructura de árbol de la lista de rutas de cadena , pero creo que una mejor manera de resolver este problema es posible.
- Error log sqlite no se ha podido cargar desde /cachedGeplacement.db
- ¿Cuál es la manera de insertar un enorme JSON datos en un DB de SQLite en android
- Cómo obtener el valor de la columna Timestamp en android mediante cursor
- ¿Puedo bloquear una tabla SQLite para el subproceso actual?
- Cifrar la base de datos sqlite Android:
- Android JUnit4 Pruebas - ¿Dónde obtener el contexto de?
- ¿Cómo puedo obtener datos de una base de datos SQLITE en una matriz en android?
- Cómo convertir de java.util.HashMap a android.content.ContentValues?
Usted tendrá que utilizar ambas técnicas. MediaStore y explorador de archivos.
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; } } }
Archivo .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>
Permisos en el archivo manifiest:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
Esta es mi solución.
-
Cursor mCursor = getContentResolver().query( MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, ...
todos los archivos de audio ex)Cursor mCursor = getContentResolver().query( MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, ...
- Declarar nuevo arreglo
- lazo
- Nombre de la carpeta =
MediaStore.Audio.Media.DATA - MediaStore.Audio.Media.DISPLAY_NAME
- Coloque el nuevo en la variable de matriz
- Array es una lista de carpetas distinta
Esto puede funcionar: – use el método walkDir para buscar todos los archivos de música en su ubicación de almacenamiento, entonces usted podría obtener la ruta de acceso de cada archivo del método getPath () – use subsString () método con todos los archivos de ruta para obtener el nombre de la carpeta de nivel 1 – Almacenar todo el nombre de la carpeta en un ArrayList el uso de Hashset para eliminar el nombre de la carpeta duplicada (con la condición)
- Cambiar el color del puntero del cursor EditText de Android mediante programación
- Cómo puedo saber cuándo / dónde invocar el método anulado de la superclase