2012-01-24 8 views
7

上のすべての音楽:表示私は、コードフォームこのページを使用しているSDカード

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

コードが動作しますが、洙良いされていません。 私がスクロールしようとしているとき、ListViewはリスト内の曲を繰り返し続けます。

私は代替コードを探していましたが、何も見つかりませんでした。

ありがとうございました。

答えて

10

あなたが言及した問題を引き起こす原因は完全にはわかりませんが、このコードを試してみてください。

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

これは、IOExceptionが発生します失敗した準備をします。 status mMediaPlayer.prepare();行でステータス= 0x1。 –

+0

IOExceptionの取得に失敗しましたステータス= 0x1 !!! –

-1

コードにスーパーバギーがあります。

getViewは意味を持ちません。あのgc()は何してるの?すべてのmoveToPosition()呼び出しは何ですか?ここで

 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

"そこのコード"は@ nikos-leonovによるものを意味しますか? – Gabor

+0

はい、コードは@Nikos Leonovのコードを参照しています。彼は答えを更新したので、今すぐokです:D –

-1

書き換えコードが

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

このコードを試してみてくださいだアンドレアスの答えは、これを行うには正しい方法ですが、そのコードは、絶対ファイルパスを取得できません。 これにより、mMediaPlayer.prepare();IOException: Prepare failed. status=0x1をスローします。

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

今、私たちは絶対パスを持っていることを、我々は再びパスを取得する必要はありません。ここで

は、ファイル名と一緒にファイルパスを取得するためのコードです。だから、:

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

は必ず使用してください:代わりの

playSong(mAudioPath[arg2]); 

playSong(mMusicList[arg2]); 

をリストビューOnItemClickListenerに。

トラックのタイトルだけを取得するには(拡張子を持つファイル名全体よりもエレガントに見える)を使用します。

`MediaStore.Audio.Media.TITLE` 

の代わり:

`MediaStore.Audio.Media.DISPLAY_NAME` 
+0

あなたはgetAudioList()を呼び出さない – Leo

+1

私は編集を行いました。ありがとうございました! :) –

+0

ファイルのリストを取得する方法はいくつかの期間よりも短いですか? –

関連する問題