解决Android 6.0 Sim卡 iccid获取不完整问题

这篇博客介绍了如何解决在Android 6.0系统中Sim卡iccid获取不完整的问题,通过修改`IccUtils.java`和`SIMRecords.java`文件,利用`SystemProperties`和`Settings`进行修复。

diff --git a/android/frameworks/opt/telephony/src/java/com/android/internal/telephony/uicc/IccUtils.java b/android/frameworks/opt/telephony/src/java/com/android/internal/telephony/uicc/IccUtils.java
old mode 100644
new mode 100755
index 3c2f1f3…2e6f44c
— a/android/frameworks/opt/telephony/src/java/com/android/internal/telephony/uicc/IccUtils.java
+++ b/android/frameworks/opt/telephony/src/java/com/android/internal/telephony/uicc/IccUtils.java
@@ -25,6 +25,12 @@ import android.telephony.Rlog;
import com.android.internal.telephony.GsmAlphabet;
import java.io.UnsupportedEncodingException;

+import android.provider.Settings;
+import android.content.Context;
+import android.util.Log;
+import android.os.SystemProperties;
+
+
/**

  • Various methods, useful for dealing with SIM data.
    */
    @@ -41,25 +47,90 @@ public class IccUtils {
    */
    public static String
    bcdToString(byte[] data, int offset, int length) {
  • try {
  •     String result = SystemProperties.get("net.ppp0.sim_ccid");
    
  •    Log.i(LOG_TAG, "getSystemProperties: "+result);
    

+//ghijklmnopqrstuvwxyz

  •    if (result.contains("g") || result.contains("h")|| result.contains("i")|| result.contains("j") ||
    
  •    result.contains("k") || result.contains("l")|| result.contains("m")|| result.contains("n")  ||
    
  •    result.contains("o") || result.contains("p")|| result.contains("q")|| result.contains("r")  ||
    
  •    result.contains("s") || result.contains("t")|| result.contains("u")|| result.contains("v")  ||
    
  •    result.contains("w") || result.contains("x")|| result.contains("y")|| result.contains("z")){
    
  •   			String lowerIccid =  LowercaseToString(data,offset,length);
    
  •   		  Log.i(LOG_TAG,"lowerIccid: " +lowerIccid);
    
  •   		return lowerIccid;
    
  •    }else if (result.contains("G") || result.contains("H")|| result.contains("I")|| result.contains("J") ||
    
  •            result.contains("K") || result.contains("L")|| result.contains("M")|| result.contains("N")  ||
    
  •            result.contains("O") || result.contains("P")|| result.contains("Q")|| result.contains("R")  ||
    
  •            result.contains("S") || result.contains("T")|| result.contains("U")|| result.contains("V")  ||
    
  •            result.contains("W") || result.contains("X")|| result.contains("Y")|| result.contains("Z")){
    
  •   	   return HeightcaseToString(data,offset,length);
    
  •    }else{
    
  •        //default
    
  •        Log.i(LOG_TAG, "iccid---default");
    
  •   	DefaultToString(data,offset,length);
    
  •    }
    
  •        int sim_iccid_status = SystemProperties.getInt("sim_iccid_status",0);//Settings.Global.getInt(mContext.getContentResolver(), "sim_iccid_status",0);
    
  •        //0 小写  1 大小
    
  •      //  Settings.Global.putInt(this.getContentResolver(),"sim_iccid_status",1);
    
  •    } catch (Exception e) {
    
  •        e.printStackTrace();
    
  •    }
    
  •   return "";
    
  • }

  • public static String

  • DefaultToString(byte[] data, int offset, int length) {
    StringBuilder ret = new StringBuilder(length*2);

    for (int i = offset ; i < offset + length ; i++) {
    
  •        byte b;
           int v;
    
           v = data[i] & 0xf;
    
  •        if (v > 9)  break;
    
  •        ret.append((char)('0' + v));
    
  •        ret.append("0123456789abcdef".charAt(v));
    
           v = (data[i] >> 4) & 0xf;
    
  •        // Some PLMNs have 'f' as high nibble, ignore it
    
  •        if (v == 0xf) continue;
    
  •        if (v > 9)  break;
    
  •        ret.append((char)('0' + v));
    
  •        ret.append("0123456789abcdef".charAt(v));
       }
    
       return ret.toString();
    
    }
  • static String LowercaseToString(byte[] data, int offset, int length){
  •   StringBuilder ret = new StringBuilder(length*2);
    
  •   for (int i = offset ; i < offset + length ; i++) {
    
  •   int v;
    
  •   v = data[i] & 35;
    
  •   ret.append("0123456789abcdefghijklmnopqrstuvwxyz".charAt(v));
    
  •   v = (data[i] >> 4) & 35;
    
  •   ret.append("0123456789abcdefghijklmnopqrstuvwxyz".charAt(v));
    
  •   }
    
  •   return ret.toString();
    
  • }
  • static String HeightcaseToString(byte[] data, int offset, int length){
  •   StringBuilder ret = new StringBuilder(length*2);
    
  •   for (int i = offset ; i < offset + length ; i++) {
    
  •   int v;
    
  •   v = data[i] & 35;
    
  •   ret.append("0123456789ABCDEFGHIJKMNOPQRSTUVWXYZ".charAt(v));
    
  •   v = (data[i] >> 4) & 35;
    
  •   ret.append("0123456789ABCDEFGHIJKMNOPQRSTUVWXYZ".charAt(v));
    
  •   }
    
  •   return ret.toString();
    
  • }
 /**
  * Decode cdma byte into String.

diff --git a/android/frameworks/opt/telephony/src/java/com/android/internal/telephony/uicc/SIMRecords.java b/android/frameworks/opt/telephony/src/java/com/android/internal/telephony/uicc/SIMRecords.java
old mode 100644
new mode 100755
index 4c93b21…bb6fc54
— a/android/frameworks/opt/telephony/src/java/com/android/internal/telephony/uicc/SIMRecords.java
+++ b/android/frameworks/opt/telephony/src/java/com/android/internal/telephony/uicc/SIMRecords.java
@@ -38,6 +38,10 @@ import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Arrays;

+import java.util.Arrays;
+import android.util.Log;
+import android.os.SystemProperties;
+
/**

  • {@hide}
    */
    @@ -863,8 +867,8 @@ public class SIMRecords extends IccRecords {
    if (ar.exception != null) {
    break;
    }
  •            mIccId = IccUtils.bcdToString(data, 0, data.length);
    
  • log("initdata: " +Arrays.toString(data));
  •            mIccId = SystemProperties.get("net.ppp0.sim_ccid");//IccUtils.bcdToString(data, 0, data.length);
    
               log("iccid: " + mIccId);
    
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

android framework

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值