有内容提供者就有内容访问者,今天我研究了一下如何利用内容访问者获取联系人以及做了一个小小的展示,接下来个大家看
首先是xml上,直接放了一个ListView
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
android:orientation="vertical"
tools:context="com.liuqian.android25_contentprovider.MainActivity">
<ListView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/main_listview">
</ListView>
</LinearLayout>
而新建一个main_item 这个xml一般用于写ListView的样式
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="10dp"
android:orientation="vertical"
>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/main_item_text1"
android:textSize="25dp"
/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/main_item_text2"
android:textSize="18dp"
android:paddingLeft="20dp"
/>
</LinearLayout>
</LinearLayout>
接下来最主要的就是Java文件的代码了
先获取内容访问者,如何根据uri匹配器和content://协议,得到联系人信息 ,再取得名字和电话号码
最需要注意的就是一个联系人拥有多个号码,下面代码里我写了 ,往下看你就会明白了
package com.liuqian.android25_contentprovider;
import android.content.ContentResolver;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.Html;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import com.liuqian.android25_contentprovider.entity.MainEntity;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
private ContentResolver contentResolver;
private ListView main_listview;
private ArrayList<MainEntity> mainEntities;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取内容访问者
contentResolver = getContentResolver();
//得到控件
main_listview = (ListView) findViewById(R.id.main_listview);
//new一个新的集合 用来存放需要展示的数据
mainEntities = new ArrayList<>();
getContacts();//自动获取联系人
// Toast.makeText(this, ""+mainEntities.size(), Toast.LENGTH_SHORT).show();
//设置适配器
main_listview.setAdapter(new MyAdapter());
}
//获取联系人
public void getContacts() {
Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
Cursor cursor = contentResolver.query(uri, null, null, null, null);
int i=1;
while (cursor.moveToNext()) {//当里面有数据时
MainEntity mainEntity=new MainEntity();
int id = cursor.getInt(cursor.getColumnIndex("_id"));//获得联系人id
String name = cursor.getString(cursor.getColumnIndex("display_name"));//获得联系人名字
Log.i("test", id + " " + name);
//根据id查询个人信息
Uri uriData=Uri.parse("content://com.android.contacts/raw_contacts/"+id+"/data");
Cursor cursor1 = contentResolver.query(uriData, null, null, null, null);
String number="";
while (cursor1.moveToNext()) {
String data1 = cursor1.getString(cursor1.getColumnIndex("data1"));//查询电话号码,邮箱,名字等内容
String type = cursor1.getString(cursor1.getColumnIndex("mimetype"));
if("vnd.android.cursor.item/phone_v2".equals(type)){//只打印电话号码的判断
number+=data1+"<br>";//当有多个电话号码的拼接
}
}
if(!TextUtils.isEmpty(name)&&!"".equals(number)){
//我这里是当有这个re且有号码时才放入集合做展示
mainEntity.setMname(name);
mainEntity.setmTel(number);
mainEntities.add(mainEntity);
}
}
}
/**
* 结果电话号码可能含有“-”符号 如果不想要也可以
*/
//适配器
class MyAdapter extends BaseAdapter {
@Override
public int getCount() {
return mainEntities.size();
}
@Override
public Object getItem(int i) {
return mainEntities.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
if(view==null){
//R.layout.item_listview 把布局文件转成View
view=getLayoutInflater().inflate(R.layout.main_item,null);
main_item itemTag=new main_item();
itemTag.main_text1= (TextView) view.findViewById(R.id.main_item_text1);
itemTag.main_text2= (TextView) view.findViewById(R.id.main_item_text2);
view.setTag(itemTag);
}
main_item it= (main_item) view.getTag();
//设值
it.main_text1.setText(mainEntities.get(i).getMname());
it.main_text2.setText(Html.fromHtml(mainEntities.get(i).getmTel()));
return view;
}
}
class main_item{
public TextView main_text1;
public TextView main_text2;
}
}
上面有一个适配器,是配合ListView用的。
这样联系人和他的电话号码就可以展示出来了,今天的分享就到此为止了,如有不足的地方请指正,谢谢!
首先是xml上,直接放了一个ListView
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
android:orientation="vertical"
tools:context="com.liuqian.android25_contentprovider.MainActivity">
<ListView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/main_listview">
</ListView>
</LinearLayout>
而新建一个main_item 这个xml一般用于写ListView的样式
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="10dp"
android:orientation="vertical"
>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/main_item_text1"
android:textSize="25dp"
/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/main_item_text2"
android:textSize="18dp"
android:paddingLeft="20dp"
/>
</LinearLayout>
</LinearLayout>
接下来最主要的就是Java文件的代码了
先获取内容访问者,如何根据uri匹配器和content://协议,得到联系人信息 ,再取得名字和电话号码
最需要注意的就是一个联系人拥有多个号码,下面代码里我写了 ,往下看你就会明白了
package com.liuqian.android25_contentprovider;
import android.content.ContentResolver;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.Html;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import com.liuqian.android25_contentprovider.entity.MainEntity;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
private ContentResolver contentResolver;
private ListView main_listview;
private ArrayList<MainEntity> mainEntities;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取内容访问者
contentResolver = getContentResolver();
//得到控件
main_listview = (ListView) findViewById(R.id.main_listview);
//new一个新的集合 用来存放需要展示的数据
mainEntities = new ArrayList<>();
getContacts();//自动获取联系人
// Toast.makeText(this, ""+mainEntities.size(), Toast.LENGTH_SHORT).show();
//设置适配器
main_listview.setAdapter(new MyAdapter());
}
//获取联系人
public void getContacts() {
Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
Cursor cursor = contentResolver.query(uri, null, null, null, null);
int i=1;
while (cursor.moveToNext()) {//当里面有数据时
MainEntity mainEntity=new MainEntity();
int id = cursor.getInt(cursor.getColumnIndex("_id"));//获得联系人id
String name = cursor.getString(cursor.getColumnIndex("display_name"));//获得联系人名字
Log.i("test", id + " " + name);
//根据id查询个人信息
Uri uriData=Uri.parse("content://com.android.contacts/raw_contacts/"+id+"/data");
Cursor cursor1 = contentResolver.query(uriData, null, null, null, null);
String number="";
while (cursor1.moveToNext()) {
String data1 = cursor1.getString(cursor1.getColumnIndex("data1"));//查询电话号码,邮箱,名字等内容
String type = cursor1.getString(cursor1.getColumnIndex("mimetype"));
if("vnd.android.cursor.item/phone_v2".equals(type)){//只打印电话号码的判断
number+=data1+"<br>";//当有多个电话号码的拼接
}
}
if(!TextUtils.isEmpty(name)&&!"".equals(number)){
//我这里是当有这个re且有号码时才放入集合做展示
mainEntity.setMname(name);
mainEntity.setmTel(number);
mainEntities.add(mainEntity);
}
}
}
/**
* 结果电话号码可能含有“-”符号 如果不想要也可以
*/
//适配器
class MyAdapter extends BaseAdapter {
@Override
public int getCount() {
return mainEntities.size();
}
@Override
public Object getItem(int i) {
return mainEntities.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
if(view==null){
//R.layout.item_listview 把布局文件转成View
view=getLayoutInflater().inflate(R.layout.main_item,null);
main_item itemTag=new main_item();
itemTag.main_text1= (TextView) view.findViewById(R.id.main_item_text1);
itemTag.main_text2= (TextView) view.findViewById(R.id.main_item_text2);
view.setTag(itemTag);
}
main_item it= (main_item) view.getTag();
//设值
it.main_text1.setText(mainEntities.get(i).getMname());
it.main_text2.setText(Html.fromHtml(mainEntities.get(i).getmTel()));
return view;
}
}
class main_item{
public TextView main_text1;
public TextView main_text2;
}
}
上面有一个适配器,是配合ListView用的。
这样联系人和他的电话号码就可以展示出来了,今天的分享就到此为止了,如有不足的地方请指正,谢谢!