Android--ContentProvider小案例

这里的小案例是一个读取手机通讯录的数据

首先,因为我们是读取手机自带软件的数据,所以我们不需要使用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;
        }
发布了117 篇原创文章 · 获赞 1 · 访问量 7046

猜你喜欢

转载自blog.csdn.net/qq_43616001/article/details/104470481