[안드로이드] 다른 앱에서 재생 중인 음악의 파일 경로를 가져 올 수 있는 방법이 있을까요?

조회수 2271회

마시멜로부터 권한 관련되서 바뀌어 버린터라.. 지원 중단 된 기존 앱을 이용 할 수 없어 직접 제작 중에 있습니다. 소니에서 제공하는 익스텐션을 통하여 소니 음악 앱에서 음악 정보를 가져오고 싶은데 제조사 예제에서는 getIntent() 사용하더라구요.. 근데 이 방법은 트랙을 넘길 경우에 다음곡을 가져오지 못하고 처음에 가져온 음악만 계속 가져오네요 ㅠㅠ 혹시 방법이 있을까요?

  • (•́ ✖ •̀)
    알 수 없는 사용자
  • 소니에서 제공하는 API 문서와 지원 중단 되었다는 기존 앱의 정보를 알려주실 수 있을까요? 알 수 없는 사용자 2016.5.31 12:21

1 답변

  • 뮤직 앱에서 음원이 재생될 때 브로드캐스트 리시버를 통해 현재 재생 중인 음원의 정보를 (다른 앱에서도) 수신 받을 수 있습니다. 브로드캐스트 리시버를 통해 전달된 음원의 정보를 이용해서 폰의 미디어 DB를 쿼리하면 현재 재생 중인 음원의 파일 경로를 가져올 수 있습니다.

    조금 더 자세히 설명을 하면 브로드캐스트 리시버로 전달되는 Intent에는 다음과 같은 정보가 담겨있습니다.

    action: com.android.music.playstatechanged
    [duration=287124]
    [playstate=false]
    [woodstock=false]
    [currentContainerName=Stop the Clocks]
    [artist=Oasis]
    [domain=0]
    [currentSongLoaded=true]
    [preparing=false]
    [isPodcast=false]
    [rating=0]
    [albumId=920369031]
    [songId=1303]
    [currentContainerTypeValue=7]
    [currentContainerId=920369031]
    [playing=false]
    [streaming=false]
    [inErrorState=false]
    [currentContainerExtData=null]
    [album=Stop the Clocks]
    [local=true]
    [track=Dont Look Back in Anger]
    [videoId=null]
    [position=9394]
    [currentContainerExtId=null]
    [videoThumbnailUrl=null]
    [isDoubleclickAd=false]
    [supportsRating=true]
    [ListSize=1]
    [previewPlayType=-1]
    [trackMetajamId=null]
    [isSoundAd=false]
    [isSkipLimitReached=false]
    [ListPosition=0]
    

    참고로 댬겨있는 정보의 양은 뮤직 앱에 따라 다릅니다. 위 결과는 넥서스 6P의 구글뮤직 앱으로 확인한 결과입니다.

    몇몇 뮤직 앱에서 테스트를 해보니 위 정보 중 track이 타이틀을 의미하고요. 이 track 정보를 이용해서 다음과 같이 미디어 DB를 쿼리해 DATA 컬럼에 담겨있는 정보를 가져오면 음원의 파일 경로를 알 수 있습니다. (예외처리는 되어있지 않으니 참고만 하세요)

    Cursor cursor = null;
    try {
        cursor = getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
            null,
            MediaStore.Audio.Media.TITLE_KEY + "=?",
            new String[] {MediaStore.Audio.keyFor(intent.getExtras().getString("track"))},
            null);
        if (cursor != null) {
            List<String> paths = new ArrayList<>();
            while (cursor.moveToNext()) {
                String path = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA));
                paths.add(path);
            }
        }
    } finally {
        if (cursor != null) {
            cursor.close();
        }
    }
    

    구글뮤직에서 음원 재생 후 위 코드를 이용하면 재생 중인 음원의 경로를 다음과 같이 가져올 수 있습니다.

    [/storage/emulated/0/KakaoTalkDownload/oasis_Dont_Look_Back_in_Anger.mp3]
    

    추가로 뮤직앱들이 전달하는 인텐트의 액션이 제각각이어서 동작하지 않을 수 있으니 관련 사항은. 다음글을 참고하세요.

    • (•́ ✖ •̀)
      알 수 없는 사용자
    • 덧글에 답변도 못 드렸는데 답변 감사드립니다 (꾸벅) 소니 음악앱 경우에는 TRACK_NAME으로 되어 있네요. 알 수 없는 사용자 2016.6.2 07:54

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)