2012-01-24 13 views

Odpowiedz

10

Nie jestem do końca pewien, co dokładnie powoduje problemy, o których wspomniałeś, ale spróbuj tego kodu.

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

Powoduje IOException: przygotować się niepowodzeniem. status = 0x1 w linii mMediaPlayer.prepare(); –

+0

Uzyskanie wyjątku IOException status = 0x1 !!! –

-1

Kod jest bardzo skomplikowany.

Numer getView nie ma żadnego sensu. Co tam robi gc() ?! Co zawiera wszystkie wywołania moveToPosition().

Oto kod przepisany

 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

"kod tam" oznacza ten przez @ nikos-leonov? – Gabor

+0

Tak, kod tam odnosi się do kodu przez @ Nikos Leonow. Zaktualizował swoją odpowiedź na równą sobie, więc teraz jest ok: D –

-1

wypróbować ten kod

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 odpowiedź jest właściwym sposobem, aby to zrobić, ale że kod nie uzyskać bezwzględną ścieżkę do pliku. Powoduje to, że mMediaPlayer.prepare(); rzuca IOException: Prepare failed. status=0x1.

Oto kod, aby uzyskać ścieżkę wraz z nazwą pliku:

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

Teraz, gdy mamy absolutną ścieżkę, nie musimy uzyskać ścieżkę ponownie. Więc:

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

Należy używać:

playSong(mAudioPath[arg2]); 

zamiast:

playSong(mMusicList[arg2]); 

w OnItemClickListener listview.

Aby uzyskać tylko tytuł utworu (wygląda bardziej elegancki niż cała nazwa pliku z rozszerzeniem) używać:

`MediaStore.Audio.Media.TITLE` 

zamiast:

`MediaStore.Audio.Media.DISPLAY_NAME` 
+0

Nie nazywasz getAudioList() – Leo

+1

Dokonałem edycji. Dziękuję Ci! :) –

+0

Jak uzyskać listę plików mniej niż niektóre Duration? –

Powiązane problemy