Mostrar toda la música en la tarjeta SD

Estoy usando el código de esta página:

Http://z4android.blogspot.com/2011/06/displaying-list-of-music-files-stored.html

El código está funcionando, pero no tan bueno. Cuando estoy tratando de desplazarse hacia abajo, el ListView sigue repitiendo las canciones en la lista.

He estado buscando algún código alternativo, pero no he encontrado ninguno.

Gracias por cualquier ayuda.

No estoy completamente seguro de lo que causa los problemas que menciona, pero pruebe este código.

private MediaPlayer mMediaPlayer; private String[] mMusicList; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mMediaPlayer = new MediaPlayer(); ListView mListView = (ListView) findViewById(R.id.listView1); mMusicList = getMusic(); ArrayAdapter<String> mAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mMusicList); mListView.setAdapter(mAdapter); mListView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { try { playSong(mMusicList[arg2]); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalStateException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }); } private String[] getMusic() { final Cursor mCursor = managedQuery( MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, new String[] { MediaStore.Audio.Media.DISPLAY_NAME }, null, null, "LOWER(" + MediaStore.Audio.Media.TITLE + ") ASC"); int count = mCursor.getCount(); String[] songs = new String[count]; int i = 0; if (mCursor.moveToFirst()) { do { songs[i] = mCursor.getString(0); i++; } while (mCursor.moveToNext()); } mCursor.close(); return songs; } private void playSong(String path) throws IllegalArgumentException, IllegalStateException, IOException { String extStorageDirectory = Environment.getExternalStorageDirectory() .toString(); path = extStorageDirectory + File.separator + path; mMediaPlayer.reset(); mMediaPlayer.setDataSource(path); mMediaPlayer.prepare(); mMediaPlayer.start(); } 

La respuesta de Andreas es la forma correcta de hacerlo, pero ese código no obtiene la ruta absoluta del archivo. Esto hace que el mMediaPlayer.prepare(); Para lanzar IOException: Prepare failed. status=0x1 IOException: Prepare failed. status=0x1 .

Aquí está el código para obtener la ruta del archivo junto con el nombre del archivo:

 private String[] mAudioPath; private MediaPlayer mMediaPlayer; private String[] mMusicList; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mMediaPlayer = new MediaPlayer(); ListView mListView = (ListView) findViewById(R.id.listView1); mMusicList = getAudioList(); ArrayAdapter<String> mAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mMusicList); mListView.setAdapter(mAdapter); mListView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { try { playSong(mAudioPath[arg2]); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalStateException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }); } private String[] getAudioList() { final Cursor mCursor = getContentResolver().query( MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, new String[] { MediaStore.Audio.Media.DISPLAY_NAME, MediaStore.Audio.Media.DATA }, null, null, "LOWER(" + MediaStore.Audio.Media.TITLE + ") ASC"); int count = mCursor.getCount(); String[] songs = new String[count]; String[] mAudioPath = new String[count]; int i = 0; if (mCursor.moveToFirst()) { do { songs[i] = mCursor.getString(mCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DISPLAY_NAME)); mAudioPath[i] = mCursor.getString(mCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA)); i++; } while (mCursor.moveToNext()); } mCursor.close(); return songs; } 

Ahora que tenemos el camino absoluto, no necesitamos recuperar el camino. Asi que:

  private void playSong(String path) throws IllegalArgumentException, IllegalStateException, IOException { Log.d("ringtone", "playSong :: " + path); mMediaPlayer.reset(); mMediaPlayer.setDataSource(path); //mMediaPlayer.setLooping(true); mMediaPlayer.prepare(); mMediaPlayer.start(); } 

Asegúrese de usar:

 playSong(mAudioPath[arg2]); 

en lugar de:

 playSong(mMusicList[arg2]); 

En el listview OnItemClickListener.

Para obtener sólo el título de la pista (Parece más elegante que el nombre completo del archivo con extensión), utilice:

 `MediaStore.Audio.Media.TITLE` 

en lugar de:

 `MediaStore.Audio.Media.DISPLAY_NAME` 

El código no es super-buggy.

El getView no tiene ningún sentido. ¿Qué es eso gc () haciendo allí ?! Qué es con todas las llamadas de moveToPosition ().

Aquí está el código reescrito

  public View getView(int position, View convertView, ViewGroup parent) { TextView tv = null; String id = null; if (convertView == null) { tv = new TextView(getApplicationContext()); } else tv = (TextView) convertView; music_column_index = musiccursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DISPLAY_NAME); id = musiccursor.getString(music_column_index); music_column_index = musiccursor.getColumnIndexOrThrow(MediaStore.Audio.Media.SIZE); id += " Size(KB): " + musiccursor.getString(music_column_index); tv.setText(id); return tv; } 

Prueba este código

 public View getView(int position, View convertView, ViewGroup parent) { System.gc(); String id = null; TextView tv; if (convertView == null) { tv = new TextView(mContext.getApplicationContext()); } else{ tv = (TextView) convertView; } musiccursor.moveToPosition(position); music_column_index = musiccursor .getColumnIndexOrThrow(MediaStore.Audio.Media.DISPLAY_NAME); id = musiccursor.getString(music_column_index); music_column_index = musiccursor.getColumnIndexOrThrow(MediaStore.Audio.Media.SIZE); id += " Size(KB):" + musiccursor.getString(music_column_index); tv.setText(id); return tv; } 
  • Necesita ayuda para emular el Samsung Galaxy Nexus con AVD
  • Cómo escanear la tarjeta SD para la extensión particular de los archivos en android?
  • Si mi aplicación está instalada en la tarjeta SD, ¿también hay datos privados allí?
  • ¿Cómo puedo copia de seguridad de archivos sqlite en tarjeta SD mediante programación?
  • Java.io.FileNotFoundException (permiso denegado) Al intentar escribir en el sdcard de Android
  • Creación de un archivo zip con algunos archivos en SDCard
  • ¿Cómo puedo obtener el tamaño de una carpeta en una tarjeta SD en Android?
  • No se puede crear una carpeta en sdcard - mkdir siempre devuelve false
  • Android - Aplicación (apk) Tamaño máximo
  • Instalación de la aplicación en la tarjeta SD en Android sdk 2.2
  • Cómo crear un archivo de imagen de tarjeta SD para el emulador de Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.