关于android中操作sim卡联系人的相关内容
来源:互联网 发布:淘宝藏壶天下 编辑:程序博客网 时间:2024/05/17 08:03
本文转自csdn论坛,链接如下:http://topic.csdn.net/u/20110417/14/edcbbcd9-44f0-4175-a156-0231d12cba47.html?seed=958457557&r=72822325#r_72822325
1,sim卡联系人的增,删,修改
Uri是content://icc/adn/
具体使用跟操作其他的contentprovider一样,传递的参数可以参照/base/telephony/java/com/android/internal/telephony/IccProvider.java
2,存入联系人到USIM卡的问题
这个问题的实质是普通sim卡文件的EF ID跟USIM卡中的EF ID不同造成,SIM卡中的使用的是是EF_ADN = 0x6F3A,而USIM卡中存储联系人的EFID 则为EF_PBR = 0x4F30
修改办法:
1,在/base/telephony/java/com/android/internal/telephony/IccPhoneBookInterfaceManager.java 中的updateAdnRecordsInEfBySearch函数当中检查是不是使用USIM卡
加入下面一行
if (phone.getContext().checkCallingOrSelfPermission(
android.Manifest.permission.WRITE_CONTACTS)
!= PackageManager.PERMISSION_GRANTED) {
throw new SecurityException(
"Requires android.permission.WRITE_CONTACTS permission");
}
// modified by leon at 5/11/2010 change sim card ef to USIM card ef if user use USIM card
efid = updateEfForIccType(efid);
// modified end;
if (DBG) logd("updateAdnRecordsInEfBySearch: efid=" + efid +
" ("+ oldTag + "," + oldPhoneNumber + ")"+ "==>" +
" ("+ newTag + "," + newPhoneNumber + ")"+ " pin2=" + pin2);
updateEfForIccType(efid)的实现为:
private int updateEfForIccType(int efid) {
// Check if we are trying to read ADN records
if (efid == IccConstants.EF_ADN) {
if (phone.getIccCard().isApplicationOnIcc(IccCardApplication.AppType.APPTYPE_USIM)) {
return IccConstants.EF_PBR;
}
}
return efid;
}
在/base/telephony/java/com/android/internal/telephony/AdnRecordCache.java中我修改之后的updateAdnBySearch函数为
public void updateAdnBySearch(int efid, AdnRecord oldAdn, AdnRecord newAdn,
String pin2, Message response) {
int extensionEF;
extensionEF = extensionEfForEf(efid);
if (extensionEF < 0) {
sendErrorResponse(response, "EF is not known ADN-like EF:" + efid);
return;
}
// modified by leon 5/11/2010
// if user use USIM card,the change the phonebook ef
ArrayList<AdnRecord> oldAdnList = null;
if(efid == EF_PBR){
int usimEf[] = mUsimPhoneBookManager.getUsimEf();
int usimExtensionEF[] = mUsimPhoneBookManager.getUsimExtensionEF();
int size = usimEf.length;
for(int i =0;i<size;i++){
oldAdnList = getRecordsIfLoaded(usimEf[i]);
efid = usimEf[i];
extensionEF = usimExtensionEF[i];
boolean bBreak = false;
if (oldAdnList != null){
for (Iterator<AdnRecord> it = oldAdnList.iterator(); it.hasNext();) {
if (oldAdn.isEqual(it.next())) {
bBreak = true;
break;
}
}
}
if(bBreak)
break;
}
}else{
oldAdnList = getRecordsIfLoaded(efid);
}
// modified end
if (oldAdnList == null) {
sendErrorResponse(response, "Adn list not exist for EF:" + efid);
return;
}
int index = -1;
int count = 1;
for (Iterator<AdnRecord> it = oldAdnList.iterator(); it.hasNext(); ) {
if (oldAdn.isEqual(it.next())) {
index = count;
break;
}
count++;
}
if (index == -1) {
sendErrorResponse(response, "Adn record don't exist for " + oldAdn);
return;
}
Message pendingResponse = userWriteResponse.get(efid);
if (pendingResponse != null) {
sendErrorResponse(response, "Have pending update for EF:" + efid);
return;
}
userWriteResponse.put(efid, response);
new AdnRecordLoader(phone).updateEF(newAdn, efid, extensionEF,
index, pin2,
obtainMessage(EVENT_UPDATE_ADN_DONE, efid, index, newAdn));
}
其中getUsimEf跟getUsimExtensionEF两个函数的实现如下:
// add by leon at 5/11/2010
/****
* @hide
* @return usim card ef
*/
public int[] getUsimEf(){
if (mPbrFile == null) return null;
int numRecs = mPbrFile.mFileIds.size();
int[] result = new int[numRecs];
for (int i = 0; i < numRecs; i++) {
Map <Integer,Integer> fileIds;
fileIds = mPbrFile.mFileIds.get(i);
if (fileIds == null || fileIds.isEmpty()){
result[i] = 0;
}else{
result[i] = fileIds.get(USIM_EFADN_TAG);
}
}
return result;
}
/****
* @hide
* @return usim card's extensionEF
*/
public int[] getUsimExtensionEF(){
if (mPbrFile == null) return null;
int numRecs = mPbrFile.mFileIds.size();
int[] result = new int[numRecs];
for (int i = 0; i < numRecs; i++) {
Map <Integer,Integer> fileIds;
fileIds = mPbrFile.mFileIds.get(i);
if (fileIds == null || fileIds.isEmpty()){
result[i] = 0;
}else{
result[i] = fileIds.get(USIM_EFEXT1_TAG);
}
}
return result;
}
/****
* @hide
* @param adn
* add a new adn,when export a contact to usim card
*/
public void addUsimAdn(AdnRecord adn){
mPhoneBookRecords.add(adn);
}
// add end
这里还有一个addUsimAdn函数调用是在这个文件中handleMessage函数中,具体干啥好像是在写入USIM卡的同时也在保留一份在cache文件中
handleMessage(Message msg) {
AsyncResult ar;
int efid;
switch(msg.what)
case EVENT_UPDATE_ADN_DONE:
ar = (AsyncResult)msg.obj;
efid = msg.arg1;
int index = msg.arg2;
AdnRecord adn = (AdnRecord) (ar.userObj);
if (ar.exception == null) {
adnLikeFiles.get(efid).set(index - 1, adn);
// add by leon to update UsimPhoneBookManager,when export a contacts to usim card.
if(efid!=IccConstants.EF_ADN){
mUsimPhoneBookManager.addUsimAdn(adn);
}
// add end
}
这些修改应该能把联系人存入USIM卡中了
- 关于android中操作sim卡联系人的相关内容
- 关于android中操作sim卡联系人的相关内容
- android操作sim卡联系人信息
- android操作sim卡联系人信息
- Android SIM卡联系人操作总结
- sim卡操作联系人
- 将SIM卡上的联系人导入Android手机中
- android SIM卡中联系人不能收藏的问题
- Android学习之——操作SIM卡联系人
- android读取sim卡联系人
- android读取sim卡联系人
- Android 获取Sim卡联系人
- android读取sim卡联系人
- android中对sim卡联系人的增删改查以及监听sim卡联系数据的改变
- Android开发之获得通讯录及SIM卡中联系人
- Android从SIM卡中获取联系人信息
- android中判断sim卡状态和读取联系人资料的方法
- android中判断sim卡状态和读取联系人资料的方法
- 直接照镜子
- 硬修改VMWARE虚拟机网卡MAC
- 一种特殊情况
- 邮件规则
- 我刚来,大家好
- 关于android中操作sim卡联系人的相关内容
- C/C++程序员应聘常见面试题深入剖析
- QCon 2011参会收获——其它
- flash 常用快捷键
- ArcGIS在线应用介绍(12)华盛顿州地质信息门户
- java 利用反射机制创建类
- 对社会腐败的认识
- Linux下,使用C/C++一个简单的消息处理程序
- ubuntu中配置任意应用的快捷键