关于android中操作sim卡联系人的相关内容

    技术2022-05-20  31

    本文转自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.java2,存入联系人到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卡中了


    最新回复(0)