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