MediaMetadata.getString java.lang.RuntimeException:无法从parcel blob读取位图

Sar*_* Ma 6 java android bitmap android-music-player

调用MediaMetadata.getString,在报告中有以下崩溃,但并不总是重复:

 java.lang.RuntimeException: Could not read bitmap from parcel blob.
    at android.graphics.Bitmap.nativeCreateFromParcel(Native Method)
    at android.graphics.Bitmap.access$000(Bitmap.java:32)
    at android.graphics.Bitmap$1.createFromParcel(Bitmap.java:1477)
    at android.graphics.Bitmap$1.createFromParcel(Bitmap.java:1469)
    at android.os.Parcel.readParcelable(Parcel.java:2246)
    at android.os.Parcel.readValue(Parcel.java:2146)
    at android.os.Parcel.readArrayMapInternal(Parcel.java:2479)
    at android.os.BaseBundle.unparcel(BaseBundle.java:221)
    at android.os.BaseBundle.getCharSequence(BaseBundle.java:953)
    at android.os.Bundle.getCharSequence(Bundle.java:716)
    at android.media.MediaMetadata.getText(MediaMetadata.java:334)
    at android.media.MediaMetadata.getString(MediaMetadata.java:347)
Run Code Online (Sandbox Code Playgroud)

代码就像吹,MediaMetadata元是来自api MediaSessionManager.OnActiveSessionsChangedListener的控制器,它应该由第三方音乐应用程序创建.

    meta.getString(MediaMetadata.METADATA_KEY_ALBUM_ARTIST);
    meta.getString(MediaMetadata.METADATA_KEY_ARTIST);            
    meta.getString(MediaMetadata.METADATA_KEY_AUTHOR);         
    meta.getBitmap(MediaMetadata.METADATA_KEY_ART);
    meta.getBitmap(MediaMetadata.METADATA_KEY_ALBUM_ART);            
    meta.getString(MediaMetadata.METADATA_KEY_ALBUM);
    meta.getString(MediaMetadata.METADATA_KEY_TITLE);
Run Code Online (Sandbox Code Playgroud)

为什么getString将解析位图?当这种情况发生时,内存是否可能出局?

Jon*_*hke 0

我认为当您将大位图放入MediaMetaData对象中时会发生这种情况.putBitmap(MediaMetadataCompat.METADATA_KEY_DISPLAY_ICON, icon)。该位图用于MediaDescription,因此在序列化时它应该非常小。实际上,每次调用getString元数据时它都会被反序列化。

因此,此问题的解决方案是仅使用小位图METADATA_KEY_DISPLAY_ICON或尽可能不使用它。