获取联系人列表:
通过getContentResolver()获取CntentResolver实例。
然后调用query()方法传入获取手机联系的Uri:
ContactsContract.CommonDataKinds.Phone.CONTENT_URI
其中query()方法由五个参数,
第一个为Uri目标对象,
第二个为制定查询的列名,
第三个为指定where的约束条件,
第四个参数为为where中的占位符提供具体的值,
第五个参数是查询结果的排列顺序。
获得一个Cursor实例,再循环调用moveToNext()方法遍历所有数据。
在每一次循环中Cursor通过调用getString()方法传入索引获取数据。
而索引又通过getColumnIndex()方法传入对应的列名获得。
android.content.ContentResolver
private void readContect(){
Cursor cursor=null;
cursor=getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,null,null,null);
if(cursor!=null){
while(cursor.moveToNext()){
String name=cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
String number=cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
list.add(name+"\n"+number);
}
arrayAdapter.notifyDataSetChanged();
}
}
以下代码涉及到动态权限的申请和ArrayAdapter的使用。
demo:
import android.Manifest;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private ArrayAdapter<String> arrayAdapter;
private Button button;
private ListView listView;
private List<String> list=new ArrayList<>();
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button=(Button)findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
listView=(ListView)findViewById(R.id.listView);
arrayAdapter=new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple_list_item_1,list);
listView.setAdapter(arrayAdapter);
if(ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_CONTACTS)!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.READ_CONTACTS}, 1);
}else{
readContect();
}
}
});
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch(requestCode){
case 1:
if(grantResults.length>0&&grantResults[0]==PackageManager.PERMISSION_GRANTED){
readContect();
}else{
Toast.makeText(MainActivity.this,"无法获得相关权限",Toast.LENGTH_SHORT).show();
}
break;
}
}
private void readContect(){
Cursor cursor=null;
cursor=getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,null,null,null);
if(cursor!=null){
while(cursor.moveToNext()){
String name=cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
String number=cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
list.add(name+"\n"+number);
}
arrayAdapter.notifyDataSetChanged();
}
}
}
在AndroidManefist.xml中要添加权限
<uses-permission android:name="android.permission.READ_CONTACTS"/>
创建自己的内容提供器:
创建一个继承ContentProvider的类,重写里面的onCreate,query,update,insert,delete,getType方法。
query第一个参数为要查询内容对应的Uri,第二个参数为要查询的列名,第三个参数为指定where的约束条件如"where name=?",第四个参数为指定where的占位符提供的具体值如new String[]{"grooter"},第五个参数为查询结果的排列顺序。返回Cursor对象。
其中update的第二个参数为要更新的数据,如values.put("price",10)指的是更新价格为10,第三个参数和第四个参数同query的第三和第四个参数,如"name=?",new String[]{"数据结构"}将数据结构这本书的价格改为10。返回的是受影响的行数。
delete的第二和第三个参数同update的第三和第四个参数。返回的是被删除的行数。
insert的第二个参数是要插入的数据。返回新记录的URI。
android.content.ContentProvider
内容提供端:
import android.content.ContentProvider;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
/**
* Created by Administrator on 2017/11/7.
*/
public class MyProvider extends ContentProvider {
@Override
public boolean onCreate() {
return false;
}
@Nullable
@Override
public Cursor query(@NonNull Uri uri, @Nullable String[] strings, @Nullable String s, @Nullable String[] strings1, @Nullable String s1) {
return null;
}
@Nullable
@Override
public Uri insert(@NonNull Uri uri, @Nullable ContentValues contentValues) {
return null;
}
@Override
public int update(@NonNull Uri uri, @Nullable ContentValues contentValues, @Nullable String s, @Nullable String[] strings) {
return 0;
}
@Override
public int delete(@NonNull Uri uri, @Nullable String s, @Nullable String[] strings) {
return 0;
}
@Nullable
@Override
public String getType(@NonNull Uri uri) {
return null;
}
}
内容请求端:
Uri uri=Uri.parse("content://com.example.databasetest.provider/book");
Cursor cursor=getContentResolver().query(uri,null,null,null,null);
com.example.databasetest.provider为内容提供器定制的uri,book指数据库中的表
当拿到cursor后,就可以遍历出数据,详见取联系人目录demo