Android 状态栏显示运营商名称

Android 原生设计中在锁屏界面会显示运营商名称,用户界面中,大概是基于 icon 数量长度显示考虑,对运营商名称不作显示。但是国内基本都加上运营商名称。对图标显示长度优化基本都是:缩小运营商字体、限制字数长度、信号图标压缩上下叠加等。

SIM卡的 icon 对应的文件是 StatusBarMobileView,默认包含信号格、漫游、网络制式、上下行等图标。只需要在默认基础上,添加运营商名称View。

一、添加运营商名称view

在信号格后面增加运营商名称,System中对文字图标显示自定义 AutoMarqueeTextView 类(主要增加跑马灯和省略号的样式自动切换)处理,我们使用 AutoMarqueeTextView 显示名称即可。

XML 复制代码
//frameworks/base/packages/SystemUI/res/layout/status_bar_mobile_signal_group.xml

        <FrameLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical">
            <com.android.systemui.statusbar.AnimatedImageView
                android:id="@+id/mobile_signal"
                android:layout_height="wrap_content"
                android:layout_width="wrap_content"
                systemui:hasOverlappingRendering="false"
            />
            <ImageView
                android:id="@+id/mobile_roaming"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="@drawable/stat_sys_roaming"
                android:contentDescription="@string/data_connection_roaming"
                android:visibility="gone" />
        </FrameLayout>
        <com.android.systemui.util.AutoMarqueeTextView
            android:id="@+id/qs_carrier_text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:textAppearance="@style/TextAppearance.QS.Status"
            android:textDirection="locale"
            android:textSize="8dp"
            android:marqueeRepeatLimit="marquee_forever"
            android:singleLine="true"
            android:maxEms="4"/>

然后调整好文字大小和长度适配。

二、对网络制式、上下行漫游图标长度压缩

默认图标都是从左到右排序的,这样会导致整体icon太长,状态栏放不下,从而导致icon被收到省略号中无法显示。

XML 复制代码
//frameworks/base/packages/SystemUI/res/layout/status_bar_mobile_signal_group.xml

    <com.android.keyguard.AlphaOptimizedLinearLayout
        android:id="@+id/mobile_group"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:gravity="center_vertical"
        android:orientation="horizontal" >
        <ImageView
            android:id="@+id/mobile_volte"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            android:visibility="gone"
            android:paddingEnd="2dp"/>
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:orientation="vertical">
            <FrameLayout
                android:layout_height="10dp"
                android:layout_width="10dp">
                <ImageView
                    android:id="@+id/mobile_type"
                    android:layout_height="wrap_content"
                    android:layout_width="wrap_content"
                    android:layout_marginTop="1dp"
                    android:visibility="gone" />
            </FrameLayout>
            <FrameLayout
                android:id="@+id/inout_container"
                android:layout_height="10dp"
                android:layout_width="10dp"
                android:layout_gravity="center_horizontal">
                <ImageView
                    android:id="@+id/mobile_in"
                    android:layout_height="10dp"
                    android:layout_width="10dp"
                    android:src="@drawable/ic_activity_down"
                    android:visibility="gone"
                />
                <ImageView
                    android:id="@+id/mobile_out"
                    android:layout_height="10dp"
                    android:layout_width="10dp"
                    android:src="@drawable/ic_activity_up"
                    android:visibility="gone"
                />
            </FrameLayout>
        </LinearLayout>
        <Space
            android:id="@+id/mobile_roaming_space"
            android:layout_height="match_parent"
            android:layout_width="0dp"
            android:visibility="gone"
        />

把子view直接的space都设置为0,再把4g图标和上下行图标缩小放到一列中。

三、 运营商名称显示

获取运营商名称接口常用有两种

复制代码
SubscriptionInfo.getCarrierName()
复制代码
SubscriptionInfo.getDisplayName()

区别在第一种显示的内容更多,类似:*CHN-CT中国电信。*这里一般只想显示中国电信,使用第二个方法就行。

XML 复制代码
//frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarMobileView.java

     private DualToneHandler mDualToneHandler;
 
     private ImageView mVolte;
+    private TextView mCarrierText;
+    private SubscriptionManager mSubscriptionManager;
 
     public static StatusBarMobileView fromContext(Context context, String slot) {
         LayoutInflater inflater = LayoutInflater.from(context);
@@ -80,6 +85,7 @@
 
     public StatusBarMobileView(Context context, AttributeSet attrs) {
         super(context, attrs);
+        mSubscriptionManager = SubscriptionManager.from(context);
     }
 
     public StatusBarMobileView(Context context, AttributeSet attrs, int defStyleAttr) {
@@ -113,6 +119,9 @@
         mOut = findViewById(R.id.mobile_out);
         mInoutContainer = findViewById(R.id.inout_container);
         mVolte = findViewById(R.id.mobile_volte);
+        mCarrierText = findViewById(R.id.qs_carrier_text);
+        mCarrierText.setText("");
 
         mMobileDrawable = new SignalDrawable(getContext());
         mMobile.setImageDrawable(mMobileDrawable);
@@ -159,6 +168,11 @@
             setVisibility(View.INVISIBLE);
             requestLayout();
         }
+        SubscriptionInfo subscriptionInfo = mSubscriptionManager.getActiveSubscriptionInfo(mState.subId);
+        if (subscriptionInfo != null) {
+            CharSequence cName = subscriptionInfo.getDisplayName();
+            mCarrierText.setText(cName);
+        }
     }
 
     private void initViewState() {
@@ -194,6 +208,11 @@
         }else {
             mVolte.setVisibility(View.GONE);
         }
+        SubscriptionInfo subscriptionInfo = mSubscriptionManager.getActiveSubscriptionInfo(mState.subId);
+        if (subscriptionInfo != null) {
+            CharSequence cName = subscriptionInfo.getDisplayName();
+            mCarrierText.setText(cName);
+        }
     }

StatusBarMobileView 中动态获取刷新运营商名称。针对状态栏中icon颜色,设计是有要求的,需要根据背景的变化进行适应。在浅色背景显示深色,深色背景显示浅色,有一定对比度才行。

XML 复制代码
//frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarMobileView.java

     private boolean updateState(MobileIconState state) {
@@ -258,6 +277,8 @@
         mMobileRoaming.setImageTintList(color);
         mDotView.setDecorColor(tint);
         mDotView.setIconColor(tint, false);
+        int foreground = mDualToneHandler.getSingleColor(intensity);
+        mCarrierText.setTextColor(foreground);
     }
 
     @Override
@@ -288,6 +309,7 @@
     @Override
     public void setDecorColor(int color) {
         mDotView.setDecorColor(color);
+        mCarrierText.setTextColor(color);
     }

四、隐藏原生锁屏界面运营商显示

原生设计会在锁屏界面只显示SIM卡运营商。状态栏增加自定义的显示后,锁屏界面可以删除。对应 View

复制代码
frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java

中的 mCarrierLabel ,设置隐藏即可。

相关推荐
众拾达人2 小时前
Android自动化测试实战 Java篇 主流工具 框架 脚本
android·java·开发语言
吃着火锅x唱着歌3 小时前
PHP7内核剖析 学习笔记 第四章 内存管理(1)
android·笔记·学习
_Shirley4 小时前
鸿蒙设置app更新跳转华为市场
android·华为·kotlin·harmonyos·鸿蒙
hedalei6 小时前
RK3576 Android14编译OTA包提示java.lang.UnsupportedClassVersionError问题
android·android14·rk3576
锋风Fengfeng6 小时前
安卓多渠道apk配置不同签名
android
枫_feng7 小时前
AOSP开发环境配置
android·安卓
叶羽西7 小时前
Android Studio打开一个外部的Android app程序
android·ide·android studio
qq_171538859 小时前
利用Spring Cloud Gateway Predicate优化微服务路由策略
android·javascript·微服务
Vincent(朱志强)10 小时前
设计模式详解(十二):单例模式——Singleton
android·单例模式·设计模式
mmsx10 小时前
android 登录界面编写
android·登录界面