データ抽出


これは私が書いた組織文章の移植です.

導入する


今回の位置決めでは、前回の位置決め設計を基に、Android内部の音源ファイルのディレクトリを出力します.

データ抽出中のデータストリーム



1.スマートフォンのリポジトリに存在する音楽を抽出します.
2.予め定義されたモデル(Music)クラスに格納される.
3.その後音楽リストを表示するListActivityと音楽を実行するActivityはともにモデル(Music)を使用するため、BaseActivityを継承して使用する.(データが存在する場合は、再ロードしません.)

問題と解決


当初の設計では、シナリオは、ユーザが音楽リストで所望の音楽(ListActivity)をクリックして音楽を再生する方法(PlayMainViewActivity)のみを考慮していた.
でも!商用の音楽プレーヤーには、Androidのプロンプトバーで音楽をクリックするとすぐに音楽を再生する方法も提供されている(PlayMainViewActivity).
次のように設計を変更します.
AS-ISTO-BE

コード#コード#

/**
 * MusicDataController.class
 * Created by Heepie on 2017. 10. 12..
 * Music 데이터를 관리하는 Controller 클래스
 */
 
public class MusicDataController {
    // for Singleton Pattern
    private static MusicDataController instance;
    private ArrayList<Music> list;
 
    private MusicDataController() {
        list = new ArrayList<>();
    }
 
    public static MusicDataController getInstance() {
        if (instance == null)
            instance = new MusicDataController();
        Log.i("heepie", instance + "");
        return instance;
    }
 
    public ArrayList<Music> getList() {
        return list;
    }
 
    public boolean isExistMusicList() {
        return !list.isEmpty();
    }
 
    // 음악 데이터를 로드하는 메소드
    public void load(Context context) {
 
        ContentResolver resolver = context.getContentResolver();
        // 1. 테이블 명 정의
        Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
 
        // 2. 불러올 컬럼명 정의
        String proj[] = {
                MediaStore.Audio.Media._ID,
                MediaStore.Audio.Media.ALBUM_ID,
                MediaStore.Audio.Media.TITLE,
                MediaStore.Audio.Media.ARTIST,
                MediaStore.Audio.Media.DURATION
        };
        // 3. 타이틀을 기준으로 정렬하는 쿼리
        Cursor cursor = resolver.query(uri, proj, null, null, proj[2]+" ASC");
        // 4. 쿼리결과가 담긴 커서를 통해 데이터 꺼내기
        if(cursor != null){
            while(cursor.moveToNext()){
                Music item = new Music();
 
                item.setMusicId(getValue(cursor, proj[0]));
                item.setAlbumId(getValue(cursor, proj[1]));
                item.setArtist(getValue(cursor, proj[2]));
                item.setTitle(getValue(cursor, proj[3]));
 
                item.setSecDuration(Integer.parseInt(getValue(cursor, proj[4]))/1000);
                item.setMusicUri(makeMusicUri(item.getMusicId()));
                item.setAlbumUri(makeAlbumUri(item.getAlbumId()));
 
                list.add(item);
            }
            cursor.close();
        }
    }
 
    private String getValue(Cursor cursor, String name){
        int index = cursor.getColumnIndex(name);
        return cursor.getString(index);
    }
 
    // musicId를 통해 MusicURI를 만드는 메소드
    private Uri makeMusicUri(String musicId){
        Uri contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
        return Uri.withAppendedPath(contentUri, musicId);
    }
 
    // albumId를 통해 albumURI를 만드는 메소드
    private Uri makeAlbumUri(String albumId){
        String contentUri = "content://media/external/audio/albumart/";
        return Uri.parse(contentUri + albumId);
    }
}

スクリーンショット



(音源-https://www.soundhelix.com/audio-examples)