Mostra tutta la musica sulla scheda SD

Sto usando il codice in questa pagina:

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

  • Cambiare la lingua in modo dinamico utilizzando il supporto multilingua android?
  • Android: Spinner Progress Dialog non gira
  • Come faccio a risolvere tutto ciò che causa questo per inondare il mio logcat: I / System.out: (HTTPLog) -Static: isSBSettingEnabled false
  • Convertire latitudine e longitudine in esri arcGIS MapPoint
  • Miglior modo per creare una barra degli strumenti in fondo in android.
  • Che cosa significa "@ + id"?
  • Il codice funziona, ma non soo bene. Quando cerco di scorrere verso il basso, il ListView continua a ripetere le canzoni nell'elenco.

    Ho cercato un codice alternativo, ma non ho trovato alcuna.

    Grazie per qualsiasi aiuto.

  • Qual è la differenza tra Attività e Context?
  • priorità in un ricevitore broadcast per ricevere chiamate
  • Inviare l'email HTML con Gmail 4.2.1
  • Login di Twitter di Android non funziona con Fabric SDK - La chiamata non deve essere nulla
  • Android - Perché onItemLongClick (...) restituisce un boolean?
  • Valore restituito di Android in AsyncTask onPostExecute utilizzando l'interface
  • 4 Solutions collect form web for “Mostra tutta la musica sulla scheda SD”

    Non sono del tutto esattamente esattamente cosa provoca i problemi citati, ma provate questo codice.

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

    Andreas risponde è il modo giusto per farlo ma quel codice non ottiene il path del file assoluto. Ciò causa il mMediaPlayer.prepare(); per buttare IOException: Prepare failed. status=0x1 IOException: Prepare failed. status=0x1 .

    Ecco il codice per get il path del file insieme al nome del file:

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

    Ora che abbiamo il path assoluto, non abbiamo bisogno di get il path. Così:

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

    Assicurati di utilizzare:

     playSong(mAudioPath[arg2]); 

    invece di:

     playSong(mMusicList[arg2]); 

    nell'elenco OnItemClickListener.

    Per get solo il titolo della traccia (sembra più elegante di tutto il nome di file con estensione) utilizzare:

     `MediaStore.Audio.Media.TITLE` 

    invece di:

     `MediaStore.Audio.Media.DISPLAY_NAME` 

    Il codice è super-buggy.

    Il getView non ha alcun senso. Che cos'è che gc () sta facendo lì ?! Che cosa è con tutte le chiamate moveToPosition ().

    Ecco il codice riscritto

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

    provare questo codice

     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; } 
    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.