获取号码从通讯录中选择器 [英] Getting Number from Contacts Picker
问题描述
我想获得联系人姓名和电话号码后,用户拿起从联系人选择器中的联系人。我试图让我的SDK V3应用工作,所以我创建了一个抽象类,它会调用只是我所需要的API。我已经有抽象类工作(它选择合适的API),我也有一个SDK的API v3,4工作。我有收到使用ContactsContract工作的新API的问题。
我可以得到一个联系人的名字,但它检索的数量始终是面前的接触式ID的数量!例如:我有2个触点张三和李四用各自的数字555-555-555和777-777-7777添加联系人。李四是ID = 1和李四是ID = 2。如果我试图让Jane Doe的号码,我得到约翰,555-555-5555。如果我试图让约翰的,我没有得到任何东西。该检查(cursor.moveToNext())失败。
能否请你帮我解决这个问题?这是推动我疯了。我看过很多很多的例子,一定可以得到同样的错误。
的意图数据从onActivityResult
的数据意图
进口的java.util.ArrayList;
进口android.app.Activity;
进口android.content.Intent;
进口android.database.Cursor;
进口android.net.Uri;
进口android.provider.ContactsContract;
进口android.provider.ContactsContract.CommonDataKinds.Email;
进口android.provider.ContactsContract.CommonDataKinds.Phone;
进口android.provider.ContactsContract.Contacts;
类NewContactsAdapterBridge扩展ContactsAdapterBridge {
ArrayList的<字符串>信息=新的ArrayList<字符串>();
ArrayList的<字符串>的getInfo(活动一,意图数据){
乌里联系数据= data.getData();
光标光标= a.managedQuery(联络人资料,NULL,NULL,NULL,NULL);
如果(cursor.moveToFirst()){
字符串ID = cursor.getString(
cursor.getColumnIndex(ContactsContract.Contacts._ID));
字符串名称= cursor.getString(cursor.getColumnIndexOrThrow
(ContactsContract.Contacts.DISPLAY_NAME));
字符串hasPhoneNumber = cursor.getString(cursor.getColumnIndexOrThrow(
ContactsContract.Contacts.HAS_PHONE_NUMBER));
info.add(名称);
如果(的Integer.parseInt(hasPhoneNumber)大于0){
乌里myPhoneUri = Uri.withAppendedPath(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
内径);
光标pCur = a.managedQuery(
myPhoneUri,
空值,
空值,
空值,
空值);
如果(pCur.moveToNext()){
串号= pCur.getString(pCur.getColumnIndex
(ContactsContract.CommonDataKinds.Phone.NUMBER));
info.add(数);
}
}
}
返回信息;
}
}
@覆盖
保护无效onActivityResult(INT申请code,INT结果code,意图数据){
如果(结果code == RESULT_OK){
开关(要求code){
案例CONTACT_PICKER_RESULT:
最后的EditText phoneInput =(EditText上)findViewById(R.id.phoneNumberInput);
光标光标= NULL;
字符串phoneNumber的=;
名单<字符串> allNumbers =新的ArrayList<字符串>();
INT phoneIdx = 0;
尝试 {
开放的结果= data.getData();
字符串ID = result.getLastPathSegment();
光标= getContentResolver()查询(Phone.CONTENT_URI,空,Phone.CONTACT_ID +=?,新的String [] {ID},空)。
phoneIdx = cursor.getColumnIndex(Phone.DATA);
如果(cursor.moveToFirst()){
而(cursor.isAfterLast()== FALSE){
phoneNumber的= cursor.getString(phoneIdx);
allNumbers.add(phoneNumber的);
cursor.moveToNext();
}
} 其他 {
//没有结果的行动
}
}赶上(例外五){
//错误操作
} 最后 {
如果(光标!= NULL){
cursor.close();
}
最后的CharSequence []项目= allNumbers.toArray(新的String [allNumbers.size());
AlertDialog.Builder建设者=新AlertDialog.Builder(your_class.this);
builder.setTitle(选择一个数字);
builder.setItems(项目,新DialogInterface.OnClickListener(){
公共无效的onClick(DialogInterface对话,诠释项){
字符串selectedNumber =项目[项目]的ToString();
selectedNumber = selectedNumber.replace( - ,);
phoneInput.setText(selectedNumber);
}
});
AlertDialog警报= builder.create();
如果(allNumbers.size()→1){
alert.show();
} 其他 {
串selectedNumber = phoneNumber.toString();
selectedNumber = selectedNumber.replace( - ,);
phoneInput.setText(selectedNumber);
}
如果(phoneNumber.length()== 0){
//没有数字发现行动
}
}
打破;
}
} 其他 {
//活动结果错误操作
}
}
您需要适应这与你的应用程序的工作
I am trying to get a contacts name and phone number after a user has picked a contact from the Contact Picker. I am attempting to make my application work for SDK v3 and up so I created an abstract class that would call only the API that I needed. I already have the abstract class working (it chooses the right API) and I also have the API for SDK v3,4 working. I am having problems getting the newer API that uses ContactsContract to work.
I can get a contacts name, but the number it retrieves is always the number for the contact ID BEFORE it! Example: I have 2 contacts "John Doe" and "Jane Doe" with respective numbers "555-555-555" and "777-777-7777" added in the contacts. John Doe is ID=1 and Jane Doe is ID=2. If I attempt to get Jane Doe's number, I get John's, 555-555-5555. If I attempt to get John's, I don't get anything. The check for if (cursor.moveToNext()) fails.
Can you please help me fix this? It is driving me crazy. I have looked at many many examples and always get the same error.
The Intent data is the data Intent from the onActivityResult
import java.util.ArrayList;
import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.provider.ContactsContract;
import android.provider.ContactsContract.CommonDataKinds.Email;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.provider.ContactsContract.Contacts;
class NewContactsAdapterBridge extends ContactsAdapterBridge {
ArrayList<String> info = new ArrayList<String>();
ArrayList<String> getInfo (Activity a, Intent data) {
Uri contactData = data.getData();
Cursor cursor = a.managedQuery(contactData, null, null, null, null);
if (cursor.moveToFirst()) {
String id = cursor.getString(
cursor.getColumnIndex(ContactsContract.Contacts._ID));
String name = cursor.getString(cursor.getColumnIndexOrThrow
(ContactsContract.Contacts.DISPLAY_NAME));
String hasPhoneNumber = cursor.getString(cursor.getColumnIndexOrThrow(
ContactsContract.Contacts.HAS_PHONE_NUMBER));
info.add(name);
if (Integer.parseInt(hasPhoneNumber) > 0) {
Uri myPhoneUri = Uri.withAppendedPath(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
id);
Cursor pCur = a.managedQuery(
myPhoneUri,
null,
null,
null,
null);
if (pCur.moveToNext()) {
String number = pCur.getString( pCur.getColumnIndex
(ContactsContract.CommonDataKinds.Phone.NUMBER));
info.add(number);
}
}
}
return info;
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK) {
switch (requestCode) {
case CONTACT_PICKER_RESULT:
final EditText phoneInput = (EditText) findViewById(R.id.phoneNumberInput);
Cursor cursor = null;
String phoneNumber = "";
List<String> allNumbers = new ArrayList<String>();
int phoneIdx = 0;
try {
Uri result = data.getData();
String id = result.getLastPathSegment();
cursor = getContentResolver().query(Phone.CONTENT_URI, null, Phone.CONTACT_ID + "=?", new String[] { id }, null);
phoneIdx = cursor.getColumnIndex(Phone.DATA);
if (cursor.moveToFirst()) {
while (cursor.isAfterLast() == false) {
phoneNumber = cursor.getString(phoneIdx);
allNumbers.add(phoneNumber);
cursor.moveToNext();
}
} else {
//no results actions
}
} catch (Exception e) {
//error actions
} finally {
if (cursor != null) {
cursor.close();
}
final CharSequence[] items = allNumbers.toArray(new String[allNumbers.size()]);
AlertDialog.Builder builder = new AlertDialog.Builder(your_class.this);
builder.setTitle("Choose a number");
builder.setItems(items, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int item) {
String selectedNumber = items[item].toString();
selectedNumber = selectedNumber.replace("-", "");
phoneInput.setText(selectedNumber);
}
});
AlertDialog alert = builder.create();
if(allNumbers.size() > 1) {
alert.show();
} else {
String selectedNumber = phoneNumber.toString();
selectedNumber = selectedNumber.replace("-", "");
phoneInput.setText(selectedNumber);
}
if (phoneNumber.length() == 0) {
//no numbers found actions
}
}
break;
}
} else {
//activity result error actions
}
}
You need to adapt this to work with your app
这篇关于获取号码从通讯录中选择器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!