Android 设置SIM卡界面定制

Android 设置SIM卡界面定制

REQ: ODM定制需求,设置,SIM卡界面需要显示运营商和SIM卡电话号码。效果如下图

sdaasdaffad

采用方案

修改网络配置xml文件,增加LayoutPreference选项,在该选项下,新增layout布局文件,显示相关运营商和电话号码信息。

其中在layout中,引入了新增加的圆角xml文件,使其更美观。

在加载网络xml文件的MobileNetworkSettings.java文件,find id信息,然后做相关setText操作。

获取运营商信息时,telephonyManager有接口可以直接调用。获取双卡槽电话号码时,通过
SubscriptionManager subscriptionManager = SubscriptionManager.from(getContext());
List subsInfoList = subscriptionManager.getActiveSubscriptionInfoList();获取赋值。

Modify仓库信息

A:packages/apps/Settings/res/drawable/btn_shape.xml
A:packages/apps/Settings/res/layout/phone_number_settings_pic.xml
M:packages/apps/Settings/res/xml/mobile_network_settings.xml
M:packages/apps/Settings/src/com/android/settings/network/telephony/MobileNetworkSettings.java
A:packages/apps/Settings/src/com/android/settings/network/telephony/PhoneNumberPreferenceController.java
M:vendor/xxx/project_name/config.mk

具体修改

//overlay控制,公共仓库提交修改,单个odm控制此功能开启
vendor/xxx/project_name/config.mk

#add by hhuiming  on 2023-02-13
PRODUCT_PRODUCT_PROPERTIES += ro.feature.show_phonenumber_support=true
#add by hhuiming end
//为layout增加圆角背景,可参考如下链接https://blog.csdn.net/zsl20200217/article/details/128766934
A:packages/apps/Settings/res/drawable/btn_shape.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
 
    <!-- 实心长方形 -->
    <solid android:color="#d3d3d3" />
 
    <!-- 设置弧度 -->
    <corners android:radius="15dp" />
 
</shape>
//自定义新增布局
A:packages/apps/Settings/res/layout/phone_number_settings_pic.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">
    <LinearLayout
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:orientation="vertical"
        android:layout_marginStart="20dp"
        android:layout_marginTop="40dp"
	android:background="@drawable/btn_shape">
        <!--ImageView
            android:id="@+id/sim1_pic"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/ic_launcher_settings" 
	    android:layout_marginTop="20dp"
            android:layout_marginStart="10dp"/-->
	<TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="SIM 1"
            android:layout_marginTop="20dp"
            android:textSize="25dp"
	    android:textColor="#000000"
            android:layout_marginStart="10dp"/>
        <TextView
            android:id="@+id/opeator_sim1_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Unknown"
	    android:textColor="#000000"
            android:layout_marginTop="20dp"
	    android:layout_marginStart="10dp"/>
        <TextView
            android:id="@+id/sim1_phone_number"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Unknown"
	    android:textColor="#000000"
            android:layout_marginTop="20dp"
	    android:layout_marginStart="10dp"
	    android:layout_marginBottom="10dp"/>
    </LinearLayout>
    <LinearLayout
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:orientation="vertical"
        android:layout_marginTop="40dp"
	android:layout_marginStart="10dp"
        android:layout_marginEnd="20dp"
	android:background="@drawable/btn_shape">
        <!--ImageView
            android:id="@+id/sim2_pic"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/ic_launcher_settings" 
	    android:layout_marginTop="20dp"
            android:layout_marginStart="10dp"/-->
	<TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="SIM 2"
            android:layout_marginTop="20dp"
            android:textSize="25dp"
	    android:textColor="#000000"
            android:layout_marginStart="10dp"/>
        <TextView
            android:id="@+id/opeator_sim2_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Unknown"
	    android:textColor="#000000"
            android:layout_marginTop="20dp"
	    android:layout_marginStart="10dp"/>
        <TextView
            android:id="@+id/sim2_phone_number"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Unknown"
            android:textColor="#000000"
            android:layout_marginTop="20dp"
            android:layout_marginStart="10dp"
	    android:layout_marginBottom="10dp"/>
    </LinearLayout>
</LinearLayout>
//网络配置xml,新增LayoutPreference。增加对应的PreferenceController,控制该布局的显示与隐藏,功能开启与关闭
M:packages/apps/Settings/res/xml/mobile_network_settings.xml
<PreferenceScreen
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:settings="http://schemas.android.com/apk/res-auto"
    android:key="mobile_network_pref_screen">
    <com.android.settingslib.widget.LayoutPreference
        android:key="phone_number_settings_preview"
        android:layout="@layout/phone_number_settings_pic"
        android:selectable="false"
        settings:searchable="false"
        settings:controller="com.android.settings.network.telephony.PhoneNumberPreferenceController"/>
//新增获运营商,电话号码相关逻辑
M:packages/apps/Settings/src/com/android/settings/network/telephony/MobileNetworkSettings.java
import com.android.settingslib.widget.LayoutPreference;
import android.widget.TextView;
import android.telephony.SubscriptionInfo;
import android.os.SystemProperties;


//add by hhuiming on 2023-02-13
public static final boolean FEATURE_SHOW_PHONE_NUMBER_SUPPORT = SystemProperties.getBoolean("ro.feature.show_phonenumber_support", false);
private static final String PREF_PHONE_NUMBER_PREVIEW = "phone_number_settings_preview";
LayoutPreference phoneNumberPreview;
private TextView opeator_sim1_name,sim1_phone_number,opeator_sim2_name,sim2_phone_number;
//add by hhuiming end


onCreate(){
    .......
	//add by hhuiming on 2023-02-13
	if(FEATURE_SHOW_PHONE_NUMBER_SUPPORT){
	    initOperatorAndPhoneNubmer();
	    getSimoperatorName(0);
            getSimoperatorName(1);
	    getSlotPhoneNumber();
	}
	//add by hhuiming end
	.......

	    //add by hhuiming on 2023-02-13 for ID1000707
    private void initOperatorAndPhoneNubmer(){
        phoneNumberPreview = findPreference(PREF_PHONE_NUMBER_PREVIEW);
        if(phoneNumberPreview != null){
            opeator_sim1_name = phoneNumberPreview.findViewById(R.id.opeator_sim1_name);
            sim1_phone_number = phoneNumberPreview.findViewById(R.id.sim1_phone_number);
            opeator_sim2_name = phoneNumberPreview.findViewById(R.id.opeator_sim2_name);
            sim2_phone_number = phoneNumberPreview.findViewById(R.id.sim2_phone_number);
        }
    }
    private void getSlotPhoneNumber(){
        SubscriptionManager subscriptionManager = SubscriptionManager.from(getContext());
        List<SubscriptionInfo> subsInfoList = subscriptionManager.getActiveSubscriptionInfoList();
        Log.d(LOG_TAG,"getSlotPhoneNumber Current list =" + subsInfoList);
	if(subsInfoList != null){
	    for (SubscriptionInfo subscriptionInfo : subsInfoList) {
		int slotId = subscriptionInfo.getSimSlotIndex();
		Log.d(LOG_TAG,"subscriptionInfo  =" + slotId + ", getNumber = " + subscriptionInfo.getNumber());
		switch (slotId){
		    case 0:
		        String slot_one_number= subscriptionInfo.getNumber();
			Log.d(LOG_TAG,"subscriptionInfo  slotId 0 slot_one_number" + slot_one_number + ", getNumber = " + sim1_phone_number.getText());
                        if(!sim1_phone_number.getText().equals(slot_one_number)){
			    if(slot_one_number.isEmpty()){
			    	sim1_phone_number.setText("Unknown");
                            } else {
			    	sim1_phone_number.setText(slot_one_number);
                            }
                        }
		       break;
		    case 1:
		        String slot_two_number= subscriptionInfo.getNumber();
		 	    Log.d(LOG_TAG,"subscriptionInfo  slotId 1 slot_two_number" + slot_two_number + ", getNumber = " + sim1_phone_number.getText());
                if(!sim2_phone_number.getText().equals(slot_two_number)){
			    	if(slot_two_number.isEmpty()){
			    		sim2_phone_number.setText("Unknown");
                   } else {
			    		sim2_phone_number.setText(slot_two_number);
                        }
                   }
		       break;
		    default:
		        sim1_phone_number.setText("Unknown");
			sim2_phone_number.setText("Unknown");
			break;
		}
            }
	}
    }
    private void getSimoperatorName(int phoneId) {
        int simState = mTelephonyManager.getSimState(phoneId);
	Log.d(LOG_TAG," getSimoperatorName simState = " + simState);
        switch (phoneId){
            case 0:
                if(TelephonyManager.SIM_STATE_READY == simState){
                    if(mTelephonyManager != null){
                        String sim1_name= mTelephonyManager.getSimOperatorNameForPhone(phoneId);
                        if(!opeator_sim1_name.getText().equals(sim1_name)){
                            opeator_sim1_name.setText(sim1_name);
                        }
                    }
                } else {
                    opeator_sim1_name.setText("Unknown");
                }
                break;
            case 1:
                if(TelephonyManager.SIM_STATE_READY == simState){
                    if(mTelephonyManager != null){
                        String sim2_name= mTelephonyManager.getSimOperatorNameForPhone(phoneId);
                        if(!opeator_sim2_name.getText().equals(sim2_name)){
                            opeator_sim2_name.setText(sim2_name);
                        }
                    }
                } else {
                    opeator_sim2_name.setText("Unknown");
                }
                break;
            default:
                break;
        }
    }
    //add by hhuiming end
}
//增加PreferenceController,控制新增layoutPreference 控件的显示与隐藏
A:packages/apps/Settings/src/com/android/settings/network/telephony/PhoneNumberPreferenceController.java
/*
 * Copyright (C) 2018 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.android.settings.network.telephony;
import android.content.Context;
import android.os.SystemProperties;
import com.android.settings.R;
import com.android.settings.core.BasePreferenceController;
public class PhoneNumberPreferenceController extends BasePreferenceController {
    public static final boolean FEATURE_SHOW_PHONE_NUMBER_SUPPORT = getBoolean("ro.feature.show_phonenumber_support");
    public PhoneNumberPreferenceController(Context context, String preferenceKey) {
        super(context, preferenceKey);
    }
    @Override
    public int getAvailabilityStatus() {
        return FEATURE_SHOW_PHONE_NUMBER_SUPPORT ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
    }
    public static boolean getBoolean(final String featureKey) {
        return SystemProperties.getBoolean(featureKey, false);
    }
}

done,完成,收工,有问题在DEBUG

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要监听 Android 设备的 SIM 卡状态,可以使用 `PhoneStateListener` 类。以下是一个示例代码: ```java import android.content.Context; import android.telephony.PhoneStateListener; import android.telephony.TelephonyManager; import android.util.Log; public class SimStateReceiver { private static final String TAG = "SimStateReceiver"; private Context mContext; private TelephonyManager mTelephonyManager; private PhoneStateListener mPhoneStateListener; public SimStateReceiver(Context context) { mContext = context; mTelephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); mPhoneStateListener = new PhoneStateListener() { @Override public void onCallStateChanged(int state, String phoneNumber) { super.onCallStateChanged(state, phoneNumber); Log.d(TAG, "onCallStateChanged: state = " + state + ", phoneNumber = " + phoneNumber); } @Override public void onServiceStateChanged(ServiceState serviceState) { super.onServiceStateChanged(serviceState); Log.d(TAG, "onServiceStateChanged: serviceState = " + serviceState); } @Override public void onSimStateChanged(int state) { super.onSimStateChanged(state); Log.d(TAG, "onSimStateChanged: state = " + state); switch (state) { case TelephonyManager.SIM_STATE_ABSENT: // SIM 卡不存在或未插入 break; case TelephonyManager.SIM_STATE_NETWORK_LOCKED: // SIM 卡已被网络锁定 break; case TelephonyManager.SIM_STATE_PIN_REQUIRED: // SIM 卡需要 PIN 解锁 break; case TelephonyManager.SIM_STATE_PUK_REQUIRED: // SIM 卡需要 PUK 解锁 break; case TelephonyManager.SIM_STATE_READY: // SIM 卡已准备好 break; case TelephonyManager.SIM_STATE_UNKNOWN: // SIM 卡状态未知 break; } } }; } public void start() { mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_CALL_STATE | PhoneStateListener.LISTEN_SERVICE_STATE | PhoneStateListener.LISTEN_SIM_STATE); } public void stop() { mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE); } } ``` 在上面的代码中,我们创建了一个 `SimStateReceiver` 类,它有一个 `start()` 方法和一个 `stop()` 方法,用于开始和停止监听 SIM 卡状态。在 `SimStateReceiver` 的构造方法中,我们创建了一个 `PhoneStateListener` 对象,并重写了其中的 `onSimStateChanged()` 方法,用于监听 SIM 卡状态的变化。在 `onSimStateChanged()` 方法中,我们根据不同的 SIM 卡状态打印不同的日志信息。最后,在 `start()` 方法中,我们通过 `TelephonyManager` 的 `listen()` 方法注册了 `PhoneStateListener` 对象,开始监听 SIM 卡状态。在 `stop()` 方法中,我们通过 `TelephonyManager` 的 `listen()` 方法取消了 `PhoneStateListener` 对象的注册,停止监听 SIM 卡状态。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值