获取号码从通讯录中选择器 [英] Getting Number from Contacts Picker

查看:125
本文介绍了获取号码从通讯录中选择器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想获得联系人姓名和电话号码后,用户拿起从联系人选择器中的联系人。我试图让我的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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆