Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Quiero evitar que mi aplicación de reproductor de música explore los directorios de archivos de audio cada vez que se inicie la aplicación. ¿Cómo puedo hacer eso?

Quiero evitar que mi aplicación de reproductor de música escanee los directorios de archivos de audio cada vez que se inicie la aplicación. ¿Cómo puedo hacer eso?

He estado usando el siguiente código para escanear los archivos de audio.

public void getSongList() { ContentResolver contentResolver=getContentResolver(); Uri musicUri=android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; Cursor musicCursor = contentResolver.query(musicUri, null, null, null, null); if(musicCursor!=null && musicCursor.moveToFirst()) { //get columns int titleColumn = musicCursor.getColumnIndex (android.provider.MediaStore.Audio.Media.TITLE); int idColumn = musicCursor.getColumnIndex (android.provider.MediaStore.Audio.Media._ID); int artistColumn = musicCursor.getColumnIndex (android.provider.MediaStore.Audio.Media.ARTIST); int albumIDColumn = musicCursor.getColumnIndex(MediaStore.Audio.Media.ALBUM_ID); //add songs to list do { long thisId = musicCursor.getLong(idColumn); String thisTitle = musicCursor.getString(titleColumn); String thisArtist = musicCursor.getString(artistColumn); long thisAlbumID=musicCursor.getLong(albumIDColumn); Uri sArtworkUri = Uri.parse("content://media/external/audio/albumart"); Bitmap albumArtBitMap=null; Uri albumArtUri = ContentUris.withAppendedId(sArtworkUri, thisAlbumID); try { albumArtBitMap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), albumArtUri); Matrix m = new Matrix(); m.setRectToRect(new RectF(0, 0, albumArtBitMap.getWidth(), albumArtBitMap.getHeight()), new RectF(0, 0, 300, 300), Matrix.ScaleToFit.CENTER); albumArtBitMap = Bitmap.createBitmap(albumArtBitMap, 0, 0, albumArtBitMap.getWidth(), albumArtBitMap.getHeight(), m, true); } catch (IOException e) { e.printStackTrace(); } songList.add(new Song(thisId, thisTitle, thisArtist,albumArtBitMap)); } while (musicCursor.moveToNext()); } } 

Quiero que la aplicación sólo escanee cuando haya nuevos archivos. Porque si escanearé toda la tarjeta SD cada vez, tardaré mucho tiempo en iniciar la aplicación. Por favor ayúdame con eso

  • ¿Cómo reanudar el reproductor multimedia?
  • Media Player inicio parada inicio
  • Reproducir un archivo m3u8 local en android mostrando setDataSourceFD failed .: status = 0x80000000
  • ¿Cómo implementar un reproductor de audio para Android usando MediaPlayer y MediaController?
  • MediaPlayer error -2147483648 al reproducir archivos en almacenamiento interno
  • ¿Cómo puedo configurar el permiso de archivo a MODE_WORLD_READABLE?
  • Ayuda de Android: ¿Cómo abrir una URL de archivo de vídeo remota para reproducir en MediaPlayer sin tener que abrir una ventana del navegador?
  • Cómo desarrollar un simple reproductor de audio streaming android?
  • 3 Solutions collect form web for “Quiero evitar que mi aplicación de reproductor de música explore los directorios de archivos de audio cada vez que se inicie la aplicación. ¿Cómo puedo hacer eso?”

    No es necesario guardar todas las canciones en la lista de aplicaciones locales.

    Para mostrar la lista de mp3, puede utilizar el proveedor de contenido cursor lista de consulta del adaptador con límite (en la página de consulta de desplazamiento por página)

    Para buscar utiliza directamente el método de consulta contentprovider.

    Sólo mantenga una lista de reproducción en su base de datos local apuntando a mp3 uri.

    Este enlace puede ayudarte a: ¿Cómo actualizar listview cuyos datos fueron consultados desde la base de datos a través de SimpleCursorAdapter?

    Cada vez que inicies la aplicación, verás cuánto espacio tienes en tu dispositivo.

     File path = Environment.getDataDirectory(); megaBytesAvailable(path) public static float megaBytesAvailable(File file) { StatFs stat = new StatFs(file.getPath()); long bytesAvailable = (long)stat.getBlockSizeLong() * (long)stat.getAvailableBlocksLong(); return bytesAvailable / (1024.f * 1024.f); } 

    Guárdelo en la memoria caché de su aplicación como una variable y compárela cada vez que inicie la aplicación, si es mayor que usted sabe que necesita escanear.

     if(comparedVariable < megaBytesAvailable(music_directory_path)){ getSongList(); //Save it again to compare next time if more storage is used comparedVariable = megaBytesAvailable(music_directory_path); //Save it to SharedPrefs for next boot up comparison } 

    Creo que @royrok respuesta puede ayudarle, donde @royrok comprobar la lista de reproducción en mediastore en su lugar de nuevo la tarjeta SD. A continuación incluyo @royrok respuesta.


    En lugar de volver a explorar la tarjeta, la aplicación itera a través de todas las listas de reproducción de MediaStore y comprueba la longitud del campo _data. Descubrí que para todas las listas sin ningún archivo M3U asociado, este campo siempre estaba vacío. Entonces fue sólo un caso de encontrar el código fuente para la aplicación de música original de Android, encontrar el método de eliminación y el uso de que para eliminar las listas de reproducción con una longitud de 0. He renombrado la aplicación PlaylistPurge (ya que no ' 'Más) y estoy publicando el código de abajo:

     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; } } 

    Aquí está un acoplamiento a una entrada en mi blog sobre la aplicación http://roryok.com/blog/index.php/2010/07/23/clearing-out-deleted-playlists-in-android/


    ACTUALIZAR

    He encontrado un artículo sobre la consulta y eliminación de medios de la MediaStore de Android , he incluido el contenido a continuación. .
    .
    .

    Android proporciona una forma de registrar diferentes tipos de medios, como audio, video e imágenes, para el consumo de cualquier aplicación. Esto es conveniente si su aplicación es, por ejemplo, un reproductor de música o un editor de imágenes. MediaStore de Android es el proveedor de estos metadatos, e incluye información sobre los medios como título, artista, tamaño y ubicación.

    Si su aplicación realiza algún tipo de creación de contenido multimedia, como la edición de imágenes o la descarga de audio desde un sitio web externo, generalmente desea que dicho contenido sea accesible desde cualquier otra aplicación que pueda consumirlo. Cuando crea un archivo, puede usar MediaScannerConnection para agregar el archivo y sus metadatos al MediaStore.

    Si elimina el archivo del sistema de archivos, los metadatos permanecen en el MediaStore hasta que Android explora el sistema para los nuevos medios, lo que suele ocurrir cuando el sistema se inicia o se puede llamar explícitamente de tal manera:

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

    Mientras este método funciona, es consumir tiempo y recursos, ya que básicamente el sistema de archivos completo debe ser re-escaneado. Una alternativa es eliminar explícitamente el archivo del MediaStore. Vamos a discutir dos maneras de hacer esto. El primero es consultar a MediaStore para el contenido, basado en algún predicado, y eliminar basado en el ID único que el MediaStore lo identifica. La segunda, y más fácil, forma de hacerlo es especificar el predicado en la instrucción delete. En este ejemplo, voy a borrar un archivo de audio basado en su nombre de archivo y ruta de acceso, pero puede utilizarlo fácilmente para eliminar cualquier tipo de soporte basado en cualquier información conocida (como duración de vídeo o dimensiones de imagen).

    Al consultar el MediaStore, debe pensar en él como una base de datos SQL. Necesita formar la consulta especificando la tabla (la tabla de contenido externo del MediaStore), las columnas que necesita (el ID del contenido) y la cláusula where (cómo identificar el contenido). Para realizar la consulta real, vamos a utilizar el método query () de ContentResolver .

     String[] retCol = { MediaStore.Audio.Media._ID }; Cursor cur = context.getContentResolver().query( MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, retCol, MediaStore.MediaColumns.DATA + "='" + filePath + "'", null, null); if (cur.getCount() == 0) { return; } cur.moveToFirst(); int id = cur.getInt(cur.getColumnIndex(MediaStore.MediaColumns._ID)); cur.close(); 

    El primer argumento a query () especifica las columnas que queremos devolver, que en este caso es sólo "_ID". El segundo argumento especifica que queremos ver los medios almacenados en la tarjeta SD externa (que sería el almacenamiento interno en dispositivos sin tarjeta SD). El tercer argumento es el predicado que especifica qué contenido estamos buscando. En este caso, estoy identificando el archivo por su ruta en el sistema de archivos (que es lo que se almacena en la columna MediaColumns.DATA). La cuarta y quinta columnas son los argumentos del predicado y el ordenamiento, respectivamente. Estoy incluyendo los argumentos de mi predicado en el predicado en sí mismo, por lo que no es necesario, y si su única búsqueda de un pedazo de contenido y su predicado es lo suficientemente específica como para devolver una fila, entonces el orden no importa.

    Es muy importante que el predicado sea lo suficientemente específico para que esté garantizado que obtenga la ID exacta que está buscando. En mi caso, sé que sólo puede haber un archivo en una ubicación determinada, pero puede utilizar una combinación de cualquier columna (como título, artista y álbum) para encontrar el contenido. Echa un vistazo a las MediaColumns para ver todas las posibilidades.

    Una vez realizada la consulta real, deberá comprobar si el MediaStore contiene realmente el contenido que está intentando eliminar. Si no manejas esto de alguna manera, tu aplicación se bloqueará mientras intentas iterar a través del cursor. Una vez que confirme que la consulta ha devuelto algunos datos, tome el ID moviendo el cursor a su primera posición, leyendo la columna "_ID" y cerrando el cursor. Es muy importante que recuerde cerrar el cursor una vez que haya terminado de usarlo. Su aplicación no se bloqueará, pero obtendrá fugas de memoria y quejas en LogCat.

    Ahora que tenemos el ID que el MediaStore asociado con nuestro contenido, podemos llamar al método delete () de ContentResolver de forma similar a cómo llamamos a su método query ().

     Uri uri = ContentUris.withAppendedId(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, id); context.getContentResolver().delete(uri, null, null); 

    El método delete () toma 3 argumentos: el Uri que se va a eliminar, el predicado y los argumentos de predicado. Formamos el Uri añadiendo el ID que descubrimos consultando el MediaStore al Uri de los archivos de audio en el almacenamiento externo. Puesto que sabemos exactamente qué fila queremos eliminar, no necesitamos especificar el predicado o los argumentos del predicado.

    El segundo método para eliminar el contenido del MediaStore aprovecha el hecho de que la consulta y eliminación de él se realizan casi idénticamente.

     context.getContentResolver().delete(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, MediaStore.MediaColumns.DATA + "='" + path + "'", null); 

    Podemos usar el predicado del método delete () para especificar exactamente lo que queremos eliminar, en lugar de tener que consultarlo de antemano. Si bien este método es más eficiente (sin consulta adicional, sin cursores para tratar con), tiene algunas trampas. No tienes forma de confirmar explícitamente lo que estás borrando. Tampoco puedes realizar consultas avanzadas con este método, por ejemplo, si deseas eliminar el contenido añadido más recientemente (lo que puedes hacer pidiendo la consulta basada en la columna DATE_ADDED). Sin embargo, ambas formas le dan una forma de confirmar lo que ha eliminado ya que el método delete () devuelve el número de filas que eliminó como un entero.

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.