android之选择联系人并返回电话号码

在跟着这个教程联系的时候,它所用到的选择联系人方式是自己从数据库里把联系人读取出来,然后用listview显示,选择后返回手机号码,这样做在点击选择联系人的时候,需要时间去加载,并且显示出来的联系人好像并不全,总之感觉不好,想通过调用系统联系人的方式选择,不用自己去处理界面。结果还不错:MainActivity:package jason.pickcontact;imp

大家好,又见面了,我是全栈君。

在跟着这个教程联系的时候,它所用到的选择联系人方式是自己从数据库里把联系人读取出来,然后用listview显示,选择后返回手机号码,

这样做在点击选择联系人的时候,需要时间去加载,并且显示出来的联系人好像并不全,

总之感觉不好,想通过调用系统联系人的方式选择,不用自己去处理界面。

结果还不错:

MainActivity:

package jason.pickcontact;

import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity {
	Button pick;
	TextView show;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		pick = (Button) findViewById(R.id.pick);
		show = (TextView) findViewById(R.id.show);
		pick.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				Intent intent = new Intent(Intent.ACTION_PICK,
						ContactsContract.Contacts.CONTENT_URI);
				MainActivity.this.startActivityForResult(intent, 1);
			}
		});
	}

	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		// TODO Auto-generated method stub
		super.onActivityResult(requestCode, resultCode, data);
		switch (requestCode) {
		case 1:
			if (resultCode == RESULT_OK) {
				Uri contactData = data.getData();
				Cursor cursor = managedQuery(contactData, null, null, null,
						null);
				cursor.moveToFirst();
				String num = this.getContactPhone(cursor);
				show.setText("所选手机号为:" + num);
			}
			break;

		default:
			break;
		}
	}

	private String getContactPhone(Cursor cursor) {
		// TODO Auto-generated method stub
		int phoneColumn = cursor
				.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER);
		int phoneNum = cursor.getInt(phoneColumn);
		String result = "";
		if (phoneNum > 0) {
			// 获得联系人的ID号
			int idColumn = cursor.getColumnIndex(ContactsContract.Contacts._ID);
			String contactId = cursor.getString(idColumn);
			// 获得联系人电话的cursor
			Cursor phone = getContentResolver().query(
					ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
					null,
					ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "="
							+ contactId, null, null);
			if (phone.moveToFirst()) {
				for (; !phone.isAfterLast(); phone.moveToNext()) {
					int index = phone
							.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
					int typeindex = phone
							.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE);
					int phone_type = phone.getInt(typeindex);
					String phoneNumber = phone.getString(index);
					result = phoneNumber;
//					switch (phone_type) {//此处请看下方注释
//					case 2:
//						result = phoneNumber;
//						break;
//
//					default:
//						break;
//					}
				}
				if (!phone.isClosed()) {
					phone.close();
				}
			}
		}
		return result;
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

}

关于phone_type有些问题,联系人中把手机号存储的类型不同的话,phone_type也不同,一般来说手机那一栏的类型是2,

但是用2发现有的选不出来,去联系人查看才发现,好多联系人我并没有把号码存到手机这一栏,而是存在电话或者存为了其他类型,

把各种类型都存了电话测试发现,我手机是miui系统,手机那一栏的TYPE是2,住宅的TYPE是3和1,总机的TYPE是12和7,其他是7

在模拟器上用原生系统,发现mobile是2,home是1,work是3,other是7

不同系统有些差别,毕竟都有过改动,不过手机是2应该是没问题的,由于我存储的类型不对,所以我把代码中正确的注释掉了,没有判断类型就使用了。

标准来说的话,加一个类型2判断是对的。

关于联系人的数据库中的复杂关系没搞懂。先放着吧。

activity_main.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <TextView
        android:id="@+id/show"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />

    <Button
        android:id="@+id/pick"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/show"
        android:layout_below="@+id/show"
        android:text="选择联系人" />

</RelativeLayout>

 

作者:jason0539

微博:http://weibo.com/2553717707

博客:http://blog.csdn.net/jason0539(转载请说明出处)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/121362.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 有auto为什么还要decltype ?详解decltype的用法[通俗易懂]

    有auto为什么还要decltype ?详解decltype的用法[通俗易懂]decltype用法auto和decltype推导类型的区别decltype用法:1.decltype变量2.==decltype表达式==2.1表达式做右值2.2表达式能做左值3.decltype函数3.1decltype(f())3.2decltype(f)C++11中decltype的主要作用auto和decltype推导类型的区别在中,我介绍了auto的用法及其实际编程中的应用,既然auto可以推导变量的类型,为什么C++11还引进decltype类型说明符呢?关于这一点,C++

    2022年9月8日
    0
  • log4j自定义layout_log4j使用教程

    log4j自定义layout_log4j使用教程如果使用pattern布局就要指定的打印信息的具体格式ConversionPattern,打印参数如下:   %m输出代码中指定的消息    %p输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL    %r输出自应用启动到输出该log信息耗费的毫秒数    %c输出所属的类目,通常就是所在类的全名    %t输出产生该日志事件的线

    2022年8月22日
    6
  • 大津阈值法原理_ostu阈值分割

    大津阈值法原理_ostu阈值分割具体的公式推导参见冈萨雷斯**《数字图像处理》**Otsu方法又称最大类间方差法,通过把像素分配像素分为两类或多类,计算类间方差,当方差达到最大值时,类分割线(即灰度值)就作为图像分割阈值。Otsu还有一个重要的性质,即它完全基于对图像直方图进行计算,这也使他成为最常用的阈值处理算法之一。算法步骤如下:…

    2022年8月31日
    0
  • Java课程设计-学籍信息管理系统「建议收藏」

    一、系统分析    学生的学籍信息是记录学生的重要信息档案,如何以电子文档形式记录下学生的学籍信息是每个学校必须做的事情,该学生学籍信息管理系统就是为了方便学校记录下每一个学生的基本信息,生成电子数据库,并且能够做到查询、更改、删除、浏览等功能操作,让学籍信息的管理更加方便快捷。二、设计方案1、系统框架    学籍信息管理系统是集学籍信息录入,学籍信息查询,学籍

    2022年4月6日
    38
  • uva 10555 – Dead Fraction)(数论)

    uva 10555 – Dead Fraction)(数论)

    2022年2月1日
    48
  • 微机原理与接口技术孙力娟_微机原理与接口技术第六版答案

    微机原理与接口技术孙力娟_微机原理与接口技术第六版答案第6版前言(ⅰ)第5版前言(ⅲ)章计算机的基础知识和发展概况(1)1.1计算机中数的表示方(1)1.1.1位计数制(1)1.1.2二制编码(3)1.1.3带符号数的表示方(4)1.第6版前言(ⅰ)第5版前言(ⅲ)章计算机的基础知识和发展概况(1)1.1计算机中数的表示方(1)1.1.1位计数制(1)1.1.2二制编码(3)1.1.3带符号数的表示方(4)1.2计算机的基本结构和软件(6)1.2.1…

    2022年10月2日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号