android Copy联系人到SIM卡时,如何对姓名自动截断

1:添加相关函数和变量

private int SpecEncodingArrLen = 44;

private short[][] specialEncoding = {

{0x0040, 0x0000}, //@

{0x00A3, 0x0001},

{0x0024, 0x0002},

{0x00A5, 0x0003},

{0x00E8, 0x0004},

{0x00E9, 0x0005},

{0x00F9, 0x0006},

{0x00EC, 0x0007},

{0x00F2, 0x0008},

{0x00C7, 0x0009},

{0x0020, 0x000A},

{0x00D8, 0x000B},

{0x00F8, 0x000C},

{0x0020, 0x000D},

{0x00C5, 0x000E},

{0x00E5, 0x000F},

{0x0394, 0x0010},

{0x005F, 0x0011},

{0x03A6, 0x0012},

{0x0393, 0x0013},

{0x039B, 0x0014},

{0x03A9, 0x0015},

{0x03A0, 0x0016},

{0x03A8, 0x0017},

{0x03A3, 0x0018},

{0x0398, 0x0019},

{0x039E, 0x001A},

{0x00C6, 0x001C},

{0x00E6, 0x001D},

{0x00DF, 0x001E},

{0x00C9, 0x001F},

{0x00A4, 0x0024},

{0x00A1, 0x0040},

{0x00C4, 0x005B},

{0x00D6, 0x005C},

{0x00D1, 0x005D},

{0x00DC, 0x005E},

{0x00A7, 0x005F},

{0x00BF, 0x0060},

{0x00E4, 0x007B},

{0x00F6, 0x007C},

{0x00F1, 0x007D},

{0x00FC, 0x007E},

{0x00E0, 0x007F},

};

public int encodeUCS2_0x81(char[] src, char[] des, int maxLen)

{

int i, j, len;

int base = 0xFF000000;

short[] tmpAlphaId = new short[40*4+4+1];

char[] temp = new char[5];

len = src.length;

for (i=0,j=0; i<len; i+=4, j++) {

temp[0] = src[i];

temp[1] = src[i + 1];

temp[2] = src[i + 2];

temp[3] = src[i + 3];

temp[4] = 0;

tmpAlphaId[j] = (short) rild_sms_hexCharToDecInt(temp, 4);

}

tmpAlphaId[j] = ‘\0‘;

len = j;

if (len <= 3)   // at least 3 characters

return 0;

if ( ((len+3)*2+1) > maxLen) // the destinaiton buffer is not enough(include ‘\0‘)

return 0;

for(i=0; i<len; i++) {

int needSpecialEncoding = 0;

if((tmpAlphaId[i] & 0x8000) > 0) return 0;

for(int k=0; k<SpecEncodingArrLen; k++){

if(tmpAlphaId[i] == specialEncoding[k][0]){

tmpAlphaId[i] = specialEncoding[k][1];

needSpecialEncoding = 1;

break;

}

}

if(needSpecialEncoding != 1){

if(tmpAlphaId[i] < 128){

if(tmpAlphaId[i] == 0x0020 ||

tmpAlphaId[i] == 0x005E ||

tmpAlphaId[i] == 0x007B ||

tmpAlphaId[i] == 0x007D ||

tmpAlphaId[i] == 0x005B ||

tmpAlphaId[i] == 0x007E ||

tmpAlphaId[i] == 0x005D ||

tmpAlphaId[i] == 0x005C ||

tmpAlphaId[i] == 0x007C )

return 0;

else

{

if(tmpAlphaId[i] == 0x0060){

if(base == 0xFF000000){

base = 0;

tmpAlphaId[i] = 0x00E0;

}else{

return 0;

}

}

continue;

}

}

if(base == 0xFF000000){

base = tmpAlphaId[i] & 0x7f80;

}

tmpAlphaId[i] ^= base;

if ( tmpAlphaId[i] >= 128)

break;

tmpAlphaId[i] |= 0x80;

}

}

if (i != len)

return 0;

int realLen = 0;

for (i=0; i<len; i++) {

if((tmpAlphaId[i] & 0xFF00) != 0x1B00){

// do nothing

}

else{

realLen++;

}

}

realLen += len;

return realLen;

}

//进行UCS编码

public String encodeATUCS(String input) {

byte[] textPart;

StringBuilder output;

output = new StringBuilder();

if(input.length() > 40)

{

input = input.substring(0, 40);

}

for (int i = 0; i < input.length(); i++) {

String hexInt = Integer.toHexString(input.charAt(i));

for (int j = 0; j < (4 - hexInt.length()); j++)

output.append("0");

output.append(hexInt);

}

return output.toString();

}

public int rild_sms_hexCharToDecInt(char[] hex, int length)

{

int i = 0;

int value, digit;

for (i = 0, value = 0; i < length && hex[i] != ‘\0‘; i++)

{

if (hex[i]>=‘0‘ && hex[i]<=‘9‘)

{

digit = hex[i] - ‘0‘;

}

else if ( hex[i]>=‘A‘ && hex[i] <= ‘F‘)

{

digit = hex[i] - ‘A‘ + 10;

}

else if ( hex[i]>=‘a‘ && hex[i] <= ‘f‘)

{

digit = hex[i] - ‘a‘ + 10;

}

else

{

return -1;

}

value = value*16 + digit;

}

return value;

}

public int countTheLength(char[] line, int maxlen)

{

char[] alphaId = new char[40*4+4+1];

char[] temp = new char[5];

int tmp, i, j;

int nameLimited = maxlen;

//pack Alpha Id

int len = line.length;

if ((len%4) != 0) {

//LOGE("The alphaId should encode using Hexdecimal: %s", line);

}else if(len > (40*4)) {

//LOGE("The alphaId shouldn‘t longer than RIL_MAX_PHB_NAME_LEN");

}

for (i=0,j=0; i<len; i+=4, j++) {

temp[0] = line[i];

temp[1] = line[i + 1];

temp[2] = line[i + 2];

temp[3] = line[i + 3];

temp[4] = 0;

tmp = rild_sms_hexCharToDecInt(temp, 4);

if (tmp >= 128) {

break;

}

alphaId[j] = (char)tmp;

//alphaId[ril_max_phb_name_len] = ‘\0‘;

}

alphaId[j] = ‘\0‘;

if (i != len) {

len /= 4;

if (encodeUCS2_0x81(line, alphaId, alphaId.length) > 0) {  //try UCS2_0x81 coding

return (nameLimited - 3);

}

else {

// UCS2 coding

return (nameLimited - 2) / 2;

}

}

return nameLimited;

}

//返回根据SIM卡能保存的最大姓名长度,使用UCS2编码裁剪过后的姓名,也就是我们需要使用的自动截断后的姓名

//simTag  传入的姓名

//dstSlotId  卡槽ID (0或者1)

//iTel   ITelepony的接口,用于获取对应SIM卡能保存的姓名的最大长度

private String cutLongNameByte(String simTag, int nameLimit) {

int len = simTag.length();

try {

//7 bit string

byte[] iraResult = com.android.internal.telephony.GsmAlphabet.stringToGsm7BitPacked(simTag);

if (iraResult.length > nameLimit && simTag.length() > 0){

simTag = simTag.substring(0,simTag.length()-1);

simTag = cutLongNameByte(simTag, nameLimit);

}

} catch (EncodeException e) {

String temp = encodeATUCS(simTag);

int length = countTheLength(temp.toCharArray(), nameLimit);

if (len > length) {

simTag = simTag.substring(0, length);

}

}

return simTag;

}

2:将相关的头文件包含进去:

import com.android.internal.telephony.ITelephony;

import com.android.internal.telephony.EncodeException;

import android.os.ServiceManager;

3:上面部分的code,完整的实现了cutLongNameByte 这个函数,该函数实现了对姓名进行自动截断的功能

,可保证编码一致性。

所以上面一段code,是可以放到联系人中的任何java文件中的。

以在联系人中批量copy联系人到SIM卡为例,

在ICS及ICS以上的版本中,Copy联系人到SIM卡是在CopyProcessor.java中完成的(GB版本无copy到SIM的feature),

所以上面的修改都可以放到CopyProcessor.java中.

在CopyProcessor.java文件中的

private void copyContactsToSim() {方法中,

找到for (int i = 0; i < maxCount; i++) {循环,在这个循环的上面加入声明语句:

final ITelephony iTel = ITelephony.Stub.asInterface(ServiceManager

.getService(Context.TELEPHONY_SERVICE));

在循环的下面加入

if (!TextUtils.isEmpty(simTag)) {

simTag = cutLongNameByte(simTag,dstSlotId,iTel);

}语句.

同样如果其它任何流程有需要截断姓名以适应SIM卡,黑体部分的code(主要实现的是cutLongNameByte 这个函数,

它实现了根据SIM卡的需求对姓名进行截断的功能),都是可以单独移植到对应流程中。

[KK版本]:

KK上对getAdnStorageInfo的实现做了改动.

1 需要import 下面的包

import com.mediatek.common.telephony.ITelephonyEx;

import com.mediatek.telephony.TelephonyManagerEx;

import android.os.ServiceManager;

2 getAdnStorageInfo的调用参考下面的代码:

int[] storageInfos = null;

try {

ITelephonyEx phoneEx = ITelephonyEx.Stub.asInterface(ServiceManager

.checkService("phoneEx"));

if (!mIsCancelled && phoneEx != null)

storageInfos = phoneEx.getAdnStorageInfo(simInfo.mSimSlotId);

...

时间: 2024-12-17 00:19:50

android Copy联系人到SIM卡时,如何对姓名自动截断的相关文章

[android] 手机卫士绑定sim卡

读取sim卡的序列号,保存起来,一旦sim发生变更了,认为是小偷的sim卡,发出警告 读取sim卡序列号 获取TelephonyManager对象,通过getSystemService(TELEPHONY_SERVICE) 调用TelephonyManager对象的getSimSerialNumber()方法,得到String类型的序列号 把序列号保存在SharedPreences里面 需要加权限 android.permission.READ_PHONE_STATE 检测sim卡是否变更 使用

Android小功能实现-sim卡读取,发短信,播放音乐

1.读取sim卡信息 private TelephonyManager tm; tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE); String sim = tm.getSimSerialNumber(); 需要TelephonyManager 加权限 <uses-permission android:name="android.permission.READ_PHONE_STATE"/> 2.发短信 S

Android 手机卫士--绑定sim卡序列号

现在开始具体 处理每一个导航页面的逻辑,首先看第二个导航页 本文地址:http://www.cnblogs.com/wuyudong/p/5949775.html,转载请注明出处. 这里需要实现绑定sim卡序列号的功能,注意添加相应的权限:uses-permission android:name="android.permission.READ_PHONE_STATE" private SettingItemView siv_sim_bound; @Override protected

Android ExpandableListView使用+获取SIM卡状态信息

ExpandableListView 是一个可以实现下拉列表的控件,大家可能都用过QQ,QQ中的好友列表就是用ExpandableListView实现的,不过它是自定义的适配器.本篇 博客除了要介绍ExpandableListView的使用,还整合了获取SIM的状态,这个很简单也就是获取系统服务,再调用相应的方法就可以实现,在 这里只是记录一下. 本篇博客要实现效果图如下: 除了子列表不怎么好看之外,组列表还是蛮好看的,这里只是为了演示,子列表就没做特别的处理. 布局文件: /SIM_Card_

android 系统存在多个Launcher时,设置开机自动进入默认的Launcher

开机完成并解锁后,如果android系统存在多个Launcher,系统会弹出一个选择框让用户选择进入某个Launcher.如果用户不想选择,而是想直接进入某一个默认的Launcher,要怎么修改? 注意:此修改方法对Google Now Launcher(GoogleHome.apk)无效,因为此APP启动Activity的<intent-filter>中无<category android:name="android.intent.category.HOME" /&

【边做项目边学Android】手机安全卫士10-设置向导之绑定SIM卡

上回主要做了设置向导界面的界面设计,主要涉及到界面的布局和一些控件的使用.这次要做设置向导界面的功能具体实现. 首先,4个界面分别是(重复度很大,这里就不再贴到正文中了) /mobilesafe/res/layout/setup_wizard1.xml /mobilesafe/res/layout/setup_wizard2.xml /mobilesafe/res/layout/setup_wizard3.xml /mobilesafe/res/layout/setup_wizard4.xml

十九、android中判断sim卡状态和读取联系人资料的方法

在写程序中,有时候可能需要获取sim卡中的一些联系人资料.在获取sim卡联系人前,我们一般会先判断sim卡状态,找到sim卡后再获取它的资料,如下代码我们可以读取sim卡中的联系人的一些信息. PhoneTest.java package com.android.test; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.datab

android中判断sim卡状态和读取联系人资料的方法

在写程序中,有时候可能需要获取sim卡中的一些联系人资料.在获取sim卡联系人前,我们一般会先判断sim卡状态,找到sim卡后再获取它的资料,如下代码我们可以读取sim卡中的联系人的一些信息. PhoneTest.java package com.android.test; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.datab

android SIM卡中联系人不能收藏的问题

因为sim 卡的联系人是保存在sim 卡的EF文件中,而这些文件中各个字段都是已经固定好的. 所以,没有办法增加一个字段来保存收藏的信息. 因此,我们可以设想下,假设我们把收藏信息存在数据库中,如果我们拔掉卡,再插上,这些收藏信息必然都会丢掉(每次开机都会重新从SIM卡导入联系人数据),所以这个功能没有意义!