获取本地通讯录,方法记录
先说一下方法的种类,我现在所知道的有两种方法
1、第一种是比较直接但是相对比较麻烦的方法
手机内部会存有通讯录数据库,我们通过直接访问数据库,去查询所需要的资源。听起来挺方便,但是要知道,这些表很多很多,而且需要表和表之间串联查询,这中间就会有一定的复杂程度。(我连表的名字也记不住~~~)
2、第二种方法就比较符合java的习惯了,有工具类,有实现方法,有已经规定好的字段,接下来的例子就是使用这种方法来实现的
先把权限写在最上方~~
<uses-permission android:name="android.permission.READ_CONTACTS" />
权限完成以后
第一步创建一个ContentResolver,并通过构造器获取实体
ContentResolver resolver = getContentResolver();
第二步 通过resolver进行查询
这里具体说一下,android已经规范好了查询通讯录的字段,字段一共有其实几个,我们只需要获取我们所需要的字段。这些字段已经在Phone这个类里定义好了
Cursor cursor = resolver.query(Phone.CONTENT_URI, new String[]{Phone.DISPLAY_NAME, Phone.NUMBER}, null, null, null);
然后就是数据提取的工作,也很简单
我先写了一个类来存放数据,就两个变量,构造方法我这里就不贴了
public class ContactData {
private String name;
private long phoneNumber;
然后是提取到一个ArrayList里面
if (cursor != null) {
while (cursor.moveToNext()) {
ContactData contactData = new ContactData(
cursor.getString(cursor.getColumnIndex(Phone.DISPLAY_NAME)),
cursor.getLong(cursor.getColumnIndex(Phone.NUMBER)));
data.add(contactData);
}
cursor.close();
return data;
}else {
Toast.makeText(this,"No Contact Data", Toast.LENGTH_SHORT).show();
return null;
}
我的源码里是对list进行函数封装的,所以会返回一个arraylist
然后就是listview的一系列操作,我就不解释啦 之前写过很详细代码示例。
接下来就是源码
首先是AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.ty.contact_demo1">
<uses-permission android:name="android.permission.READ_CONTACTS" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
接下来是Main和listview item的布局文件
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
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="com.ty.contact_demo1.MainActivity">
<ListView
android:id="@+id/LV_Main_ContactListView"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</ListView>
</RelativeLayout>
item
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/TV_Item_Name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="18sp" />
<TextView
android:id="@+id/TV_Item_PhoneNumber"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_toRightOf="@+id/TV_Item_Name"
android:textSize="18sp" />
</RelativeLayout>
再来是Listview和Contactdata(存放数据的类)
ListView
package com.ty.contact_demo1;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import java.util.ArrayList;
/**
* Created by IT on 2017/2/22.
*/
public class Contact_ListView_BaseAdapter extends BaseAdapter {
private ArrayList<ContactData> dataList;
private Context context;
private ViewHolder viewHolder;
public Contact_ListView_BaseAdapter(ArrayList<ContactData> dataList, Context context) {
this.dataList = dataList;
this.context = context;
}
@Override
public int getCount() {
return dataList.size();
}
@Override
public Object getItem(int position) {
return dataList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
viewHolder = null;
if (convertView == null) {
viewHolder = new ViewHolder();
convertView = LayoutInflater.from(context).inflate(R.layout.layout_item, null);
viewHolder.tv_name = (TextView) convertView.findViewById(R.id.TV_Item_Name);
viewHolder.tv_phoneNumber = (TextView) convertView.findViewById(R.id.TV_Item_PhoneNumber);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.tv_name.setText(dataList.get(position).getName());
viewHolder.tv_phoneNumber.setText(String.valueOf(dataList.get(position).getPhoneNumber()));
return convertView;
}
class ViewHolder {
TextView tv_name;
TextView tv_phoneNumber;
}
}
ContactData
package com.ty.contact_demo1;
/**
* Created by IT on 2017/2/22.
*/
public class ContactData {
private String name;
private long phoneNumber;
public ContactData(String name, long phoneNumber) {
this.name = name;
this.phoneNumber = phoneNumber;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public long getPhoneNumber() {
return phoneNumber;
}
public void setPhoneNumber(long phoneNumber) {
this.phoneNumber = phoneNumber;
}
}
然后是Main
package com.ty.contact_demo1;
import android.content.ContentResolver;
import android.database.Cursor;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ListView;
import android.widget.Toast;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
Contact_ListView_BaseAdapter adapter;
ArrayList<ContactData> dataList;
ListView listView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = (ListView) findViewById(R.id.LV_Main_ContactListView);
dataList = GetContactData();
if (dataList != null)
{
adapter = new Contact_ListView_BaseAdapter(dataList,this);
listView.setAdapter(adapter);
}
}
private ArrayList<ContactData> GetContactData() {
ContentResolver resolver = getContentResolver();
ArrayList<ContactData> data = new ArrayList<>();
Cursor cursor = resolver.query(Phone.CONTENT_URI, new String[]{Phone.DISPLAY_NAME, Phone.NUMBER}, null, null, null);
if (cursor != null) {
while (cursor.moveToNext()) {
ContactData contactData = new ContactData(
cursor.getString(cursor.getColumnIndex(Phone.DISPLAY_NAME)),
cursor.getLong(cursor.getColumnIndex(Phone.NUMBER)));
data.add(contactData);
}
cursor.close();
return data;
}else {
Toast.makeText(this,"No Contact Data", Toast.LENGTH_SHORT).show();
return null;
}
}
}
最后在补充一个点击ListView的Item,可以拨打电话的方法
首先要加一条拨打电话的权限
<uses-permission android:name="android.permission.CALL_PHONE" />
然后就是调用listview的setOnItemClickListener方法
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Intent intent = new Intent(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:"+((ContactData)adapter.getItem(position)).getPhoneNumber()));
startActivity(intent);
}
});
这里会发现startActivity(intent)会有一个警告
说需要检查权限,我这里先略过(我还不太了解哈),之后会补上专题我保证(爱信不信,千万别信)