调用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)

该代码很烂,MediaMetadata元数据来自api MediaSessionManager.OnActiveSessionsChangedListener的 Controller ,它应该由第三方音乐应用程序创建。
    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);

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

最佳答案

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

因此,解决此问题的方法是仅对METADATA_KEY_DISPLAY_ICON使用小的位图,或者在可能的情况下完全不使用它。

关于java - MediaMetadata.getString java.lang.RuntimeException : Could not read bitmap from parcel blob,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31911702/

10-10 16:42