首先ContentResolver是一个通过uri进行跨进程通信,如果是是自己测试的话需要一个数据库和一个ContentProvider来打开一个Uri然后用ContentResolver进入获取。
举个例子:
就像是一个密封的罐子如果你要喝到里面的水得用吸管打开一个口然而Uri就相当于这个吸管
我们获取手机联系的时候谷歌底层已经封装好了ContentProvider所以我们只需要ContentResolver
下面是自己的一个获取联系人的小demo
第一个页面 xml文件
<?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:orientation="vertical"
tools:context="com.bawei.rikao329.MainActivity">
<EditText
android:id="@+id/et_number"
android:layout_width="match_parent"
android:layout_height="50dp"
android:hint="获取的联系人号码"
/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="onClick"
android:text="点击获取联系人"
/>
</LinearLayout>
第一个页面是要往第二个页面跳转在第二个页面获取数据用Listview展示再返回第一个页面展示电话号码
第二个XML
<?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_secondactivity"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.bawei.rikao329.Secondactivity">
<ListView
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="match_parent"></ListView>
</RelativeLayout>
因为我用的listview所以还有个小的item
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:orientation="horizontal"
android:layout_height="match_parent">
<TextView
android:id="@+id/tv_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="name"
android:textSize="25sp"
/>
<TextView
android:id="@+id/tv_number"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="135464916"
android:textSize="25sp"
/>
</LinearLayout>
之后便是主菜第一个Activity
package com.bawei.rikao329;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
public class MainActivity extends AppCompatActivity {
private EditText et_number;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initview();
}
private void initview() {
et_number= (EditText) findViewById(R.id.et_number);
}
//点击跳转 使用带返回值的跳转
public void onClick(View view){
Intent intent=new Intent(MainActivity.this,Secondactivity.class);
startActivityForResult(intent,20);
}
//返回的方法
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode==20&&resultCode==50){
String number = data.getStringExtra("number");
et_number.setText(number);
}
}
}
第一个页面只是 基础的跳转和返回所以主要解释第二个activity
package com.bawei.rikao329;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.Intent;
import android.database.Cursor;
import android.provider.ContactsContract;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Secondactivity extends Activity implements AdapterView.OnItemClickListener {
ListView lv;
List<Map<String,String>> list;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_secondactivity);
lv= (ListView) findViewById(R.id.lv);
list=new ArrayList<>();
initdate();
lv.setOnItemClickListener(this);
}
private void initdate() {
//这个是根据参数传输所以他需要一个数组第一个是电话的联系人第二个是电话的号码
String projerct[]={ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.NUMBER};
//获取resolver对象第一个是谷歌底层的Uri 第二个就是我们的数组 后来三个并没有什么用
ContentResolver resolver=getContentResolver();
//之后调用查的方法
Cursor query = resolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, projerct, null, null, null);
//查到之后循环放入集合中 这样就有了数据源 然后放入adapter中 listview绑定adapter
while (query.moveToNext()){
Map<String,String> map=new HashMap<>();
String name = query.getString(0);
String number = query.getString(1);
map.put("name",name);
map.put("number",number);
list.add(map);
}
lv.setAdapter(new myadapter());
}
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
String number=list.get(i).get("number");
Intent inten=new Intent();
inten.putExtra("number",number);
setResult(50,inten);
finish();
}
class myadapter extends BaseAdapter{
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int i) {
return list.get(i);
}
@Override
public long getItemId(int i) {
return 0;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
view=View.inflate(Secondactivity.this,R.layout.item,null);
TextView tv_name= (TextView) view.findViewById(R.id.tv_name);
TextView tv_number= (TextView) view.findViewById(R.id.tv_number);
tv_name.setText(list.get(i).get("name"));
tv_number.setText(list.get(i).get("number"));
return view;
}
}
}
manifest中需要加入调取联系人的权限
总之安卓是个神奇的东西底层封装了太多东西 所以也非常简单 这是我总结的获取手机联系人 希望能帮助到人