Library used: appcompat-v7 Version used: 25.3.1 Theme used: N/A Devices/Android versions reproduced on: Android 4.4
Support Library revision 25 seems to have introduced a regression: The method MediaSessionCompat.setMetadata() now throws a java.lang.NoSuchMethodError on KitKat if the metadata contains a rating. The method works fine on other Android versions. The exact same code also works fine when using Support Library revision 24.
The code below demonstrates the issue. Note that you have to add a MediaButtonReceiver in the Manifest file in order to run the snippet on older Android versions. The call to setMetadata() doesn't throw if we comment the line with putRating().
// Instantiate a new active media session MediaSessionCompat mediaSession = new MediaSessionCompat(this, MainActivity.class.getSimpleName()); mediaSession.setActive(true);
MediaMetadataCompat.Builder builder = new MediaMetadataCompat.Builder();
// This method throws a java.lang.NoSuchMethodError: android.media.RemoteControlClient$MetadataEditor.putObject // if the media metadata passed in contains a rating mediaSession.setMetadata(builder.build()); }
}
This code work fine on most Android versions but crashes on Android 4.4 KitKat with this exception. We however expect this method to work on all supported Android versions.
FATAL EXCEPTION: main Process: castplayer.com.demo, PID: 8716 java.lang.NoSuchMethodError: android.media.RemoteControlClient$MetadataEditor.putObject at android.support.v4.media.session.MediaSessionCompatApi19.addNewMetadata(MediaSessionCompatApi19.java:80) at android.support.v4.media.session.MediaSessionCompatApi19.setMetadata(MediaSessionCompatApi19.java:50) at android.support.v4.media.session.MediaSessionCompat$MediaSessionImplBase.setMetadata(MediaSessionCompat.java:1729) at android.support.v4.media.session.MediaSessionCompat.setMetadata(MediaSessionCompat.java:493) at castplayer.com.demo.MainActivity.onCreate(MainActivity.java:25) at android.app.Activity.performCreate(Activity.java:5231) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245) at android.app.ActivityThread.access$800(ActivityThread.java:135) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:136) at android.app.ActivityThread.main(ActivityThread.java:5017) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) at dalvik.system.NativeStart.main(Native Method)
Description
Version used: 25.3.1
Theme used: N/A
Devices/Android versions reproduced on: Android 4.4
Support Library revision 25 seems to have introduced a regression: The method MediaSessionCompat.setMetadata() now throws a java.lang.NoSuchMethodError on KitKat if the metadata contains a rating. The method works fine on other Android versions. The exact same code also works fine when using Support Library revision 24.
The code below demonstrates the issue. Note that you have to add a MediaButtonReceiver in the Manifest file in order to run the snippet on older Android versions. The call to setMetadata() doesn't throw if we comment the line with putRating().
import android.support.v4.media.*;
import android.support.v4.media.session.MediaSessionCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Instantiate a new active media session
MediaSessionCompat mediaSession = new MediaSessionCompat(this, MainActivity.class.getSimpleName());
mediaSession.setActive(true);
MediaMetadataCompat.Builder builder = new MediaMetadataCompat.Builder();
builder.putRating(MediaMetadataCompat.METADATA_KEY_RATING, RatingCompat.newHeartRating(true));
// This method throws a java.lang.NoSuchMethodError: android.media.RemoteControlClient$MetadataEditor.putObject
// if the media metadata passed in contains a rating
mediaSession.setMetadata(builder.build());
}
}
This code work fine on most Android versions but crashes on Android 4.4 KitKat with this exception. We however expect this method to work on all supported Android versions.
FATAL EXCEPTION: main
Process: castplayer.com.demo, PID: 8716
java.lang.NoSuchMethodError: android.media.RemoteControlClient$MetadataEditor.putObject
at android.support.v4.media.session.MediaSessionCompatApi19.addNewMetadata(MediaSessionCompatApi19.java:80)
at android.support.v4.media.session.MediaSessionCompatApi19.setMetadata(MediaSessionCompatApi19.java:50)
at android.support.v4.media.session.MediaSessionCompat$MediaSessionImplBase.setMetadata(MediaSessionCompat.java:1729)
at android.support.v4.media.session.MediaSessionCompat.setMetadata(MediaSessionCompat.java:493)
at castplayer.com.demo.MainActivity.onCreate(MainActivity.java:25)
at android.app.Activity.performCreate(Activity.java:5231)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
at android.app.ActivityThread.access$800(ActivityThread.java:135)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5017)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
at dalvik.system.NativeStart.main(Native Method)