2012-01-24 22 views

risposta

10

Non sono del tutto sicuro di quello che fa sì che i problemi di cui parli, ma provare 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(); 
} 
+4

provoca IOException: Preparare riuscita. stato = 0x1 alla riga mMediaPlayer.prepare(); –

+0

Getting IOException prepara lo stato fallito = 0x1 !!! –

-1

Il codice non è super-buggy.

Il getView non ha alcun senso. Cosa sta facendo gc() lì ?! Cosa succede 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; 
     } 
+1

"il codice lì" indica quello di @ nikos-leonov? – Gabor

+0

Sì, il codice qui si riferisce al codice di @Nikos Leonov. Egli ha aggiornato la sua risposta alla parità di mio, quindi il suo ok ora: D –

-1

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

Andreas risposta è il modo giusto per fare questo, ma che il codice non ottenere il percorso di file assoluto. Questo fa sì che il mMediaPlayer.prepare(); di gettare IOException: Prepare failed. status=0x1.

ecco il codice per ottenere il percorso del file con il 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 percorso assoluto, non abbiamo bisogno di ottenere di nuovo il percorso. Quindi:

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

assicurarsi di utilizzare:

playSong(mAudioPath[arg2]); 

invece di:

playSong(mMusicList[arg2]); 

nel OnItemClickListener ListView.

Per ottenere solo il titolo del brano (Sembra più elegante di tutto il nome di file con estensione) utilizzare:

`MediaStore.Audio.Media.TITLE` 

invece di:

`MediaStore.Audio.Media.DISPLAY_NAME` 
+0

Lei non chiama getAudioList() – Leo

+1

Ho fatto una modifica. Grazie! :) –

+0

Come ottenere l'elenco dei file meno di una certa durata? –

Problemi correlati