我正在使用新的Notification.MediaStyle类将Lollipop风格的通知实现到FTP流音乐播放器应用程序。我将专辑封面设置为“大图标”。

鉴于专辑封面直接取自当前正在播放的文件,因此该专辑封面的大小取决于来源(可能最大为5000x5000)。

从我的 Lollipop 之前的代码中,我将位图解码为以下定义的最大大小:android.R.dimen.notification_large_icon_width

android.R.dimen.notification_large_icon_height
可以很好地工作,因为解码时间要快得多,并且内存使用情况是理想的。

但是,当将此代码应用于我的MediaStyle样式时,展开的 View 使用的图标要比由尺寸参数定义的图标大得多,而展开时会导致专辑封面模糊。

是否有一些常量可以定义MediaStyle大图标的展开 View 的最大大小?还是有解决此问题的方法?按照目前的情况,以全分辨率对艺术进行解码是 Not Acceptable ,因为它可能会导致由于OOM而导致应用程序崩溃。

最佳答案

从Lollipop源代码中,我可以看到图像大小为128dp,请参见notification_template_material_big_media.xml on GitHub:

<!-- Layout to be used with only max 3 actions. It has a much larger picture at the left side-->
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/status_bar_latest_event_content"
    android:layout_width="match_parent"
    android:layout_height="128dp"
    android:background="#00000000"
    android:tag="bigMediaNarrow"
    >
    <ImageView android:id="@+id/icon"
        android:layout_width="128dp"
        android:layout_height="128dp"
        android:scaleType="centerCrop"
        />

    <!-- ...Nothing interesting for us futher... -->

</RelativeLayout>

这是用于具有3个或更少 Action 按钮的扩展布局。查看Notification.MediaStyle.getBigLayoutResource(int) on GrepCode,如果还有更多按钮,则似乎使用了notification_template_material_big_media.xml:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/status_bar_latest_event_content"
    android:layout_width="match_parent"
    android:layout_height="128dp"
    android:background="#00000000"
    android:tag="bigMedia"
    >
    <include layout="@layout/notification_template_icon_group"
        android:layout_width="@dimen/notification_large_icon_width"
        android:layout_height="@dimen/notification_large_icon_height"
        />

    <!-- ...Nothing interesting for us futher... -->

</RelativeLayout>

notification_template_icon_group.xml看起来像这样:
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:internal="http://schemas.android.com/apk/prv/res/android"
    android:layout_width="@dimen/notification_large_icon_width"
    android:layout_height="@dimen/notification_large_icon_height"
    android:id="@+id/icon_group"
    >
    <ImageView android:id="@+id/icon"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginTop="12dp"
        android:layout_marginBottom="12dp"
        android:layout_marginStart="12dp"
        android:layout_marginEnd="12dp"
        android:scaleType="centerInside"
        />
    <ImageView android:id="@+id/right_icon"
        android:layout_width="16dp"
        android:layout_height="16dp"
        android:padding="3dp"
        android:layout_gravity="end|bottom"
        android:scaleType="centerInside"
        android:visibility="gone"
        android:layout_marginEnd="8dp"
        android:layout_marginBottom="8dp"
        />
</FrameLayout>

您可以在.../res/values/dimens.xml中找到notification_large_icon_widthnotification_large_icon_height:
<!-- The width of the big icons in notifications. -->
<dimen name="notification_large_icon_width">64dp</dimen>
<!-- The width of the big icons in notifications. -->
<dimen name="notification_large_icon_height">64dp</dimen>

因此,最终的答案-使用3个或更少的操作按钮的扩展版图128dp,如果超过3个,则为64dp。

10-08 17:44