Java Android:如何通过电话号码将联系人存储在一个目录中?
我试图通过提供电话号码来获取并非本地存储在我的设备上,而是在Microsoft Exchange ActiveSync目录中找到的联系人。我遵循了这一点,它提供了一个按姓名检索联系人的简单解决方案,我尝试对其进行修改以满足我的需要,但我被卡住了 这是密码让我按姓名抓取联系人 main活动Java Android:如何通过电话号码将联系人存储在一个目录中?,java,android,activesync,android-6.0.1-marshmallow,Java,Android,Activesync,Android 6.0.1 Marshmallow,我试图通过提供电话号码来获取并非本地存储在我的设备上,而是在Microsoft Exchange ActiveSync目录中找到的联系人。我遵循了这一点,它提供了一个按姓名检索联系人的简单解决方案,我尝试对其进行修改以满足我的需要,但我被卡住了 这是密码让我按姓名抓取联系人 main活动 public class MainActivity extends AppCompatActivity { static final String TAG = "MAIN"; private
public class MainActivity extends AppCompatActivity {
static final String TAG = "MAIN";
private ArrayList<Long> dirIds;
private String[] projection;
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView) findViewById(R.id.textView);
if (ContextCompat.checkSelfPermission(MainActivity.this,
Manifest.permission.WRITE_CONTACTS) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(MainActivity.this,
new String[]{Manifest.permission.WRITE_CONTACTS}, 1);
}
if (ContextCompat.checkSelfPermission(MainActivity.this,
Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(MainActivity.this,
new String[]{Manifest.permission.READ_CONTACTS}, 1);
}
CursorQueryWrapper wrapper = new CursorQueryWrapper(TAG);
dirIds = new ArrayList<Long>();
wrapper.query(this, ContactsContract.Directory.CONTENT_URI, new String[]{
ContactsContract.Directory._ID, ContactsContract.Directory.ACCOUNT_NAME, ContactsContract.Directory.ACCOUNT_TYPE
}, null, null, null,
new CursorQueryWrapper.CursorResultIterator() {
@Override
public void iterate(Cursor cursor) throws Exception {
long id = cursor.getLong(0);
if (ContactsContract.Directory.DEFAULT != id && ContactsContract.Directory.LOCAL_INVISIBLE != id) {
dirIds.add(id);
Log.d(TAG, "Account: id=" + id + " name=" + cursor.getString(1) + " type=" + cursor.getString(2));
}
}
});
if (dirIds.isEmpty()) {
String result = "Cannot find additional accounts";
Log.e(TAG, result);
textView.setText(result);
}else{
HashSet<String> projSet = new HashSet<String>();
projSet.add(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME);
projSet.add(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME);
projSet.add(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME);
projSet.add(ContactsContract.CommonDataKinds.Email.ADDRESS);
projSet.add(ContactsContract.CommonDataKinds.Phone.NUMBER);
projSet.add(ContactsContract.Contacts.Data.MIMETYPE);
projSet.add(ContactsContract.CommonDataKinds.Email.TYPE);
projSet.add(ContactsContract.CommonDataKinds.Phone.TYPE);
projection = projSet.toArray(new String[projSet.size()]);
final String searchStr = "SOME NAME";
new Thread(new Runnable() {
@Override
public void run() {
final String result;
if (TextUtils.isEmpty(searchStr)) {
result = "No input";
} else {
result = search(searchStr);
}
System.out.println(result);
}
}).start();
}
}
private String search(final String searchString) {
final StringBuilder bld = new StringBuilder();
CursorQueryWrapper wrapper = new CursorQueryWrapper(TAG);
final Context context = this;
for (Long id : dirIds) {
final String idStr = String.valueOf(id);
Uri uri = ContactsContract.Contacts.CONTENT_FILTER_URI.buildUpon().appendEncodedPath(searchString)
.appendQueryParameter(ContactsContract.DIRECTORY_PARAM_KEY, idStr).build();
final ArrayList<String> lookupKeys = new ArrayList<String>();
wrapper.query(context, uri, new String[] {
ContactsContract.Contacts.LOOKUP_KEY
}, null, null, null, new CursorQueryWrapper.CursorResultIterator() {
@Override
public void iterate(Cursor cursor) throws Exception {
lookupKeys.add(cursor.getString(0));
}
});
if (lookupKeys.isEmpty()) {
continue;
}
for (String lookupKey : lookupKeys) {
uri = ContactsContract.Contacts.CONTENT_LOOKUP_URI.buildUpon().appendEncodedPath(lookupKey)
.appendPath(ContactsContract.Contacts.Entity.CONTENT_DIRECTORY)
.appendQueryParameter(ContactsContract.DIRECTORY_PARAM_KEY, idStr).build();
wrapper.query(context, uri, projection, null, null, null, new CursorQueryWrapper.CursorResultIterator() {
@Override
public void iterate(Cursor cursor) throws Exception {
String mime = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.Data.MIMETYPE));
if (ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE.equals(mime)) {
String result = "Given name:"
+ cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME))
+ " Family name:"
+ cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME))
+ " Display name:"
+ cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME));
Log.d(TAG, result);
bld.append(result).append('\n');
} else if (ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE.equals(mime)) {
String result = "Email address:"
+ cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.ADDRESS))
+ " with type:"
+ ContactsContract.CommonDataKinds.Email.getTypeLabel(context.getResources(), cursor.getInt(cursor
.getColumnIndex(ContactsContract.CommonDataKinds.Email.TYPE)), null);
Log.d(TAG, result);
bld.append(result).append('\n');
}
else if (ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE.equals(mime)) {
String result = "Phone num:"
+ cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER))
+ " with type:"
+ ContactsContract.CommonDataKinds.Phone.getTypeLabel(context.getResources(), cursor.getInt(cursor
.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE)), null);
Log.d(TAG, result);
bld.append(result).append('\n');
}
}
});
String result = "*************************************";
Log.d(TAG, result);
bld.append(result).append('\n');
}
}
if (bld.length() == 0) {
String result = "Cannot find matching contacts for the string '" + searchString + "'";
Log.d(TAG, result);
return result;
}
return bld.toString();
}
}
现在,为了按号码抓取联系人,我将搜索方法(MainActivity)的第一个Uri更改为:
Uri uri = ContactsContract.Contacts.CONTENT_FILTER_URI.buildUpon().appendEncodedPath("SOME PHONE NUMBER")
.appendQueryParameter(ContactsContract.DIRECTORY_PARAM_KEY, idStr).build();
但它从未找到任何结果。我遗漏了什么?我发现了问题所在。该目录不支持按数字搜索,只支持按名称搜索。根据谷歌文档,一个目录必须支持Contacts.CONTENT\u FILTER\u URI。但是,CommonDataTypes.Phone.CONTENT\u FILTER\u URI是可选的。我发现了这个问题。该目录不支持按数字搜索,只支持按名称搜索。根据谷歌文档,一个目录必须支持Contacts.CONTENT\u FILTER\u URI。但是,CommonDataTypes.Phone.CONTENT_FILTER_URI是可选的。
Uri uri = ContactsContract.Contacts.CONTENT_FILTER_URI.buildUpon().appendEncodedPath("SOME PHONE NUMBER")
.appendQueryParameter(ContactsContract.DIRECTORY_PARAM_KEY, idStr).build();