在手机中预置联系人/Service Number
预置联系人/Service Number
此方法比较适合预置联系人的数目不是特别多的情况
联系人比较多的情况,请参考:FAQ12935 预置联系人之Vcard预置联系人
[SOLUTION]
本方案实现预置联系人(包含姓名、号码信息)至手机中;并保证该联系人是只读的,无法被删除/编辑。
代码分为两部分:
Part One 将预置的联系人插入到数据库中;
Part Two 保证预置联系人只读,无法被编辑删
(在三个地方屏蔽对预置联系人进行编辑处理:联系人详情界面、联系人多选界面、新建联系人选择合并联系人时)。
【注意】
如果您不需要限制预置联系人的删除/编辑操作,加入Part One部分代码即可,并去掉第一步”新增函数“ 中的语句:contactvalues.put(RawContacts.IS_SDN_CONTACT, -2);
Part One
1.新建PresetContactSIMportProcessor.java
Path: alps\packages\apps\Contacts\src\com\mediatek\contacts\simservice
[Java]hide[size=1em]
[size=1em]1
[size=1em]2
[size=1em]3
[size=1em]4
[size=1em]5
[size=1em]6
[size=1em]7
[size=1em]8
[size=1em]9
[size=1em]10
[size=1em]11
[size=1em]12
[size=1em]13
[size=1em]14
[size=1em]15
[size=1em]16
[size=1em]17
[size=1em]18
[size=1em]19
[size=1em]20
[size=1em]21
[size=1em]22
[size=1em]23
[size=1em]24
[size=1em]25
[size=1em]26
[size=1em]27
[size=1em]28
[size=1em]29
[size=1em]30
[size=1em]31
[size=1em]32
[size=1em]33
[size=1em]34
[size=1em]35
[size=1em]36
[size=1em]37
[size=1em]38
[size=1em]39
[size=1em]40
[size=1em]41
[size=1em]42
[size=1em]43
[size=1em]44
[size=1em]45
[size=1em]46
[size=1em]47
[size=1em]48
[size=1em]49
[size=1em]50
[size=1em]51
[size=1em]52
[size=1em]53
[size=1em]54
[size=1em]55
[size=1em]56
[size=1em]57
[size=1em]58
[size=1em]59
[size=1em]60
[size=1em]61
[size=1em]62
[size=1em]63
[size=1em]64
[size=1em]65
[size=1em]66
[size=1em]67
[size=1em]68
[size=1em]69
[size=1em]70
[size=1em]71
[size=1em]72
[size=1em]73
[size=1em]74
[size=1em]75
[size=1em]76
[size=1em]77
[size=1em]78
[size=1em]79
[size=1em]80
[size=1em]81
[size=1em]82
[size=1em]83
[size=1em]84
[size=1em]85
[size=1em]86
[size=1em]87
[size=1em]88
[size=1em]89
[size=1em]90
[size=1em]91
[size=1em]92
[size=1em]93
[size=1em]94
[size=1em]95
[size=1em]96
[size=1em]97
[size=1em]98
[size=1em]99
[size=1em]100
[size=1em]101
[size=1em]102
[size=1em]103
[size=1em]104
[size=1em]105
[size=1em]106
[size=1em]107
[size=1em]108
[size=1em]109
[size=1em]110
[size=1em]111
[size=1em]112
[size=1em]113
[size=1em]114
[size=1em]115
[size=1em]116
[size=1em]117
[size=1em]118
[size=1em]119
[size=1em]120
[size=1em]121
[size=1em]122
[size=1em]123
[size=1em]124
[size=1em]125
[size=1em]126
[size=1em]127
[size=1em]128
[size=1em]129
[size=1em]130
[size=1em]131
[size=1em]132
[size=1em]133
[size=1em]134
[size=1em]135
[size=1em]136
[size=1em]137
[size=1em]138
[size=1em]139
[size=1em]140
[size=1em]141
[size=1em]142
[size=1em]143
[size=1em]144
[size=1em]145
[size=1em]146
[size=1em]147
[size=1em]148
[size=1em]149
[size=1em]150
[size=1em]151
[size=1em]152
[size=1em]153
[size=1em]154
[size=1em]155
[size=1em]156
[size=1em]157
[size=1em]158
[size=1em]159
[size=1em]160
[size=1em]161
[size=1em]162
[size=1em]163
[size=1em]164
[size=1em]165
[size=1em]166
[size=1em]167
[size=1em]168
[size=1em]169
[size=1em]170
[size=1em]171
[size=1em]172
[size=1em]173
[size=1em]174
[size=1em]175
[size=1em]176
[size=1em]177
[size=1em]178
[size=1em]179
[size=1em]180
[size=1em]181
[size=1em]182
[size=1em]183
[size=1em]184
[size=1em]185
[size=1em]186
[size=1em]187
[size=1em]188
[size=1em]189
[size=1em]190
[size=1em]191
[size=1em]192
[size=1em]193
[size=1em]194
[size=1em]195
[size=1em]196
[size=1em]197
[size=1em]198
[size=1em]199
[size=1em]200
[size=1em]201
[size=1em]202
[size=1em]203
[size=1em]204
[size=1em]205
[size=1em]206
[size=1em]207
[size=1em]208
[size=1em]209
[size=1em]210
[size=1em]211
[size=1em]212
[size=1em]213
[size=1em]214
[size=1em]215
[size=1em]216
[size=1em]217
[size=1em]218
[size=1em]219
[size=1em]220
[size=1em]221
[size=1em]222
[size=1em]223
[size=1em]224
[size=1em]225
[size=1em]226
[size=1em]227
[size=1em]228
[size=1em]229
[size=1em]230
[size=1em]231
[size=1em]232
[size=1em]233
[size=1em]234
[size=1em]235
[size=1em]236
[size=1em]237
[size=1em][size=1em]package com.mediatek.contacts.simservice;
[size=1em]import com.mediatek.contacts.simservice.SIMProcessorManager.ProcessorCompleteListener;
[size=1em]import android.content.Context;
[size=1em]import android.content.Intent;
[size=1em]import android.util.Log;
[size=1em]import android.content.ContentProviderOperation;
[size=1em]import android.content.ContentValues;
[size=1em]import android.content.OperationApplicationException;
[size=1em]import android.database.Cursor;
[size=1em]import android.net.Uri;
[size=1em]import android.provider.ContactsContract;
[size=1em]import android.provider.ContactsContract.CommonDataKinds.Email; //for usim
[size=1em]import android.provider.ContactsContract.CommonDataKinds.GroupMembership;
[size=1em]import android.provider.ContactsContract.CommonDataKinds.Phone;
[size=1em]import android.provider.ContactsContract.CommonDataKinds.StructuredName;
[size=1em]import android.provider.ContactsContract.Data;
[size=1em]import android.provider.ContactsContract.Groups;
[size=1em]import android.provider.ContactsContract.RawContacts;
[size=1em]import com.android.contacts.common.model.account.AccountType;
[size=1em]import android.os.RemoteException;
[size=1em]import java.util.ArrayList;
[size=1em]import com.mediatek.contacts.simservice.SIMProcessorManager.ProcessorCompleteListener;
[size=1em]import com.mediatek.contacts.simservice.SIMServiceUtils;
[size=1em]import com.mediatek.contacts.simservice.SIMServiceUtils.ServiceWorkData;
[size=1em]import com.mediatek.contacts.simcontact.SimCardUtils;
[size=1em]import com.mediatek.contacts.util.LogUtils;
[size=1em]import android.provider.ContactsContract.PhoneLookup;
[size=1em]public class PresetContactsImportProcessor extends SIMProcessorBase {
[size=1em] private static final String TAG = "resetContactsImportProcessor";
[size=1em] private static boolean sIsRunningNumberCheck = false;
[size=1em] private static final int INSERT_PRESET_NUMBER_COUNT = xxx; //预置联系人的个数
[size=1em] private static final String INSERT_PRESET_NAME[] = {"xxx1","xxx2",...}; //各预置联系人的姓名
[size=1em] private static final String INSERT_PRESET_NUMBER[] = {"xxx1","xxx2",...}; //各预置联系人的号码
[size=1em] private int mSlotId;
[size=1em] private Context mContext;
[size=1em] public PresetContactsImportProcessor(Context context, int slotId, Intent intent, ProcessorCompleteListener listener) {
[size=1em] super(intent, listener);
[size=1em] mContext = context;
[size=1em] mSlotId = slotId;
[size=1em] }
[size=1em] @Override
[size=1em] public int getType() {
[size=1em] return SIMServiceUtils.SERVICE_WORK_IMPORT_PRESET_CONTACTS;
[size=1em] }
[size=1em] @Override
[size=1em] public void doWork() {
[size=1em] if (isCancelled()) {
[size=1em] LogUtils.d(TAG, "[doWork]cancel import preset contacts work. Thread id=" + Thread.currentThread().getId());
[size=1em] return;
[size=1em] }
[size=1em] importDefaultReadonlyContact();
[size=1em] }
[size=1em]
[size=1em] private void importDefaultReadonlyContact(){
[size=1em] Log.i(TAG, "isRunningNumberCheck before: " + sIsRunningNumberCheck);
[size=1em] if (sIsRunningNumberCheck) {
[size=1em] return;
[size=1em] }
[size=1em] sIsRunningNumberCheck = true;
[size=1em] for(int i = 0;i < INSERT_PRESET_NUMBER_COUNT; i++) {
[size=1em] Log.i(TAG, "isRunningNumberCheck after: " + sIsRunningNumberCheck);
[size=1em] Uri uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(INSERT_PRESET_NUMBER));
[size=1em] Log.i(TAG, "getContactInfoByPhoneNumbers(), uri = " + uri);
[size=1em] Cursor contactCursor = mContext.getContentResolver().query(uri,
[size=1em] new String[] {PhoneLookup.DISPLAY_NAME, PhoneLookup.PHOTO_ID}, null, null, null);
[size=1em] try {
[size=1em] if (contactCursor != null && contactCursor.getCount() > 0) {
[size=1em] return;
[size=1em] } else {
[size=1em] final ArrayList operationList = new ArrayList();
[size=1em] ContentProviderOperation.Builder builder = ContentProviderOperation.newInsert(RawContacts.CONTENT_URI);
[size=1em] ContentValues contactvalues = new ContentValues();
[size=1em] contactvalues.put(RawContacts.ACCOUNT_NAME, AccountType.ACCOUNT_NAME_LOCAL_PHONE);
[size=1em] contactvalues.put(RawContacts.ACCOUNT_TYPE, AccountType.ACCOUNT_TYPE_LOCAL_PHONE);
[size=1em] contactvalues.put(RawContacts.INDICATE_PHONE_SIM, ContactsContract.RawContacts.INDICATE_PHONE);
[size=1em] contactvalues.put(RawContacts.IS_SDN_CONTACT, -2);
[size=1em] builder.withValues(contactvalues);
[size=1em] builder.withValue(RawContacts.AGGREGATION_MODE, RawContacts.AGGREGATION_MODE_DISABLED);
[size=1em] operationList.add(builder.build());
[size=1em] builder = ContentProviderOperation.newInsert(Data.CONTENT_URI);
[size=1em] builder.withValueBackReference(Phone.RAW_CONTACT_ID, 0);
[size=1em] builder.withValue(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
[size=1em] builder.withValue(Phone.TYPE, Phone.TYPE_MOBILE);
[size=1em] builder.withValue(Phone.NUMBER, INSERT_PRESET_NUMBER);
[size=1em] builder.withValue(Data.IS_PRIMARY, 1);
[size=1em] operationList.add(builder.build());
[size=1em] builder = ContentProviderOperation.newInsert(Data.CONTENT_URI);
[size=1em] builder.withValueBackReference(StructuredName.RAW_CONTACT_ID, 0);
[size=1em] builder.withValue(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);
[size=1em] builder.withValue(StructuredName.DISPLAY_NAME, INSERT_PRESET_NAME);
[size=1em] operationList.add(builder.build());
[size=1em] try {
[size=1em] mContext.getContentResolver().applyBatch(ContactsContract.AUTHORITY, operationList);
[size=1em] } catch (RemoteException e) {
[size=1em] Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage()));
[size=1em] } catch (OperationApplicationException e) {
[size=1em] Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage()));
[size=1em] }
[size=1em] }
[size=1em] } finally {
[size=1em] // when this service start,but the contactsprovider has not been started yet.
[size=1em] // the contactCursor perhaps null, but not always.(first load will weekup the provider)
[size=1em] // so add null block to avoid nullpointerexception
[size=1em] if (contactCursor != null) {
[size=1em] contactCursor.close();
[size=1em] }
[size=1em] } //END for
[size=1em] Log.i(TAG, "isRunningNumberCheck insert: " + sIsRunningNumberCheck);
[size=1em] sIsRunningNumberCheck = false;
[size=1em] }
[size=1em] }
[size=1em]}
2. 修改SIMServiceUtils.java
Path:alps\packages\apps\ContactsCommon\src\com\mediatek\contacts\simservice
添加
[Java]hide[size=1em]
[size=1em]1
[size=1em][size=1em]public static final int SERVICE_WORK_IMPORT_PRESET_CONTACTS = 5;
3. 修改SIMProcessorManager.java
Path:alps\packages\apps\Contacts\src\com\mediatek\contacts\simservice
在SIMProcessorManager.java中createProcessor函数里添加
[Java]hide[size=1em]
[size=1em]1
[size=1em]2
[size=1em]3
[size=1em]4
[size=1em]5
[size=1em][size=1em]else if (workType == SIMServiceUtils.SERVICE_WORK_IMPORT_PRESET_CONTACTS) {
[size=1em] processor = new PresetContactsImportProcessor(context, slotId, intent, listener);
[size=1em]}
4. 修改BooTCMpReceiver.java
Path:alps\packages\apps\Contacts\src\com\mediatek\contacts\simcontact
在BootCmpReceiver.java中添加如下方法:
[Java]hide[size=1em]
[size=1em]1
[size=1em]2
[size=1em]3
[size=1em]4
[size=1em]5
[size=1em]6
[size=1em]7
[size=1em]8
[size=1em]9
[size=1em]10
[size=1em]11
[size=1em]12
[size=1em]13
[size=1em][size=1em]/**
[size=1em]* when boot complete,preset the service number directly.
[size=1em]*/
[size=1em]private void presetServiceNumber(Context context) {
[size=1em] LogUtils.d(TAG, "presetServiceNumber");
[size=1em] startSimService(context, -1, SIMServiceUtils.SERVICE_WORK_IMPORT_PRESET_CONTACTS);
[size=1em]}
5. 修改BootCmpReceiver.java
Path:alps\packages\apps\Contacts\src\com\mediatek\contacts\simcontact
在BootCmpReceiver.java中onReceive()方法
[Java]hide[size=1em]
[size=1em]1
[size=1em]2
[size=1em]3
[size=1em]4
[size=1em]5
[size=1em]6
[size=1em]7
[size=1em]8
[size=1em]9
[size=1em]10
[size=1em]11
[size=1em]12
[size=1em]13
[size=1em]14
[size=1em]15
[size=1em]16
[size=1em]17
[size=1em]18
[size=1em]19
[size=1em]20
[size=1em]21
[size=1em][size=1em]public void onReceive(Context context, Intent intent) {
[size=1em] ... ...
[size=1em] } else if (action.equals(Intent.ACTION_BOOT_COMPLETED)) {
[size=1em] // fix ALPS01003520,when boot complete,remove the contacts if the
[size=1em] // card of a slot has been removed
[size=1em] if (!isPhbReady()) {
[size=1em] processBootComplete(context);
[size=1em] }
[size=1em] }
[size=1em] ... ...
[size=1em]}
修改为:
[Java]hide[size=1em]
[size=1em]1
[size=1em]2
[size=1em]3
[size=1em]4
[size=1em]5
[size=1em]6
[size=1em]7
[size=1em]8
[size=1em]9
[size=1em]10
[size=1em]11
[size=1em]12
[size=1em]13
[size=1em]14
[size=1em]15
[size=1em]16
[size=1em]17
[size=1em]18
[size=1em]19
[size=1em]20
[size=1em]21
[size=1em]22
[size=1em]23
[size=1em]24
[size=1em]25
[size=1em]26
[size=1em]27
[size=1em]28
[size=1em]29
[size=1em][size=1em]public void onReceive(Context context, Intent intent) {
[size=1em] ... ...
[size=1em] } else if (action.equals(Intent.ACTION_BOOT_COMPLETED)) {
[size=1em] // fix ALPS01003520,when boot complete,remove the contacts if the
[size=1em] // card of a slot has been removed
[size=1em] if (!isPhbReady()) {
[size=1em] processBootComplete(context);
[size=1em] }
[size=1em]
[size=1em] // [START] add for Preset service number
[size=1em] presetServiceNumber(context);
[size=1em] // [END]
[size=1em] }
[size=1em] ... ...
[size=1em]}
Part Two
1. FileefaultContactListAdapter.java
Path: alps\packages\apps\ContactsCommon\src\com\android\contacts\common\list
configureOnlyShowPhoneContactsSelection函数中如下语句:
[Java]hide[size=1em]
[size=1em]1
[size=1em]2
[size=1em]3
[size=1em]4
[size=1em]5
[size=1em][size=1em]selection.append(Contacts.INDICATE_PHONE_SIM + "= ?");
[size=1em]selectionArgs.add("-1");
之后增加下面的代码
[Java]hide[size=1em]
[size=1em]1
[size=1em][size=1em]selection.append(" AND " + RawContacts.IS_SDN_CONTACT + " > -2");
2. File:Contact.java
Path: alps\packages\apps\ContactsCommon\src\com\android\contacts\common\model
增加如下函数:
[Java]hide[size=1em]
[size=1em]1
[size=1em]2
[size=1em]3
[size=1em]4
[size=1em]5
[size=1em]6
[size=1em]7
[size=1em][size=1em]//add for Preset Contacts
[size=1em]public boolean isReadOnlyContact() {
[size=1em] return mIsSdnContact == -2;
[size=1em]}
3. File:ContactLoaderFragment.Java
Path:alps\packages\apps\contacts\src\com\android\contacts\detail
将isContactEditable函数修改为:
[Java]hide[size=1em]
[size=1em]1
[size=1em]2
[size=1em]3
[size=1em]4
[size=1em]5
[size=1em]6
[size=1em]7
[size=1em][size=1em]public boolean isContactEditable() {
[size=1em] // return mContactData != null && !mContactData.isDirectoryEntry() && !mContactData.isSdnContacts() && !mContactData.isInternationalDialNumber(); // before
[size=1em] return mContactData != null && !mContactData.isDirectoryEntry() && !mContactData.isSdnContacts() && !mContactData.isInternationalDialNumber() && !mContactData.isReadOnlyContact() ; // after
[size=1em]}
4.File:ContactEntryListAdapter.java
Path:alps\packages\apps\contactscommon\src\com\android\contacts\common\list
在文件最后增加以下代码:
[Java]hide[size=1em]
[size=1em]1
[size=1em]2
[size=1em]3
[size=1em]4
[size=1em]5
[size=1em]6
[size=1em]7
[size=1em]8
[size=1em]9
[size=1em][size=1em]public boolean showReadOnlyContact = true;
[size=1em]public void setShowReadOnlyContact(boolean canDelete) {
[size=1em] showReadOnlyContact = canDelete;
[size=1em]}
5. File:ContactEntryListFragment.java
Path:alps\packages\apps\contactscommon\src\com\android\contacts\common\list
添加代码:
[Java]hide[size=1em]
[size=1em]1
[size=1em]2
[size=1em]3
[size=1em]4
[size=1em]5
[size=1em][size=1em]protected boolean isInstanceOf ContactsMultiDeletionFragment(){
[size=1em] return false;
[size=1em]}
在onCreateLoader函数中,倒数第二句
[Java]hide[size=1em]
[size=1em]1
[size=1em][size=1em]mAdapter.configureLoader(loader, directoryId);
之前增加语句:
[Java]hide[size=1em]
[size=1em]1
[size=1em]2
[size=1em]3
[size=1em][size=1em]mAdapter.setShowReadOnlyContact(isInstanceOfContactsMultiDeletionFragment() ? false : true);
[size=1em]mAdapter.configureLoader(loader, directoryId);
6.[Before M Version]
File: ContactsMultiDeletionFragment.java
Path:alps\packages\apps\Contacts\src\com\mediatek\contacts\list
添加代码:
[Java]hide[size=1em]
[size=1em]1
[size=1em]2
[size=1em]3
[size=1em]4
[size=1em]5
[size=1em][size=1em]protected boolean isInstanceOf ContactsMultiDeletionFragment(){
[size=1em] return true;
[size=1em]}
[ [After M Version]
C FILE: packages/apps/ContactsCommon/src/com/android/contacts/common/list/ContactEntryListAdapter.java
[Java]hide[size=1em]
[size=1em]1
[size=1em]2
[size=1em]3
[size=1em]4
[size=1em]5
[size=1em]6
[size=1em]7
[size=1em]8
[size=1em]9
[size=1em]10
[size=1em]11
[size=1em]12
[size=1em]13
[size=1em]14
[size=1em]15
[size=1em]16
[size=1em]17
[size=1em]18
[size=1em]19
[size=1em]20
[size=1em]21
[size=1em]22
[size=1em]23
[size=1em]24
[size=1em]25
[size=1em]26
[size=1em]27
[size=1em]28
[size=1em]29
[size=1em]30
[size=1em]31
[size=1em]32
[size=1em]33
[size=1em]34
[size=1em]35
[size=1em]36
[size=1em]37
[size=1em]38
[size=1em]39
[size=1em]40
[size=1em]41
[size=1em]42
[size=1em]43
[size=1em]44
[size=1em]45
[size=1em]46
[size=1em]47
[size=1em]48
[size=1em]49
[size=1em]50
[size=1em]51
[size=1em][size=1em]public boolean isSdnNumber(int position) {
[size=1em] boolean isSdnNumber = false;
[size=1em] int partition = getPartitionForPosition(position);
[size=1em] if (partition >= 0) {
[size=1em] // Save the old cursor position - the call to getItem() may modify the cursor
[size=1em] // position.
[size=1em] int offset = getCursor(partition).getPosition();
[size=1em] Cursor cursor = (Cursor) getItem(position);
[size=1em] if (cursor != null) {
[size=1em] // [START]
[size=1em] // Before
[size=1em] // isSdnNumber = cursor.getInt(ContactQuery.IS_SDN_CONTACT) == 1;
[size=1em] // After
[size=1em] final long isSdn = cursor.getInt(ContactQuery.IS_SDN_CONTACT);
[size=1em] if (isSdn == 1 || isSdn == -2) {
[size=1em] isSdnNumber = true;
[size=1em] }
[size=1em] Log.d(TAG, "[isSdnNumber] isSdn = " + isSdn + ",isSdnNumber = " + isSdnNumber); //add log
[size=1em] // [END]
[size=1em] // Restore the old cursor position.
[size=1em] cursor.moveToPosition(offset);
[size=1em] }
[size=1em] }
[size=1em] return isSdnNumber;
[size=1em]}
7.File:MultiContactsBasePickerAdapter.java
Path:alps\packages\apps\contacts\src\com\mediatek\contacts\list
在configureSelection函数最后的语句
[Java]hide[size=1em]
[size=1em]1
[size=1em][size=1em]loader.setSelection(selection.toString());
之前增加语句:
[Java]hide[size=1em]
[size=1em]1
[size=1em]2
[size=1em]3
[size=1em]4
[size=1em]5
[size=1em]6
[size=1em]7
[size=1em]8
[size=1em]9
[size=1em][size=1em]if (!showReadOnlyContact ) {
[size=1em] selection.append(" AND " + Contacts.IS_SDN_CONTACT + "=0");
[size=1em]}
[size=1em]loader.setSelection(selection.toString());
8.File:AggregationSuggestionEngine.java
Path:alps\packages\apps\contacts\src\com\android\contacts\Editor
在loadAggregationSuggestions函数最后的语句
在语句:
[size=1em]
[size=1em]1
[size=1em][size=1em]sb.append(" AND " + Contacts.INDICATE_PHONE_SIM + "=-1");
之后添加:
[Java]hide[size=1em]
[size=1em]1
[size=1em][size=1em]sb.append(" AND " + Contacts.IS_SDN_CONTACT + "!=-2");
9.File:JoinContactListAdapter.java
Path:packages\apps\contacts\src\com\android\contacts\list
函数:public void configureLoader(CursorLoader cursorLoader, long directoryId)
将:
[size=1em]
[size=1em]1
[size=1em][size=1em]loader.setSelection(Contacts._ID + "!=?"+" AND " + Contacts.INDICATE_PHONE_SIM + "=-1");
修改为:
[size=1em]
[size=1em]1
[size=1em][size=1em]loader.setSelection(Contacts._ID + "!=?"+" AND " + Contacts.INDICATE_PHONE_SIM + "=-1" + " AND " + Contacts.IS_SDN_CONTACT + "!=-2");
