这里的小案例是一个读取手机通讯录的数据
首先,因为我们是读取手机自带软件的数据,所以我们不需要使用ContentProvider,而是使用ContentResolver
界面:
ContentResolver代码:
public class MyResolver extends AppCompatActivity {
private EditText et_main;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my_resolver);
et_main=findViewById(R.id.et_main);
}
public void toContactList(View view){
//启动联系人界面
startActivityForResult(new Intent(this,ContactListActivity.class),1);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode==1&&resultCode==RESULT_OK){
String number = data.getStringExtra("NUMBER");
et_main.setText(number);
}
}
}
点击“选择联系人”后,会读取通讯录里面的信息。界面如下:
代码:
public class ContactListActivity extends ListActivity implements AdapterView.OnItemClickListener {
private ListView list;
private ContactBaseAdapter adapter;
private List<Map<String,String>> data;
final private int REQUEST_CODE_ASK_PERMISSIONS = 123;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_contact_list);
list=getListView();
adapter=new ContactBaseAdapter();
data=new ArrayList<>();
list.setOnItemClickListener(this);
int hasWriteContactsPermisson = checkSelfPermission(
android.Manifest.permission.READ_CONTACTS);
if(hasWriteContactsPermisson !=
PackageManager.PERMISSION_GRANTED)
{
requestPermissions(new String[]
{Manifest.permission.WRITE_CONTACTS},
REQUEST_CODE_ASK_PERMISSIONS);
return;
}
//查询得到联系人数据
//ContentResolver
ContentResolver resolver=getContentResolver();
//执行查询得到cursor
String[] str={ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.NUMBER};
Cursor cursor = resolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, str, null, null, null);
//取出其中的数据保存到data
while(cursor.moveToNext()){
String name=cursor.getString(0);
String number=cursor.getString(1);
Map<String,String> map=new HashMap<>();
map.put("name",name);
map.put("number",number);
data.add(map);
}
list.setAdapter(adapter);
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
String number=data.get(position).get("number");
//getIntent的意思是,不new一个,用之前那个。也就是打开这个activity那个
Intent intent=getIntent();
intent.putExtra("NUMBER",number);
setResult(RESULT_OK,intent);
finish();
}
public class ContactBaseAdapter extends BaseAdapter{
@Override
public int getCount() {
return data.size();
}
@Override
public Object getItem(int position) {
return data.get(position);
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if(convertView==null){
convertView= View.inflate(ContactListActivity.this,R.layout.item_contact,null);
}
TextView name=(TextView)convertView.findViewById(R.id.name);
TextView number=(TextView)convertView.findViewById(R.id.number);
Map<String, String> map = data.get(position);
name.setText(map.get("name"));
number.setText(map.get("number"));
return convertView;
}
}
}
首先讲一下,这个activity继承的是ListActivity。
所以布局是:
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@android:id/list"
tools:context=".ContactListActivity">
</ListView>
只有这么一点点,但是要注意的是:id的设置一定要写: android:id="@android:id/list"
然后最重要的就是添加权限:
<uses-permission android:name="android.permission.READ_CONTACTS"/>
或者
<uses-permission android:name="android.permission.WRITE_CONTACTS"/>
但是,在我做这个小案例时,发现就算添加了权限也照样报错,写的是安全问题,然后添加权限。结果我把两条权限都添加了。结果还是报错。问题就在于:现在大部分所使用的软件,大部分第一次启动都会弹出问你是否给程序对应的权限。所以要动态的给权限:
在ContentResolver调用前,添加这一大坨代码即可
final private int REQUEST_CODE_ASK_PERMISSIONS = 123;
int hasWriteContactsPermisson = checkSelfPermission(
android.Manifest.permission.READ_CONTACTS);
if(hasWriteContactsPermisson !=
PackageManager.PERMISSION_GRANTED)
{
requestPermissions(new String[]
{Manifest.permission.WRITE_CONTACTS},
REQUEST_CODE_ASK_PERMISSIONS);
return;
}