Loading api/current.txt +1 −0 Original line number Original line Diff line number Diff line Loading @@ -21192,6 +21192,7 @@ package android.media { method public void setDataSource(android.content.Context, android.net.Uri) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException, java.lang.SecurityException; method public void setDataSource(android.content.Context, android.net.Uri) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException, java.lang.SecurityException; method public void setDataSource(android.content.Context, android.net.Uri, java.util.Map<java.lang.String, java.lang.String>) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException, java.lang.SecurityException; method public void setDataSource(android.content.Context, android.net.Uri, java.util.Map<java.lang.String, java.lang.String>) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException, java.lang.SecurityException; method public void setDataSource(java.lang.String) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException, java.lang.SecurityException; method public void setDataSource(java.lang.String) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException, java.lang.SecurityException; method public void setDataSource(android.content.res.AssetFileDescriptor) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException; method public void setDataSource(java.io.FileDescriptor) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException; method public void setDataSource(java.io.FileDescriptor) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException; method public void setDataSource(java.io.FileDescriptor, long, long) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException; method public void setDataSource(java.io.FileDescriptor, long, long) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException; method public void setDataSource(android.media.MediaDataSource) throws java.lang.IllegalArgumentException, java.lang.IllegalStateException; method public void setDataSource(android.media.MediaDataSource) throws java.lang.IllegalArgumentException, java.lang.IllegalStateException; api/system-current.txt +1 −0 Original line number Original line Diff line number Diff line Loading @@ -22700,6 +22700,7 @@ package android.media { method public void setDataSource(android.content.Context, android.net.Uri) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException, java.lang.SecurityException; method public void setDataSource(android.content.Context, android.net.Uri) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException, java.lang.SecurityException; method public void setDataSource(android.content.Context, android.net.Uri, java.util.Map<java.lang.String, java.lang.String>) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException, java.lang.SecurityException; method public void setDataSource(android.content.Context, android.net.Uri, java.util.Map<java.lang.String, java.lang.String>) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException, java.lang.SecurityException; method public void setDataSource(java.lang.String) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException, java.lang.SecurityException; method public void setDataSource(java.lang.String) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException, java.lang.SecurityException; method public void setDataSource(android.content.res.AssetFileDescriptor) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException; method public void setDataSource(java.io.FileDescriptor) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException; method public void setDataSource(java.io.FileDescriptor) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException; method public void setDataSource(java.io.FileDescriptor, long, long) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException; method public void setDataSource(java.io.FileDescriptor, long, long) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException; method public void setDataSource(android.media.MediaDataSource) throws java.lang.IllegalArgumentException, java.lang.IllegalStateException; method public void setDataSource(android.media.MediaDataSource) throws java.lang.IllegalArgumentException, java.lang.IllegalStateException; api/test-current.txt +1 −0 Original line number Original line Diff line number Diff line Loading @@ -21201,6 +21201,7 @@ package android.media { method public void setDataSource(android.content.Context, android.net.Uri) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException, java.lang.SecurityException; method public void setDataSource(android.content.Context, android.net.Uri) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException, java.lang.SecurityException; method public void setDataSource(android.content.Context, android.net.Uri, java.util.Map<java.lang.String, java.lang.String>) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException, java.lang.SecurityException; method public void setDataSource(android.content.Context, android.net.Uri, java.util.Map<java.lang.String, java.lang.String>) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException, java.lang.SecurityException; method public void setDataSource(java.lang.String) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException, java.lang.SecurityException; method public void setDataSource(java.lang.String) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException, java.lang.SecurityException; method public void setDataSource(android.content.res.AssetFileDescriptor) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException; method public void setDataSource(java.io.FileDescriptor) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException; method public void setDataSource(java.io.FileDescriptor) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException; method public void setDataSource(java.io.FileDescriptor, long, long) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException; method public void setDataSource(java.io.FileDescriptor, long, long) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException; method public void setDataSource(android.media.MediaDataSource) throws java.lang.IllegalArgumentException, java.lang.IllegalStateException; method public void setDataSource(android.media.MediaDataSource) throws java.lang.IllegalArgumentException, java.lang.IllegalStateException; core/java/android/provider/Settings.java +15 −0 Original line number Original line Diff line number Diff line Loading @@ -2780,6 +2780,11 @@ public final class Settings { */ */ public static final Uri DEFAULT_RINGTONE_URI = getUriFor(RINGTONE); public static final Uri DEFAULT_RINGTONE_URI = getUriFor(RINGTONE); /** {@hide} */ public static final String RINGTONE_CACHE = "ringtone_cache"; /** {@hide} */ public static final Uri RINGTONE_CACHE_URI = getUriFor(RINGTONE_CACHE); /** /** * Persistent store for the system-wide default notification sound. * Persistent store for the system-wide default notification sound. * * Loading @@ -2798,6 +2803,11 @@ public final class Settings { */ */ public static final Uri DEFAULT_NOTIFICATION_URI = getUriFor(NOTIFICATION_SOUND); public static final Uri DEFAULT_NOTIFICATION_URI = getUriFor(NOTIFICATION_SOUND); /** {@hide} */ public static final String NOTIFICATION_SOUND_CACHE = "notification_sound_cache"; /** {@hide} */ public static final Uri NOTIFICATION_SOUND_CACHE_URI = getUriFor(NOTIFICATION_SOUND_CACHE); /** /** * Persistent store for the system-wide default alarm alert. * Persistent store for the system-wide default alarm alert. * * Loading @@ -2816,6 +2826,11 @@ public final class Settings { */ */ public static final Uri DEFAULT_ALARM_ALERT_URI = getUriFor(ALARM_ALERT); public static final Uri DEFAULT_ALARM_ALERT_URI = getUriFor(ALARM_ALERT); /** {@hide} */ public static final String ALARM_ALERT_CACHE = "alarm_alert_cache"; /** {@hide} */ public static final Uri ALARM_ALERT_CACHE_URI = getUriFor(ALARM_ALERT_CACHE); /** /** * Persistent store for the system default media button event receiver. * Persistent store for the system default media button event receiver. * * Loading media/java/android/media/MediaPlayer.java +51 −31 Original line number Original line Diff line number Diff line Loading @@ -57,6 +57,7 @@ import android.media.SubtitleTrack.RenderingWidget; import android.media.SyncParams; import android.media.SyncParams; import com.android.internal.app.IAppOpsService; import com.android.internal.app.IAppOpsService; import com.android.internal.util.Preconditions; import libcore.io.IoBridge; import libcore.io.IoBridge; import libcore.io.Libcore; import libcore.io.Libcore; Loading Loading @@ -964,7 +965,7 @@ public class MediaPlayer implements SubtitleController.Listener * @param uri the Content URI of the data you want to play * @param uri the Content URI of the data you want to play * @throws IllegalStateException if it is called in an invalid state * @throws IllegalStateException if it is called in an invalid state */ */ public void setDataSource(Context context, Uri uri) public void setDataSource(@NonNull Context context, @NonNull Uri uri) throws IOException, IllegalArgumentException, SecurityException, IllegalStateException { throws IOException, IllegalArgumentException, SecurityException, IllegalStateException { setDataSource(context, uri, null); setDataSource(context, uri, null); } } Loading @@ -981,47 +982,46 @@ public class MediaPlayer implements SubtitleController.Listener * to disallow or allow cross domain redirection. * to disallow or allow cross domain redirection. * @throws IllegalStateException if it is called in an invalid state * @throws IllegalStateException if it is called in an invalid state */ */ public void setDataSource(Context context, Uri uri, Map<String, String> headers) public void setDataSource(@NonNull Context context, @NonNull Uri uri, throws IOException, IllegalArgumentException, SecurityException, IllegalStateException { @Nullable Map<String, String> headers) throws IOException, IllegalArgumentException, SecurityException, IllegalStateException { final ContentResolver resolver = context.getContentResolver(); final String scheme = uri.getScheme(); final String scheme = uri.getScheme(); if (ContentResolver.SCHEME_FILE.equals(scheme)) { if (ContentResolver.SCHEME_FILE.equals(scheme)) { setDataSource(uri.getPath()); setDataSource(uri.getPath()); return; return; } else if (ContentResolver.SCHEME_CONTENT.equals(scheme) } else if (ContentResolver.SCHEME_CONTENT.equals(scheme) && Settings.AUTHORITY.equals(uri.getAuthority())) { && Settings.AUTHORITY.equals(uri.getAuthority())) { // Redirect ringtones to go directly to underlying provider // Try cached ringtone first since the actual provider may not be uri = RingtoneManager.getActualDefaultRingtoneUri(context, // encryption aware, or it may be stored on CE media storage RingtoneManager.getDefaultType(uri)); final int type = RingtoneManager.getDefaultType(uri); if (uri == null) { final Uri cacheUri = RingtoneManager.getCacheForType(type); throw new FileNotFoundException("Failed to resolve default ringtone"); final Uri actualUri = RingtoneManager.getActualDefaultRingtoneUri(context, type); } if (attemptDataSource(resolver, cacheUri)) { } return; } else if (attemptDataSource(resolver, actualUri)) { AssetFileDescriptor fd = null; try { ContentResolver resolver = context.getContentResolver(); fd = resolver.openAssetFileDescriptor(uri, "r"); if (fd == null) { return; return; } // Note: using getDeclaredLength so that our behavior is the same // as previous versions when the content provider is returning // a full file. if (fd.getDeclaredLength() < 0) { setDataSource(fd.getFileDescriptor()); } else { } else { setDataSource(fd.getFileDescriptor(), fd.getStartOffset(), fd.getDeclaredLength()); setDataSource(uri.toString(), headers); } } } else { // Try requested Uri locally first, or fallback to media server if (attemptDataSource(resolver, uri)) { return; return; } catch (SecurityException | IOException ex) { } else { Log.w(TAG, "Couldn't open file on client side; trying server side: " + ex); setDataSource(uri.toString(), headers); } finally { } if (fd != null) { fd.close(); } } } } setDataSource(uri.toString(), headers); private boolean attemptDataSource(ContentResolver resolver, Uri uri) { try (AssetFileDescriptor afd = resolver.openAssetFileDescriptor(uri, "r")) { setDataSource(afd); return true; } catch (NullPointerException | SecurityException | IOException ex) { Log.w(TAG, "Couldn't open " + uri + ": " + ex); return false; } } } /** /** Loading Loading @@ -1101,6 +1101,26 @@ public class MediaPlayer implements SubtitleController.Listener IBinder httpServiceBinder, String path, String[] keys, String[] values) IBinder httpServiceBinder, String path, String[] keys, String[] values) throws IOException, IllegalArgumentException, SecurityException, IllegalStateException; throws IOException, IllegalArgumentException, SecurityException, IllegalStateException; /** * Sets the data source (AssetFileDescriptor) to use. It is the caller's * responsibility to close the file descriptor. It is safe to do so as soon * as this call returns. * * @param afd the AssetFileDescriptor for the file you want to play */ public void setDataSource(@NonNull AssetFileDescriptor afd) throws IOException, IllegalArgumentException, IllegalStateException { Preconditions.checkNotNull(afd); // Note: using getDeclaredLength so that our behavior is the same // as previous versions when the content provider is returning // a full file. if (afd.getDeclaredLength() < 0) { setDataSource(afd.getFileDescriptor()); } else { setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getDeclaredLength()); } } /** /** * Sets the data source (FileDescriptor) to use. It is the caller's responsibility * Sets the data source (FileDescriptor) to use. It is the caller's responsibility * to close the file descriptor. It is safe to do so as soon as this call returns. * to close the file descriptor. It is safe to do so as soon as this call returns. Loading Loading
api/current.txt +1 −0 Original line number Original line Diff line number Diff line Loading @@ -21192,6 +21192,7 @@ package android.media { method public void setDataSource(android.content.Context, android.net.Uri) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException, java.lang.SecurityException; method public void setDataSource(android.content.Context, android.net.Uri) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException, java.lang.SecurityException; method public void setDataSource(android.content.Context, android.net.Uri, java.util.Map<java.lang.String, java.lang.String>) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException, java.lang.SecurityException; method public void setDataSource(android.content.Context, android.net.Uri, java.util.Map<java.lang.String, java.lang.String>) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException, java.lang.SecurityException; method public void setDataSource(java.lang.String) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException, java.lang.SecurityException; method public void setDataSource(java.lang.String) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException, java.lang.SecurityException; method public void setDataSource(android.content.res.AssetFileDescriptor) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException; method public void setDataSource(java.io.FileDescriptor) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException; method public void setDataSource(java.io.FileDescriptor) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException; method public void setDataSource(java.io.FileDescriptor, long, long) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException; method public void setDataSource(java.io.FileDescriptor, long, long) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException; method public void setDataSource(android.media.MediaDataSource) throws java.lang.IllegalArgumentException, java.lang.IllegalStateException; method public void setDataSource(android.media.MediaDataSource) throws java.lang.IllegalArgumentException, java.lang.IllegalStateException;
api/system-current.txt +1 −0 Original line number Original line Diff line number Diff line Loading @@ -22700,6 +22700,7 @@ package android.media { method public void setDataSource(android.content.Context, android.net.Uri) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException, java.lang.SecurityException; method public void setDataSource(android.content.Context, android.net.Uri) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException, java.lang.SecurityException; method public void setDataSource(android.content.Context, android.net.Uri, java.util.Map<java.lang.String, java.lang.String>) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException, java.lang.SecurityException; method public void setDataSource(android.content.Context, android.net.Uri, java.util.Map<java.lang.String, java.lang.String>) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException, java.lang.SecurityException; method public void setDataSource(java.lang.String) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException, java.lang.SecurityException; method public void setDataSource(java.lang.String) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException, java.lang.SecurityException; method public void setDataSource(android.content.res.AssetFileDescriptor) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException; method public void setDataSource(java.io.FileDescriptor) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException; method public void setDataSource(java.io.FileDescriptor) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException; method public void setDataSource(java.io.FileDescriptor, long, long) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException; method public void setDataSource(java.io.FileDescriptor, long, long) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException; method public void setDataSource(android.media.MediaDataSource) throws java.lang.IllegalArgumentException, java.lang.IllegalStateException; method public void setDataSource(android.media.MediaDataSource) throws java.lang.IllegalArgumentException, java.lang.IllegalStateException;
api/test-current.txt +1 −0 Original line number Original line Diff line number Diff line Loading @@ -21201,6 +21201,7 @@ package android.media { method public void setDataSource(android.content.Context, android.net.Uri) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException, java.lang.SecurityException; method public void setDataSource(android.content.Context, android.net.Uri) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException, java.lang.SecurityException; method public void setDataSource(android.content.Context, android.net.Uri, java.util.Map<java.lang.String, java.lang.String>) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException, java.lang.SecurityException; method public void setDataSource(android.content.Context, android.net.Uri, java.util.Map<java.lang.String, java.lang.String>) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException, java.lang.SecurityException; method public void setDataSource(java.lang.String) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException, java.lang.SecurityException; method public void setDataSource(java.lang.String) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException, java.lang.SecurityException; method public void setDataSource(android.content.res.AssetFileDescriptor) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException; method public void setDataSource(java.io.FileDescriptor) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException; method public void setDataSource(java.io.FileDescriptor) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException; method public void setDataSource(java.io.FileDescriptor, long, long) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException; method public void setDataSource(java.io.FileDescriptor, long, long) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException; method public void setDataSource(android.media.MediaDataSource) throws java.lang.IllegalArgumentException, java.lang.IllegalStateException; method public void setDataSource(android.media.MediaDataSource) throws java.lang.IllegalArgumentException, java.lang.IllegalStateException;
core/java/android/provider/Settings.java +15 −0 Original line number Original line Diff line number Diff line Loading @@ -2780,6 +2780,11 @@ public final class Settings { */ */ public static final Uri DEFAULT_RINGTONE_URI = getUriFor(RINGTONE); public static final Uri DEFAULT_RINGTONE_URI = getUriFor(RINGTONE); /** {@hide} */ public static final String RINGTONE_CACHE = "ringtone_cache"; /** {@hide} */ public static final Uri RINGTONE_CACHE_URI = getUriFor(RINGTONE_CACHE); /** /** * Persistent store for the system-wide default notification sound. * Persistent store for the system-wide default notification sound. * * Loading @@ -2798,6 +2803,11 @@ public final class Settings { */ */ public static final Uri DEFAULT_NOTIFICATION_URI = getUriFor(NOTIFICATION_SOUND); public static final Uri DEFAULT_NOTIFICATION_URI = getUriFor(NOTIFICATION_SOUND); /** {@hide} */ public static final String NOTIFICATION_SOUND_CACHE = "notification_sound_cache"; /** {@hide} */ public static final Uri NOTIFICATION_SOUND_CACHE_URI = getUriFor(NOTIFICATION_SOUND_CACHE); /** /** * Persistent store for the system-wide default alarm alert. * Persistent store for the system-wide default alarm alert. * * Loading @@ -2816,6 +2826,11 @@ public final class Settings { */ */ public static final Uri DEFAULT_ALARM_ALERT_URI = getUriFor(ALARM_ALERT); public static final Uri DEFAULT_ALARM_ALERT_URI = getUriFor(ALARM_ALERT); /** {@hide} */ public static final String ALARM_ALERT_CACHE = "alarm_alert_cache"; /** {@hide} */ public static final Uri ALARM_ALERT_CACHE_URI = getUriFor(ALARM_ALERT_CACHE); /** /** * Persistent store for the system default media button event receiver. * Persistent store for the system default media button event receiver. * * Loading
media/java/android/media/MediaPlayer.java +51 −31 Original line number Original line Diff line number Diff line Loading @@ -57,6 +57,7 @@ import android.media.SubtitleTrack.RenderingWidget; import android.media.SyncParams; import android.media.SyncParams; import com.android.internal.app.IAppOpsService; import com.android.internal.app.IAppOpsService; import com.android.internal.util.Preconditions; import libcore.io.IoBridge; import libcore.io.IoBridge; import libcore.io.Libcore; import libcore.io.Libcore; Loading Loading @@ -964,7 +965,7 @@ public class MediaPlayer implements SubtitleController.Listener * @param uri the Content URI of the data you want to play * @param uri the Content URI of the data you want to play * @throws IllegalStateException if it is called in an invalid state * @throws IllegalStateException if it is called in an invalid state */ */ public void setDataSource(Context context, Uri uri) public void setDataSource(@NonNull Context context, @NonNull Uri uri) throws IOException, IllegalArgumentException, SecurityException, IllegalStateException { throws IOException, IllegalArgumentException, SecurityException, IllegalStateException { setDataSource(context, uri, null); setDataSource(context, uri, null); } } Loading @@ -981,47 +982,46 @@ public class MediaPlayer implements SubtitleController.Listener * to disallow or allow cross domain redirection. * to disallow or allow cross domain redirection. * @throws IllegalStateException if it is called in an invalid state * @throws IllegalStateException if it is called in an invalid state */ */ public void setDataSource(Context context, Uri uri, Map<String, String> headers) public void setDataSource(@NonNull Context context, @NonNull Uri uri, throws IOException, IllegalArgumentException, SecurityException, IllegalStateException { @Nullable Map<String, String> headers) throws IOException, IllegalArgumentException, SecurityException, IllegalStateException { final ContentResolver resolver = context.getContentResolver(); final String scheme = uri.getScheme(); final String scheme = uri.getScheme(); if (ContentResolver.SCHEME_FILE.equals(scheme)) { if (ContentResolver.SCHEME_FILE.equals(scheme)) { setDataSource(uri.getPath()); setDataSource(uri.getPath()); return; return; } else if (ContentResolver.SCHEME_CONTENT.equals(scheme) } else if (ContentResolver.SCHEME_CONTENT.equals(scheme) && Settings.AUTHORITY.equals(uri.getAuthority())) { && Settings.AUTHORITY.equals(uri.getAuthority())) { // Redirect ringtones to go directly to underlying provider // Try cached ringtone first since the actual provider may not be uri = RingtoneManager.getActualDefaultRingtoneUri(context, // encryption aware, or it may be stored on CE media storage RingtoneManager.getDefaultType(uri)); final int type = RingtoneManager.getDefaultType(uri); if (uri == null) { final Uri cacheUri = RingtoneManager.getCacheForType(type); throw new FileNotFoundException("Failed to resolve default ringtone"); final Uri actualUri = RingtoneManager.getActualDefaultRingtoneUri(context, type); } if (attemptDataSource(resolver, cacheUri)) { } return; } else if (attemptDataSource(resolver, actualUri)) { AssetFileDescriptor fd = null; try { ContentResolver resolver = context.getContentResolver(); fd = resolver.openAssetFileDescriptor(uri, "r"); if (fd == null) { return; return; } // Note: using getDeclaredLength so that our behavior is the same // as previous versions when the content provider is returning // a full file. if (fd.getDeclaredLength() < 0) { setDataSource(fd.getFileDescriptor()); } else { } else { setDataSource(fd.getFileDescriptor(), fd.getStartOffset(), fd.getDeclaredLength()); setDataSource(uri.toString(), headers); } } } else { // Try requested Uri locally first, or fallback to media server if (attemptDataSource(resolver, uri)) { return; return; } catch (SecurityException | IOException ex) { } else { Log.w(TAG, "Couldn't open file on client side; trying server side: " + ex); setDataSource(uri.toString(), headers); } finally { } if (fd != null) { fd.close(); } } } } setDataSource(uri.toString(), headers); private boolean attemptDataSource(ContentResolver resolver, Uri uri) { try (AssetFileDescriptor afd = resolver.openAssetFileDescriptor(uri, "r")) { setDataSource(afd); return true; } catch (NullPointerException | SecurityException | IOException ex) { Log.w(TAG, "Couldn't open " + uri + ": " + ex); return false; } } } /** /** Loading Loading @@ -1101,6 +1101,26 @@ public class MediaPlayer implements SubtitleController.Listener IBinder httpServiceBinder, String path, String[] keys, String[] values) IBinder httpServiceBinder, String path, String[] keys, String[] values) throws IOException, IllegalArgumentException, SecurityException, IllegalStateException; throws IOException, IllegalArgumentException, SecurityException, IllegalStateException; /** * Sets the data source (AssetFileDescriptor) to use. It is the caller's * responsibility to close the file descriptor. It is safe to do so as soon * as this call returns. * * @param afd the AssetFileDescriptor for the file you want to play */ public void setDataSource(@NonNull AssetFileDescriptor afd) throws IOException, IllegalArgumentException, IllegalStateException { Preconditions.checkNotNull(afd); // Note: using getDeclaredLength so that our behavior is the same // as previous versions when the content provider is returning // a full file. if (afd.getDeclaredLength() < 0) { setDataSource(afd.getFileDescriptor()); } else { setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getDeclaredLength()); } } /** /** * Sets the data source (FileDescriptor) to use. It is the caller's responsibility * Sets the data source (FileDescriptor) to use. It is the caller's responsibility * to close the file descriptor. It is safe to do so as soon as this call returns. * to close the file descriptor. It is safe to do so as soon as this call returns. Loading