zoukankan      html  css  js  c++  java
  • 在手机中预置联系人/Service Number

                      
    代码分为两部分:
    Part One 将预置的联系人插入到数据库中;
    Part Two 保证预置联系人仅仅读,无法被编辑删除(在三个地方屏蔽对预置联系人进行编辑处理:联系人详情界面、联系人多选界面、新建联系人选择合并联系人时)。
    【注意】假设您不须要限制预置联系人的删除/编辑操作,增加Part One部分代码就可以,并去掉第三步”新增函数“  中的语句:contactvalues.put(RawContacts.IS_SDN_CONTACT, -1);
     
    Part One:
    File:AbstractStartSIMService.java
    Path: alpspackagesappsContactssrccommediatekcontactssimcontact
     
    1.引入包
    import android.provider.ContactsContract.PhoneLookup;
     
    2.添加变量
    private static boolean sIsRunningNumberCheck = false;
    private static final int INSERT_PRESET_NUMBER_COUNT = xxx;           //预置联系人的个数
    private static final String  INSERT_PRESET_NAME[]    = {"xxx1","xxx2",...};  //各预置联系人的姓名 
    private static final String  INSERT_PRESET_NUMBER[] = {"xxx1","xxx2",...};  //各预置联系人的号码
     
    3.添加函数(将预置联系人信息写入数据库中):
      private void importDefaultReadonlyContact() {
          new Thread(new Runnable() {
     
              @Override
              public void run() {
                  Log.i(TAG, "isRunningNumberCheck before: " + sIsRunningNumberCheck);
                  if (sIsRunningNumberCheck) {
                       return;
                  }
                  sIsRunningNumberCheck = true;
                  for(int i = 0;i < INSERT_PRESET_NUMBER_COUNT; i++)
                  {
                    Log.i(TAG, "isRunningNumberCheck after: " + sIsRunningNumberCheck);
                    Uri uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri
                            .encode(INSERT_PRESET_NUMBER[i]));
                    Log.i(TAG, "getContactInfoByPhoneNumbers(), uri = " + uri);
     
                    Cursor contactCursor = getContentResolver().query(uri, new String[] {
                            PhoneLookup.DISPLAY_NAME, PhoneLookup.PHOTO_ID
                    }, null, null, null);
                    try {
                        if (contactCursor != null && contactCursor.getCount() > 0) {
                            return;
                        } else {
                            final ArrayList<ContentProviderOperation> operationList = new ArrayList<ContentProviderOperation>();
                            ContentProviderOperation.Builder builder = ContentProviderOperation
                                    .newInsert(RawContacts.CONTENT_URI);
                            ContentValues contactvalues = new ContentValues();
                            contactvalues.put(RawContacts.ACCOUNT_NAME,
                                    AccountType.ACCOUNT_NAME_LOCAL_PHONE);
                            contactvalues.put(RawContacts.ACCOUNT_TYPE,
                                    AccountType.ACCOUNT_TYPE_LOCAL_PHONE);
                            contactvalues.put(RawContacts.INDICATE_PHONE_SIM,
                                    ContactsContract.RawContacts.INDICATE_PHONE);
                            contactvalues.put(RawContacts.IS_SDN_CONTACT, -1);
                            builder.withValues(contactvalues);
                            builder.withValue(RawContacts.AGGREGATION_MODE,
                                    RawContacts.AGGREGATION_MODE_DISABLED);
                            operationList.add(builder.build());
     
                            builder = ContentProviderOperation.newInsert(Data.CONTENT_URI);
                            builder.withValueBackReference(Phone.RAW_CONTACT_ID, 0);
                            builder.withValue(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
                            builder.withValue(Phone.TYPE, Phone.TYPE_MOBILE);
                            builder.withValue(Phone.NUMBER, INSERT_PRESET_NUMBER[i]);
                            builder.withValue(Data.IS_PRIMARY, 1);
                            operationList.add(builder.build());
     
                            builder = ContentProviderOperation.newInsert(Data.CONTENT_URI);
                            builder.withValueBackReference(StructuredName.RAW_CONTACT_ID, 0);
                            builder.withValue(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);
                            builder.withValue(StructuredName.DISPLAY_NAME, INSERT_PRESET_NAME[i]);
                            operationList.add(builder.build());
     
                            try {
                                getContentResolver().applyBatch(
                                        ContactsContract.AUTHORITY, operationList);
                            } catch (RemoteException e) {
                                Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage()));
                            } catch (OperationApplicationException e) {
                                Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage()));
                            }
     
                        }
                    } finally {
                        // when this service start,but the contactsprovider has not been started yet.
                        // the contactCursor perhaps null, but not always.(first load will weekup the provider)
                        // so add null block to avoid nullpointerexception
                        if (contactCursor != null) {
                            contactCursor.close();
                        }
                    }
                  }//for
                  Log.i(TAG, "isRunningNumberCheck insert: " + sIsRunningNumberCheck);
                  sIsRunningNumberCheck = false;
              }
          }).start();
     
      }
       
    4.onStart中调用这个函数:
     
        public void onStart(Intent intent, int startId) {
            .....           
            //add by MTK---Preset Contacts
            importDefaultReadonlyContact();
               
            log("[onStart]" + intent + ", startId " + startId);
            if (intent == null) {
                return;
            }
            .....
    }
     
    Part Two
    1.File:DefaultContactListAdapter.java  Path:alpspackagesappscontactssrccomandroidcontactslist
    (1)configureSelection函数中有五处 RawContacts.IS_SDN_CONTACT + " = 0",都改为:RawContacts.IS_SDN_CONTACT + " < 1"
     
    (2)configureOnlyShowPhoneContactsSelection函数中例如以下语句:
    selection.append(Contacts.INDICATE_PHONE_SIM + "= ?");
            selectionArgs.add("-1");
    之后添加以下的代码
    selection.append(" AND " + RawContacts.IS_SDN_CONTACT + " > -1");
     
     
    2.File:ProfileAndContactsLoader.java  Path:alpspackagesappscontactssrccomandroidcontactslist 
    loadSDN函数中有两处 RawContacts.IS_SDN_CONTACT + " = 0",都改为:RawContacts.IS_SDN_CONTACT + " < 1"
     
    3. File:Contact.java  Path:alpspackagesappscontactssrccomandroidcontactsmodel 
    添加例如以下函数:
        //add by MTK---Preset Contacts
        public boolean isReadOnlyContact() {
                 return mIsSdnContact == -1;
         }
     
    4. File:ContactLoaderFragment.java Path:alpspackagesappscontactssrccomandroidcontactsdetail 
    将isContactEditable函数改动为:
       public boolean isContactEditable() {
            return mContactData != null && !mContactData.isDirectoryEntry()
                    && !mContactData.isSdnContacts() &&  !mContactData.isReadOnlyContact() ;
        }
     
    5. File:ContactEntryListAdapter.java Path:alpspackagesappscontactssrccomandroidcontactslist  
    在文件最后添加下面代码:
        public boolean showReadOnlyContact = true;
        public void setShowReadOnlyContact(boolean canDelete) {
            showReadOnlyContact = canDelete;
        }
     
    6. File:ContactEntryListFragment.java  Path:alpspackagesappscontactssrccomandroidcontactslist
    引入例如以下包:
    import com.mediatek.contacts.list.ContactsMultiDeletionFragment;
     
    在onCreateLoader函数中。倒数第二句mAdapter.configureLoader(loader, directoryId);之前添加语句:   
                mAdapter.setShowReadOnlyContact((this instanceof ContactsMultiDeletionFragment) ?

    false : true);
     
    8 7.File:MultiContactsBasePickerAdapter.java Path:alpspackagesappscontactssrccommediatekcontactslist  在configureSelection函数最后的语句 loader.setSelection(selection.toString());之前添加语句:
            if (!showReadOnlyContact ) {
                selection.append(" AND " + Contacts.IS_SDN_CONTACT + "=0");
            }
          
     
    8.File:AggregationSuggestionEngine.java Path:alpspackagesappscontactssrccomandroidcontactseditor
    在configureSelection函数最后的语句 
    在语句:   sb.append(" AND " + Contacts.INDICATE_PHONE_SIM + "=-1");
    之后加入: sb.append(" AND " + Contacts.IS_SDN_CONTACT + "!=-1");
    9.File:JoinContactListAdapter.java
    Path:packagesappscontactssrccomandroidcontactslist   
    函数:public void configureLoader(CursorLoader cursorLoader, long directoryId) 
    将: loader.setSelection(Contacts._ID + "!=?"+" AND " + Contacts.INDICATE_PHONE_SIM + "=-1");‘
    改动为:
        loader.setSelection(Contacts._ID + "!=?"+" AND " + Contacts.INDICATE_PHONE_SIM + "=-1" + " AND " + Contacts.IS_SDN_CONTACT + "!=-1");
     
    【After JB5】
    实现预置联系人(包括姓名、号码信息)至手机中;并保证该联系人是仅仅读的。无法被删除/编辑。


                      
    代码分为两部分:
    Part One 将预置的联系人插入到数据库中;
    Part Two 保证预置联系人仅仅读,无法被编辑删除(在三个地方屏蔽对预置联系人进行编辑处理:联系人详情界面、联系人多选界面、新建联系人选择合并联系人时)。
    【注意】假设您不须要限制预置联系人的删除/编辑操作,增加Part One部分代码就可以。并去掉第一步”新增函数“  中的语句:contactvalues.put(RawContacts.IS_SDN_CONTACT, -2);
     
    Part One:
    1.新建PresetContactsImportProcessor.java
    Path: alpspackagesappsContactssrccommediatekcontactssimservice
    package com.mediatek.contacts.simservice;
     
    import com.mediatek.contacts.simservice.SIMProcessorManager.ProcessorCompleteListener;
     
    import android.content.Context;
    import android.content.Intent;
    import android.util.Log;
    import android.content.ContentProviderOperation;
    import android.content.ContentValues;
    import android.content.OperationApplicationException;
    import android.database.Cursor;
    import android.net.Uri;
     
    import android.provider.ContactsContract;
    import android.provider.ContactsContract.CommonDataKinds.Email;//for usim
    import android.provider.ContactsContract.CommonDataKinds.GroupMembership;
    import android.provider.ContactsContract.CommonDataKinds.Phone;
    import android.provider.ContactsContract.CommonDataKinds.StructuredName;
    import android.provider.ContactsContract.Data;
    import android.provider.ContactsContract.Groups;
    import android.provider.ContactsContract.RawContacts;
     
     
    import com.android.contacts.common.model.account.AccountType;
    import android.os.RemoteException;
     
    import java.util.ArrayList;
    import com.mediatek.contacts.simservice.SIMProcessorManager.ProcessorCompleteListener;
    import com.mediatek.contacts.simservice.SIMServiceUtils;
    import com.mediatek.contacts.simservice.SIMServiceUtils.ServiceWorkData;
    import com.mediatek.contacts.simcontact.SimCardUtils;
    import com.mediatek.contacts.util.LogUtils;
    import android.provider.ContactsContract.PhoneLookup;
     
    public class PresetContactsImportProcessor extends SIMProcessorBase {
        private static final String TAG = "PresetContactsImportProcessor";
       
        private static boolean sIsRunningNumberCheck = false;
        private static final int INSERT_PRESET_NUMBER_COUNT = xxx;           //预置联系人的个数
        private static final String  INSERT_PRESET_NAME[]    = {"xxx1","xxx2",...};  //各预置联系人的姓名
        private static final String  INSERT_PRESET_NUMBER[] = {"xxx1","xxx2",...};  //各预置联系人的号码
       
        private int mSlotId;
        private Context mContext;
     
        public PresetContactsImportProcessor(Context context, int slotId, Intent intent,
                ProcessorCompleteListener listener) {
            super(intent, listener);
            mContext = context;
            mSlotId = slotId;
        }
     
        @Override
        public int getType() {
            return SIMServiceUtils.SERVICE_WORK_IMPORT_PRESET_CONTACTS;
        }
     
        @Override
        public void doWork() {
            if (isCancelled()) {
                LogUtils.d(TAG, "[doWork]cancel import preset contacts work. Thread id=" + Thread.currentThread().getId());
                return;
            }
            importDefaultReadonlyContact();
        }
       
        private void importDefaultReadonlyContact(){
             Log.i(TAG, "isRunningNumberCheck before: " + sIsRunningNumberCheck);
             if (sIsRunningNumberCheck) {
                return;
             }
             sIsRunningNumberCheck = true;
             for(int i = 0;i < INSERT_PRESET_NUMBER_COUNT; i++)
             {
                 Log.i(TAG, "isRunningNumberCheck after: " + sIsRunningNumberCheck);
                 Uri uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri
                          .encode(INSERT_PRESET_NUMBER[i]));
                 Log.i(TAG, "getContactInfoByPhoneNumbers(), uri = " + uri);
     
                 Cursor contactCursor = mContext.getContentResolver().query(uri, new String[] {
                          PhoneLookup.DISPLAY_NAME, PhoneLookup.PHOTO_ID
             }, null, null, null);
             try {
                 if (contactCursor != null && contactCursor.getCount() > 0) {
                      return;
                 } else {
                      final ArrayList<ContentProviderOperation> operationList = new ArrayList<ContentProviderOperation>();
                      ContentProviderOperation.Builder builder = ContentProviderOperation
                              .newInsert(RawContacts.CONTENT_URI);
                      ContentValues contactvalues = new ContentValues();
                      contactvalues.put(RawContacts.ACCOUNT_NAME,
                              AccountType.ACCOUNT_NAME_LOCAL_PHONE);
                      contactvalues.put(RawContacts.ACCOUNT_TYPE,
                              AccountType.ACCOUNT_TYPE_LOCAL_PHONE);
                      contactvalues.put(RawContacts.INDICATE_PHONE_SIM,
                              ContactsContract.RawContacts.INDICATE_PHONE);
                      contactvalues.put(RawContacts.IS_SDN_CONTACT, -2);
                      builder.withValues(contactvalues);
                      builder.withValue(RawContacts.AGGREGATION_MODE,
                              RawContacts.AGGREGATION_MODE_DISABLED);
                      operationList.add(builder.build());
     
                      builder = ContentProviderOperation.newInsert(Data.CONTENT_URI);
                      builder.withValueBackReference(Phone.RAW_CONTACT_ID, 0);
                      builder.withValue(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
                      builder.withValue(Phone.TYPE, Phone.TYPE_MOBILE);
                      builder.withValue(Phone.NUMBER, INSERT_PRESET_NUMBER[i]);
                      builder.withValue(Data.IS_PRIMARY, 1);
                      operationList.add(builder.build());
     
                      builder = ContentProviderOperation.newInsert(Data.CONTENT_URI);
                      builder.withValueBackReference(StructuredName.RAW_CONTACT_ID, 0);
                      builder.withValue(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);
                      builder.withValue(StructuredName.DISPLAY_NAME, INSERT_PRESET_NAME[i]);
                      operationList.add(builder.build());
     
                      try {
                          mContext.getContentResolver().applyBatch(
                                   ContactsContract.AUTHORITY, operationList);
                      } catch (RemoteException e) {
                          Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage()));
                      } catch (OperationApplicationException e) {
                          Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage()));
                      }
     
                 }
             } finally {
                 // when this service start,but the contactsprovider has not been started yet.
                 // the contactCursor perhaps null, but not always.(first load will weekup the provider)
                 // so add null block to avoid nullpointerexception
                 if (contactCursor != null) {
                      contactCursor.close();
                 }
             }//for
             Log.i(TAG, "isRunningNumberCheck insert: " + sIsRunningNumberCheck);
             sIsRunningNumberCheck = false;
             }
        }
    }
     
    2. 改动SIMServiceUtils.java
    Path:alpspackagesappsContactsCommonsrccommediatekcontactssimservice  
    加入
    public static final int SERVICE_WORK_IMPORT_PRESET_CONTACTS = 5;
    3. 改动SIMProcessorManager.java
    Path:alpspackagesappsContactssrccommediatekcontactssimservice
    在SIMProcessorManager.java中createProcessor函数里加入
    else if (workType == SIMServiceUtils.SERVICE_WORK_IMPORT_PRESET_CONTACTS) {
                processor = new PresetContactsImportProcessor(context, slotId, intent, listener);
            }
    4. 改动BootCmpReceiver.java
    Path:alpspackagesappsContactssrccommediatekcontactssimcontact
    在BootCmpReceiver.java中processBootComplete()方法最后加入代码
    startSimService(-1, SIMServiceUtils.SERVICE_WORK_IMPORT_PRESET_CONTACTS);
    Part Two
    1.  File:DefaultContactListAdapter.java 
    Path: alpspackagesappsContactsCommonsrccomandroidcontactscommonlist
    (1)configureOnlyShowPhoneContactsSelection函数中例如以下语句:
    selection.append(Contacts.INDICATE_PHONE_SIM + "= ?

    ");
            selectionArgs.add("-1");
    之后添加以下的代码
    selection.append(" AND " + RawContacts.IS_SDN_CONTACT + " > -2");
    2.  File:Contact.java 
    Path: alpspackagesappsContactsCommonsrccomandroidcontactscommonmodel 
    添加例如以下函数:
        //add by MTK---Preset Contacts
        public boolean isReadOnlyContact() {
                 return mIsSdnContact == -2;
         }
    3.  File:ContactLoaderFragment.java
    Path:alpspackagesappscontactssrccomandroidcontactsdetail 
    将isContactEditable函数改动为:
       public boolean isContactEditable() {
            return mContactData != null && !mContactData.isDirectoryEntry()&& !mContactData.isSdnContacts()&&  !mContactData.is InternationalDialNumber()&&  !mContactData.isReadOnlyContact() ;
        }
     
    4.  File:ContactEntryListAdapter.java 
    Path:alpspackagesappscontactscommonsrccomandroidcontactscommonlist  
    在文件最后添加下面代码:
        public boolean showReadOnlyContact = true;
        public void setShowReadOnlyContact(boolean canDelete) {
            showReadOnlyContact = canDelete;
        }
     
    5.  File:ContactEntryListFragment.java  
    Path:alpspackagesappscontactscommonsrccomandroidcontactscommonlist
    加入代码:
        protected boolean isInstanceOfContactsMultiDeletionFragment(){
        return false;
        }
    在onCreateLoader函数中,倒数第二句mAdapter.configureLoader(loader, directoryId);之前添加语句:   
                mAdapter.setShowReadOnlyContact(isInstanceOfContactsMultiDeletionFragment() ? false : true);
    6.  File: ContactsMultiDeletionFragment.java
    Path:alpspackagesappsContactssrccommediatekcontactslist
    加入代码:
        protected boolean isInstanceOfContactsMultiDeletionFragment(){
        return true;
        }
    7.File:MultiContactsBasePickerAdapter.java
    Path:alpspackagesappscontactssrccommediatekcontactslist 
    在configureSelection函数最后的语句 loader.setSelection(selection.toString());之前添加语句:
            if (!showReadOnlyContact ) {
                selection.append(" AND " + Contacts.IS_SDN_CONTACT + "=0");
    }
    8.File:AggregationSuggestionEngine.java
    Path:alpspackagesappscontactssrccomandroidcontactseditor
    在loadAggregationSuggestions函数最后的语句 
    在语句:   sb.append(" AND " + Contacts.INDICATE_PHONE_SIM + "=-1");
    之后加入: sb.append(" AND " + Contacts.IS_SDN_CONTACT + "!=-2");
    9.File:JoinContactListAdapter.java
    Path:packagesappscontactssrccomandroidcontactslist   
    函数:public void configureLoader(CursorLoader cursorLoader, long directoryId) 
    将: loader.setSelection(Contacts._ID + "!=?

    "+" AND " + Contacts.INDICATE_PHONE_SIM + "=-1");
    改动为:
        loader.setSelection(Contacts._ID + "!=?"+" AND " + Contacts.INDICATE_PHONE_SIM + "=-1" + " AND " + Contacts.IS_SDN_CONTACT + "!=-2");

  • 相关阅读:
    PHP中的error
    回调函数与PHP实例
    PHP的基本入门知识
    Java script OOP——浅谈
    实现单行或多行文本溢出显示省略号
    ECharts
    session management会话管理的原理
    easyui 入门指南
    H5视频/音频
    CSS清除浮动各种方法
  • 原文地址:https://www.cnblogs.com/liguangsunls/p/6999497.html
Copyright © 2011-2022 走看看