2016-06-12 5 views
1

장치에서 내부 및 외부 저장소에있는 모든 오디오 파일을 가져 오려고합니다. mediastorage 및 커서를 사용하고 있습니다. 그러나 노래 검색에 대한 적절한 예는 얻을 수 없습니다.저장 장치에서 오디오 파일 가져 오기

public class MainActivity extends ListActivity { 
Cursor cursor; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    String[] columns = { MediaStore.Audio.Media._ID }; 
    int[] displayViews = new int[] {android.R.id.text1}; 
    ContentResolver cr = this.getContentResolver(); 
    cursor = cr.query(MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI,columns, null, null, null); 
    setListAdapter(new SimpleCursorAdapter(this,android.R.layout.simple_list_item_1,cursor,columns,displayViews,1)); 
} 

public static ArrayList<SongDto> getMusicInfos(Context context) { 

    ArrayList<SongDto> musicInfos = new ArrayList<SongDto>(); 

    Cursor cursor = context.getContentResolver().query(
      MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null, 
      MediaStore.Audio.Media.DEFAULT_SORT_ORDER); 
    if (cursor == null) { 
     return null; 
    } 


    for (int i = 0; i < cursor.getCount(); i++) { 
     cursor.moveToNext(); 


     int isMusic = cursor.getInt(cursor 
       .getColumnIndex(MediaStore.Audio.Media.IS_MUSIC)); 

     if (isMusic != 0) { 
      SongDto music = new SongDto(); 


      music.path = cursor.getString(cursor 
        .getColumnIndexOrThrow(MediaStore.Audio.Media.DATA)); 

      if (!new File(music.path).exists()) { 
       continue; 
      } 


      music.songId = cursor.getLong(cursor 
        .getColumnIndexOrThrow(MediaStore.Audio.Media._ID)); 

      music.songTitle = cursor.getString(cursor 
        .getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE)); 


      music.songTitle = cursor.getString(cursor 
        .getColumnIndex(MediaStore.Audio.Media.DISPLAY_NAME)); 


      music.album = cursor.getString(cursor 
        .getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM)); 


      music.songArtist = cursor.getString(cursor 
        .getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST)); 

      music.duration = cursor 
        .getLong(cursor 
          .getColumnIndexOrThrow(MediaStore.Audio.Media.DURATION)); 

      MediaMetadataRetriever mmr = new MediaMetadataRetriever(); 
      mmr.setDataSource(music.path); 
      mmr.release(); 

      musicInfos.add(music); 
     } 
    } 

    return musicInfos; 
} 
} 

public class SongDto { 

public long songId; 
public String songTitle; 
public String songArtist; 
public String path; 
public short genre; 
public long duration; 
public String album; 
public Bitmap albumArt; 

public String toString() { 
    return String.format("songId: %d, Title: %s, Artist: %s, Path: %s, Genere: %d, Duration %s", 
      songId, songTitle, songArtist, path, genre, duration); 
} 
} 

이와 나는이 노래를 얻는 방법 사용되지 않습니다으로 SimpleCursorAdapter를 고정 무슨 내가 런타임 오류가 점점 오전 :

은이 코드를 사용 어댑터를 설정할 때 어떤 예나 힌트가 도움이 될 것입니다.

+0

[this] (http://stackoverflow.com/a/18268013/5067493)가 도움이 될 수 있습니다. –

+0

고정 된 폴더에서 노래를 가져올 수 있지만 mediastore를 통해 가능할 수있는 모든 노래를 다른 방법으로 만 가져오고 싶습니다. –

답변

0

원하는 경우 파일 브라우저를 구현할 수 있습니다. 다음 예제에서 파일 브라우저 및 폴더 브라우저 구현을 찾을 수 있습니다. Link

+0

미디어 플레이어에서 작업하고 있습니다. 장치에서 오디오 파일을 가져 오는 데 더 많은 시간이 필요하므로 미디어 저장소 및 커서 방식을 통해 이동해야하므로이 방법으로 앨범 아트, 아티스트 등과 같은 모든 미디어 세부 정보를 얻을 수 있습니다. –