From d411b339837b801cf468fbed8c996e4d5d54f14f Mon Sep 17 00:00:00 2001 From: Feng Zheng Date: Thu, 23 Mar 2017 20:47:14 -0500 Subject: [PATCH 1/3] Fix: can't play media files from file browser When media file is selected from various file browers, the uri sent to app might be different scheme like file or content. Fix is to query the media file based on different scheme. --- .../gramophone/helper/MusicPlayerRemote.java | 39 ++++++++++++++----- .../ui/activities/MainActivity.java | 3 +- 2 files changed, 31 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/com/kabouzeid/gramophone/helper/MusicPlayerRemote.java b/app/src/main/java/com/kabouzeid/gramophone/helper/MusicPlayerRemote.java index 49746224..4108af17 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/helper/MusicPlayerRemote.java +++ b/app/src/main/java/com/kabouzeid/gramophone/helper/MusicPlayerRemote.java @@ -2,11 +2,14 @@ package com.kabouzeid.gramophone.helper; import android.app.Activity; import android.content.ComponentName; +import android.content.ContentResolver; import android.content.Context; import android.content.ContextWrapper; import android.content.Intent; import android.content.ServiceConnection; +import android.net.Uri; import android.os.IBinder; +import android.provider.DocumentsContract; import android.provider.MediaStore; import android.support.annotation.NonNull; import android.support.annotation.Nullable; @@ -17,6 +20,7 @@ import com.kabouzeid.gramophone.loader.SongLoader; import com.kabouzeid.gramophone.model.Song; import com.kabouzeid.gramophone.service.MusicService; +import java.io.File; import java.util.ArrayList; import java.util.Random; import java.util.WeakHashMap; @@ -374,17 +378,34 @@ public class MusicPlayerRemote { return -1; } - public static void playFile(String path) { - if (musicService != null) { - ArrayList songs = SongLoader.getSongs(SongLoader.makeSongCursor( - musicService, - MediaStore.Audio.AudioColumns.DATA + "=?", - new String[]{path} - )); - if (!songs.isEmpty()) { + public static void playFromUri(Uri uri) { + if (musicService != null && uri.getScheme() != null) { + ArrayList songs = null; + if (uri.getScheme().equals(ContentResolver.SCHEME_CONTENT)) { + String songId = null; + if (uri.getAuthority().equals("com.android.providers.media.documents")) { + songId = DocumentsContract.getDocumentId(uri).split(":")[1]; + } else if (uri.getAuthority().equals("media")) { + songId = uri.getLastPathSegment(); + } + if (songId != null) { + songs = SongLoader.getSongs(SongLoader.makeSongCursor( + musicService, + MediaStore.Audio.AudioColumns._ID + "=?", + new String[]{songId} + )); + } + } else if (uri.getScheme().equals(ContentResolver.SCHEME_FILE)) { + songs = SongLoader.getSongs(SongLoader.makeSongCursor( + musicService, + MediaStore.Audio.AudioColumns.DATA + "=?", + new String[]{new File(uri.getPath()).getAbsolutePath()} + )); + } + if (songs != null && !songs.isEmpty()) { openQueue(songs, 0, true); } else { - //TODO the file is not listed in the media store + //TODO uri is not listed in the media store } } } diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java index 9e219fa9..a05b9d81 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java @@ -46,7 +46,6 @@ import com.kabouzeid.gramophone.util.PreferenceUtil; import com.kabouzeid.gramophone.util.Util; import com.sothree.slidinguppanel.SlidingUpPanelLayout; -import java.io.File; import java.util.ArrayList; import butterknife.BindView; @@ -299,7 +298,7 @@ public class MainActivity extends AbsSlidingMusicPanelActivity { } if (uri != null && uri.toString().length() > 0) { - MusicPlayerRemote.playFile(new File(uri.getPath()).getAbsolutePath()); + MusicPlayerRemote.playFromUri(uri); handled = true; } else if (MediaStore.Audio.Playlists.CONTENT_TYPE.equals(mimeType)) { final int id = (int) parseIdFromIntent(intent, "playlistId", "playlist"); From 11584bdab6c8f78bc81f811384c8409ebcd5c91e Mon Sep 17 00:00:00 2001 From: Feng Zheng Date: Thu, 23 Mar 2017 20:47:14 -0500 Subject: [PATCH 2/3] Fix: can't play media files from file browser When media file is selected from various file browers, the uri sent to app might be different scheme like file or content. Fix is to query the media file based on different scheme. --- .../gramophone/helper/MusicPlayerRemote.java | 44 ++++++++++++++++--- .../ui/activities/MainActivity.java | 3 +- 2 files changed, 38 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/com/kabouzeid/gramophone/helper/MusicPlayerRemote.java b/app/src/main/java/com/kabouzeid/gramophone/helper/MusicPlayerRemote.java index 49746224..f5458e40 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/helper/MusicPlayerRemote.java +++ b/app/src/main/java/com/kabouzeid/gramophone/helper/MusicPlayerRemote.java @@ -1,12 +1,17 @@ package com.kabouzeid.gramophone.helper; +import android.annotation.TargetApi; import android.app.Activity; import android.content.ComponentName; +import android.content.ContentResolver; import android.content.Context; import android.content.ContextWrapper; import android.content.Intent; import android.content.ServiceConnection; +import android.net.Uri; +import android.os.Build; import android.os.IBinder; +import android.provider.DocumentsContract; import android.provider.MediaStore; import android.support.annotation.NonNull; import android.support.annotation.Nullable; @@ -17,6 +22,7 @@ import com.kabouzeid.gramophone.loader.SongLoader; import com.kabouzeid.gramophone.model.Song; import com.kabouzeid.gramophone.service.MusicService; +import java.io.File; import java.util.ArrayList; import java.util.Random; import java.util.WeakHashMap; @@ -374,20 +380,44 @@ public class MusicPlayerRemote { return -1; } - public static void playFile(String path) { + public static void playFromUri(Uri uri) { if (musicService != null) { - ArrayList songs = SongLoader.getSongs(SongLoader.makeSongCursor( - musicService, - MediaStore.Audio.AudioColumns.DATA + "=?", - new String[]{path} - )); - if (!songs.isEmpty()) { + ArrayList songs = null; + if (uri.getScheme() != null && uri.getAuthority() != null) { + if (uri.getScheme().equals(ContentResolver.SCHEME_CONTENT)) { + String songId = null; + if (uri.getAuthority().equals("com.android.providers.media.documents")) { + songId = getSongIdFromMediaProvider(uri); + } else if (uri.getAuthority().equals("media")) { + songId = uri.getLastPathSegment(); + } + if (songId != null) { + songs = SongLoader.getSongs(SongLoader.makeSongCursor( + musicService, + MediaStore.Audio.AudioColumns._ID + "=?", + new String[]{songId} + )); + } + } + } + if (songs == null && uri.getPath() != null) { + songs = SongLoader.getSongs(SongLoader.makeSongCursor( + musicService, + MediaStore.Audio.AudioColumns.DATA + "=?", + new String[]{new File(uri.getPath()).getAbsolutePath()} + )); + } + if (songs != null && !songs.isEmpty()) { openQueue(songs, 0, true); } else { //TODO the file is not listed in the media store } } } + @TargetApi(Build.VERSION_CODES.KITKAT) + private static String getSongIdFromMediaProvider(Uri uri) { + return DocumentsContract.getDocumentId(uri).split(":")[1]; + } public static boolean isServiceConnected() { return musicService != null; diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java index 9e219fa9..a05b9d81 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java @@ -46,7 +46,6 @@ import com.kabouzeid.gramophone.util.PreferenceUtil; import com.kabouzeid.gramophone.util.Util; import com.sothree.slidinguppanel.SlidingUpPanelLayout; -import java.io.File; import java.util.ArrayList; import butterknife.BindView; @@ -299,7 +298,7 @@ public class MainActivity extends AbsSlidingMusicPanelActivity { } if (uri != null && uri.toString().length() > 0) { - MusicPlayerRemote.playFile(new File(uri.getPath()).getAbsolutePath()); + MusicPlayerRemote.playFromUri(uri); handled = true; } else if (MediaStore.Audio.Playlists.CONTENT_TYPE.equals(mimeType)) { final int id = (int) parseIdFromIntent(intent, "playlistId", "playlist"); From 3561cfd0b7ae1cfbe459371e59f69e4b56444ab8 Mon Sep 17 00:00:00 2001 From: Karim Abou Zeid Date: Sat, 22 Apr 2017 16:34:52 +0200 Subject: [PATCH 3/3] Added support for Android File Explorer --- .../gramophone/helper/MusicPlayerRemote.java | 23 ++++++++++++++----- 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/kabouzeid/gramophone/helper/MusicPlayerRemote.java b/app/src/main/java/com/kabouzeid/gramophone/helper/MusicPlayerRemote.java index f5458e40..0a6301ce 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/helper/MusicPlayerRemote.java +++ b/app/src/main/java/com/kabouzeid/gramophone/helper/MusicPlayerRemote.java @@ -10,6 +10,7 @@ import android.content.Intent; import android.content.ServiceConnection; import android.net.Uri; import android.os.Build; +import android.os.Environment; import android.os.IBinder; import android.provider.DocumentsContract; import android.provider.MediaStore; @@ -400,12 +401,21 @@ public class MusicPlayerRemote { } } } - if (songs == null && uri.getPath() != null) { - songs = SongLoader.getSongs(SongLoader.makeSongCursor( - musicService, - MediaStore.Audio.AudioColumns.DATA + "=?", - new String[]{new File(uri.getPath()).getAbsolutePath()} - )); + if (songs == null) { + File songFile = null; + if (uri.getAuthority() != null && uri.getAuthority().equals("com.android.externalstorage.documents")) { + songFile = new File(Environment.getExternalStorageDirectory(), uri.getPath().split(":", 2)[1]); + } + if (songFile == null && uri.getPath() != null) { + songFile = new File(uri.getPath()); + } + if (songFile != null) { + songs = SongLoader.getSongs(SongLoader.makeSongCursor( + musicService, + MediaStore.Audio.AudioColumns.DATA + "=?", + new String[]{songFile.getAbsolutePath()} + )); + } } if (songs != null && !songs.isEmpty()) { openQueue(songs, 0, true); @@ -414,6 +424,7 @@ public class MusicPlayerRemote { } } } + @TargetApi(Build.VERSION_CODES.KITKAT) private static String getSongIdFromMediaProvider(Uri uri) { return DocumentsContract.getDocumentId(uri).split(":")[1];