6

Tôi đang chạy vào khoanh vùng tích hợp nhạc vào ứng dụng Android của mình. Mục tiêu chỉ để cho phép người dùng xem & phát các bài hát mà họ đã có quyền truy cập, thông qua Google Play Âm nhạc (hoặc bất kỳ trình phát nào khác như Winamp, Poweramp, doubleTwist, v.v.).Cách cho phép người dùng xem và phát các bài hát trên Android mà họ đã có quyền truy cập (ví dụ: qua Google Play)?

Cho đến giờ, tôi đã thử một vài cách tiếp cận, nhưng mỗi vấn đề đều có vấn đề.

Approach # 1: Sử dụng một truy vấn ContentResolver để có được danh sách nhạc & bài hát từ Google Play Âm nhạc, sau đó chơi sử dụng MediaPlayer

Đầu tiên, có được một con trỏ trên danh sách chơi:

String[] proj = { MediaStore.Audio.Playlists.NAME, 
        MediaStore.Audio.Playlists._ID }; 
Uri playlistUri = Uri.parse("content://com.google.android.music.MusicContent/playlists"); 
Cursor playlistCursor = getContentResolver().query(playlistUri, proj, null, null, null); 

Sau đó, lặp lại để tải các bài hát trong mỗi danh sách phát và đọc chúng như sau:

String[] proj2 = { MediaStore.Audio.Playlists.Members.TITLE, 
        MediaStore.Audio.Playlists.Members._ID }; 
String playListRef = "content://com.google.android.music.MusicContent/playlists/" + playListId + "/members"; 
Uri songUri = Uri.parse(playListRef); 
Cursor songCursor = getContentResolver().query(songUri, proj2, null, null, null); 

Điều này wor ks để tải danh sách phát và bài hát, nhưng sau đó bạn không thể chơi chúng (ngay cả khi bạn yêu cầu Google Play Âm nhạc "Lưu trên thiết bị"). Cụ thể, các mã sau đây không chơi một bài hát được tìm thấy như trên:

mediaPlayer = new MediaPlayer(); 
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 
try { 
    mediaPlayer.setDataSource(dataPath); 
    mediaPlayer.prepare(); 
    mediaPlayer.start(); 
} catch (Exception e) {} 

Trong thực tế, tôi đã quét các thiết bị, và đã không thể tìm thấy các tập tin bất cứ nơi nào (mặc dù tôi đã khẳng định họ là địa phương bằng cách vô hiệu hóa hoàn toàn mạng - trên cả Galaxy Nexus và Galaxy S3).

Cách tiếp cận # 2: Gọi Google Play Music, hoặc cầu thủ khác, sử dụng Intent

Theo this post, bạn chỉ có thể gọi các cầu thủ sử dụng Intents, như thế này:

Intent intent = new Intent(); 
intent.setAction(android.content.Intent.ACTION_VIEW); 
File file = new File(YOUR_SONG_URI); 
intent.setDataAndType(Uri.fromFile(file), "audio/*"); 
startActivity(intent); 

Nhưng Tôi không nghĩ rằng phương pháp này cho phép bất kỳ loại điều khiển nào - ví dụ, truyền một bài hát cụ thể để được phát hoặc được thông báo khi một bài hát được thực hiện đang được phát. Hơn nữa, @CommonWares chỉ ra rằng ứng dụng âm nhạc và Mục đích của nó không phải là một phần của API công khai của Android SDK và có thể thay đổi mà không cần cảnh báo.

Chức năng cơ bản mà tôi đang cố gắng đạt được tồn tại trong iOS, nhờ tích hợp chặt chẽ với iTunes. Tôi nghĩ rằng Google sẽ muốn đạt được cùng một loại tích hợp, vì nó có thể có nghĩa là bán được nhiều nhạc hơn trong cửa hàng Play.

Tóm tắt: Có thể cho phép người dùng xem & phát các bài hát mà họ đã có quyền truy cập trên Android không? Cách tốt nhất để làm điều này với Google Play Âm nhạc hoặc bất kỳ ứng dụng nào khác? Cảm ơn.

+1

CẬP NHẬT: cho đến khi tôi tìm thấy câu trả lời hay để tích hợp với Google Play Âm nhạc hoặc trình phát nhạc khác, tôi vừa phát triển giao diện đọc và phát tệp nhạc được lưu trữ cục bộ trên thiết bị (sử dụng truy vấn ContentResolver) các bài hát và MediaPlayer để phát chúng). Điều này dường như làm việc tốt, nhưng nó để nó lên cho người dùng di chuyển mp3 và các tập tin âm nhạc khác vào thiết bị. Tôi vẫn muốn tìm một giải pháp mà làm cho nó dễ dàng cho tất cả mọi người bằng cách cung cấp tích hợp tốt với một máy nghe nhạc phổ biến .... Bất cứ ai? – gcl1

+0

Tôi nghĩ cách tiếp cận # 1 của bạn sẽ hoạt động nếu bạn có được url trực tuyến tương ứng với bản nhạc đã chọn và chuyển nó tới MediaPlayer. –

+0

Khi tôi thử lại lần cuối vào tháng 12, tôi không thể thực hiện phương pháp # 1. Nhưng tôi sẽ rất quan tâm để biết nếu bạn đã thực sự thực hiện nó. Trong khi chờ đợi, như tôi đã nói trong bình luận UPDATE, tôi chỉ cho phép người dùng phát nhạc được lưu trữ cục bộ trên thiết bị. Cảm ơn. – gcl1

Trả lời

1

Cách tiếp cận # 1 kinda hoạt động (được thử nghiệm với nhạc cục bộ trên thiết bị), nhờ OP cho hướng.

Ghi chú:

  • Chúng tôi đang chơi với một API nội bộ không có giấy tờ ở đây - nó không đáng tin cậy.
  • Tôi không có quyền truy cập vào nhạc đã mua/trực tuyến trong Google Phát nhạc, vì vậy câu trả lời chỉ đề cập đến nhạc được lưu trữ cục bộ.

Mã bên dưới sẽ lặp trên tất cả các bài hát trong danh sách phát và phát bài hát cuối cùng.

Lưu ý cột "SourceId" - đó là id âm thanh bạn muốn sử dụng theo documentation. Tôi đã tìm thấy nó bằng cách lặp lại trên tất cả các cột được con trỏ trả về. Có một số cột thú vị hơn ở đó, như "hasLocal", "hasRemote" có thể (hoặc không) tham chiếu đến nơi lưu trữ nhạc.

String[] proj2 = { "SourceId", MediaStore.Audio.Playlists.Members.TITLE, MediaStore.Audio.Playlists.Members._ID }; 
String playListRef = "content://com.google.android.music.MusicContent/playlists/" + playListId + "/members"; 
Uri songUri = Uri.parse(playListRef); 
Cursor songCursor = getContentResolver().query(songUri, proj2, null, null, null); 

long audioId = -1; 
while (songCursor.moveToNext()) { 
    audioId = songCursor.getLong(songCursor.getColumnIndex("SourceId")); 
    String title = songCursor.getString(songCursor.getColumnIndex(MediaStore.Audio.Playlists.Members.TITLE)); 
    Log.v("", "audioId: " + audioId + ", title: " + title); 
} 
songCursor.close(); 

MediaPlayer mpObject = new MediaPlayer(); 
try { 
    if (audioId > 0) { 
     Uri contentUri = ContentUris.withAppendedId(android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, Long.valueOf(audioId)); 
     mpObject.setAudioStreamType(AudioManager.STREAM_MUSIC); 
     mpObject.setDataSource(this, contentUri); 
     mpObject.prepare(); 
     mpObject.start(); 

    } 
} catch (Exception e) { 
    e.printStackTrace(); 
} 
Các vấn đề liên quan