6

Je me heurte à un roadblock intégrant de la musique dans mon application Android. L'objectif est de permettre aux utilisateurs de voir les chansons auxquelles ils ont déjà accès, via Google Play Musique (ou tout autre lecteur tel que Winamp, Poweramp, doubleTwist, etc.). Jusqu'ici, j'ai essayé quelques approches, mais chacune a des problèmes.Comment permettre aux utilisateurs de voir et de lire des morceaux sur Android auxquels ils ont déjà accès (par exemple, via Google Play)?

Approche # 1: Utilisez une requête ContentResolver pour obtenir les playlists & chansons de Google Play Musique, puis jouer en utilisant MediaPlayer

D'abord, obtenir un curseur sur les listes de lecture:

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

Ensuite, itérer pour obtenir les chansons dans chaque liste de lecture, et lisez-les comme ceci:

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

k pour obtenir les playlists et les chansons, mais vous ne pouvez pas les lire (même si vous autorisez Google Play Musique à "Conserver sur l'appareil"). Plus précisément, le code suivant ne joue pas une chanson donnée trouvée comme ci-dessus:

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

En fait, je l'ai scanné l'appareil, et n'ont pas été en mesure de trouver les fichiers partout (même si je l'ai confirmé qu'ils sont locales en désactivant complètement le réseau - sur les deux Galaxy Nexus et Galaxy S3).

Approche # 2: Invoke Google Play Musique, ou tout autre joueur, en utilisant une intention

Selon this post, vous pouvez simplement invoquer le joueur en utilisant Intentions, comme ceci:

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

Mais Je ne pense pas que cette approche permette un quelconque contrôle - par exemple, passer une chanson spécifique à jouer, ou être averti quand une chanson est jouée. En outre, @CommonWares souligne que l'application musicale et ses intentions ne font pas partie de l'API publique du SDK Android, et pourraient changer sans avertissement.

La fonctionnalité de base que j'essaie d'atteindre existe dans iOS, grâce à une intégration étroite avec iTunes. Je pense que Google voudrait réaliser le même type d'intégration, car cela pourrait signifier vendre beaucoup plus de musique dans le Play Store.

En résumé: Est-il possible de laisser les utilisateurs voir & jouer des chansons auxquelles ils ont déjà accès sur Android? Quelle est la meilleure façon de le faire avec Google Play Musique ou toute autre application? Merci.

+1

MISE À JOUR: jusqu'à ce que je trouve une bonne réponse pour l'intégration avec Google Play Musique ou un autre lecteur de musique, je viens développé une interface qui lit et lit les fichiers musicaux stockés localement sur l'appareil (à l'aide d'une requête ContentResolver pour trouver les chansons, et MediaPlayer pour les jouer). Cela semble fonctionner, mais il laisse l'utilisateur déplacer des fichiers musicaux mp3 et autres sur l'appareil. Je préférerais toujours trouver une solution qui le rende facile pour tout le monde en fournissant une bonne intégration avec un lecteur de musique populaire .... Quelqu'un? – gcl1

+0

Je pense que votre approche # 1 devrait fonctionner si vous obtenez l'URL de streaming correspondant à la piste sélectionnée et la transmettez au MediaPlayer. –

+0

La dernière fois que j'ai essayé en décembre, je n'ai pas réussi à faire fonctionner l'approche n ° 1. Mais je serais très intéressé de savoir si vous l'avez réellement fait. En attendant, comme je l'ai dit dans le commentaire UPDATE, je laisse juste les utilisateurs jouer de la musique qui est stockée localement sur l'appareil. Merci. – gcl1

Répondre

1

Approche # 1 fonctionne un peu (testé avec de la musique locale sur l'appareil), merci OP pour la direction.

Notes:

  • Nous jouons avec une API interne non documentée ici - ce n'est pas fiable.
  • Je n'ai pas accès à de la musique en ligne/achetée dans Google Jouer de la musique, donc la réponse se réfère à la musique stockée localement uniquement.

Le code ci-dessous écrira tous les morceaux d'une liste de lecture et jouera le dernier.

Notez la colonne "SourceId" - c'est l'identifiant audio que vous utiliseriez selon documentation. Je l'ai trouvé en itérant sur toutes les colonnes retournées par le curseur. Il y a plusieurs autres colonnes intéressantes, comme "hasLocal", "hasRemote" qui pourrait (ou non) se référer à l'endroit où la musique est stockée.

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