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
- Instalación de la aplicación Android sin tarjeta SD
- SQLiteOpenHelper - crear base de datos en tarjeta SD
- Conseguir todo el espacio total y disponible en Android
- Carga dibujable desde la tarjeta sd
- Android FileProvider para ext sdcard
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.
- Android: buenas prácticas para organizar dirs y archivos en almacenamiento Tarjeta SD?
- Error al empujar el elemento (s). En android
- Sistema de archivos de la tarjeta SD de Android
- Cómo leer un archivo de texto seleccionado de sdcard en android
- Ruta de archivo SDCard externa para Android
- ¿Cómo implementar SD Card Gallery sin personalización en android?
- ¿Cómo se hace un apk crear un archivo en el sdcard cuando el apk está instalado?
- FileNotFoundException + Escribir un archivo en la tarjeta SD
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; }
- Border-radius no funciona en el moderno navegador nativo de Android
- ¿Cómo hacer la actividad no a pantalla completa?