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();
}
我的问题不是如何获取这些数据,而是为什么我的代码是这样工作的,如果可能的话,回答下面的部分