Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 有意查看联系人详细信息_Android - Fatal编程技术网

Android 有意查看联系人详细信息

Android 有意查看联系人详细信息,android,Android,我创建了一个在列表视图中查看联系人姓名和号码的小程序 public class showcontacts extends Activity { ListView lv; Uri u; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState);

我创建了一个在列表视图中查看联系人姓名和号码的小程序

public class showcontacts extends Activity
{
    ListView lv;
    Uri u;
    @Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.listcontacts);
    lv=(ListView)findViewById(R.id.listView1);
    lv.setOnItemClickListener(new mysellisten());
    u=Phone.CONTENT_URI;


    shownames();
}


public void shownames()
{
     String[] p=new String[] {  
                Contacts._ID,
             Contacts.DISPLAY_NAME,
             Contacts.HAS_PHONE_NUMBER,
             Phone.NUMBER

           };
String selection = ContactsContract.Contacts.IN_VISIBLE_GROUP + " = '"
+ ("1") + "' and "+ContactsContract.Contacts.HAS_PHONE_NUMBER+"='1'" ;
String sortOrder = ContactsContract.Contacts.DISPLAY_NAME
+ " COLLATE LOCALIZED ASC";
Cursor c=getContentResolver().query(u, p, selection,null, sortOrder);
String from[]=new String[]{ContactsContract.Contacts.DISPLAY_NAME,ContactsContract.CommonDataKinds.Phone.NUMBER};
int id[]={R.id.name,R.id.phoneno};
SimpleCursorAdapter sc=new SimpleCursorAdapter(this,R.layout.phoneview, c, from, id);

lv.setAdapter(sc);

}


class mysellisten implements OnItemClickListener
{


    @Override
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
        // TODO Auto-generated method stub
        Toast.makeText(getApplicationContext(), "called", Toast.LENGTH_SHORT).show();
        Uri nu=ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, arg3);
        Intent i=new Intent(Intent.ACTION_VIEW,nu);
        startActivity(i);

    }

}
公共类showcontacts扩展活动
{
ListView lv;
乌里乌;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
//TODO自动生成的方法存根
super.onCreate(savedInstanceState);
setContentView(R.layout.listcontacts);
lv=(ListView)findViewById(R.id.listView1);
lv.setOnItemClickListener(新mysellisten());
u=Phone.CONTENT\u URI;
shownames();
}
公共void shownames()
{
字符串[]p=新字符串[]{
联系人。\u ID,
Contacts.DISPLAY_NAME,
Contacts.HAS_电话号码,
电话号码
};
字符串选择=Contacts contract.Contacts.IN_VISIBLE_GROUP+“=”“
+(“1”)+”和“+联系人Contacts.Contacts.HAS_PHONE_NUMBER+”='1';
字符串排序器=Contacts contract.Contacts.DISPLAY\u NAME
+“整理本地化ASC”;
游标c=getContentResolver().query(u、p、selection、null、sortOrder);
来自[]的字符串=新字符串[]{ContactsContract.Contacts.DISPLAY_NAME,ContactsContract.commondatatypes.Phone.NUMBER};
int-id[]={R.id.name,R.id.phoneno};
SimpleCursorAdapter sc=新的SimpleCursorAdapter(this,R.layout.phoneview,c,from,id);
低压设置适配器(sc);
}
类mysellisten实现了一个侦听器
{
@凌驾
公共视图单击(AdapterView arg0、视图arg1、整型arg2、长型arg3){
//TODO自动生成的方法存根
Toast.makeText(getApplicationContext(),“called”,Toast.LENGTH_SHORT.show();
Uri nu=ContentUris.withAppendedId(Contacts contract.Contacts.CONTENT_Uri,arg3);
意向i=新意向(意向.行动视图,nu);
星触觉(i);
}
}
phoneview是一个带有Imageview和2个TextView的简单xml。 我能够获得姓名和电话号码。但是,单击列表视图中的项目时,显示的记录不正确。它与我单击的记录不匹配。有些记录甚至无法打开。emulator在显示空白屏幕后返回列表视图

另外,为什么我在使用Phone.CONTENT_URI时可以使用Contacts表列,但如果使用Contacts.CONTENT_URI,则无法使用Phone.NUMBER字段。
请更新。

您是否已将联系人
权限添加到AndroidManifest.xml

<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />

您完全可以使用
联系人来检索联系人姓名和电话号码。内容\u URI
请查找执行此操作的代码

try {
        Cursor cursor = getContentResolver().query(
                ContactsContract.Contacts.CONTENT_URI, null, null, null,
                Phone.DISPLAY_NAME + " ASC");
        while (cursor.moveToNext()) {
            String contactId = cursor.getString(cursor
                    .getColumnIndex(ContactsContract.Contacts._ID));
            String hasPhone = cursor
                    .getString(cursor
                            .getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER));
            String name = cursor
                    .getString(cursor
                            .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));

            if ("1".equals(hasPhone) || Boolean.parseBoolean(hasPhone)) {
                // You know it has a number so now query it like this
                Cursor phones = getContentResolver().query(
                        ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                        null,
                        ContactsContract.CommonDataKinds.Phone.CONTACT_ID
                                + " = " + contactId, null, null);
                while (phones.moveToNext()) {
                    String dname = cursor
                            .getString(cursor
                                    .getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
                    System.out.println("Name is " + dname);
                    String phoneNumber = phones
                            .getString(phones
                                    .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                    System.out.println("Phone Number is " + phoneNumber);
                    int itype = phones
                            .getInt(phones
                                    .getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE));

                    final boolean isMobile = itype == ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE
                            || itype == ContactsContract.CommonDataKinds.Phone.TYPE_WORK_MOBILE;


                }
                phones.close();
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }

我的问题不是如何获取这些数据,而是为什么我的代码是这样工作的,如果可能的话,回答下面的部分