ContentProvider 系统URI

一.通过内容解析者 获取系统内容

1.获取手机联系人信息

在清单文件中添加读取联系人的权限

<uses-permission android:name="android.permission.READ_CONTACTS" />

因为联系人等数据属于危险级别的,所以需要动态获取权限

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    String[] p = new String[]{Manifest.permission.READ_CONTACTS};
    requestPermissions(p, 100);
}

获取到权限后就可以进行查询操作
需要内容解析者 然后遍历手机联系人的Uri

private void getContacts() {
    //获取内容解析者
    ContentResolver contentResolver = getContentResolver();
    Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
    Cursor cursor = contentResolver.query(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));

            Toast.makeText(this, name + "---" + number, Toast.LENGTH_SHORT).show();
            Contacts contact = new Contacts(name, number);
            contacts.add(contact);
        }
        cursor.close();
    }

}

整体代码

public class MainActivity extends AppCompatActivity {
    private Button butRead;
    private List<Contacts> contacts = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initViews();
    }

    private void initViews() {
        butRead = (Button) findViewById(R.id.but_read);

        butRead.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //动态获取权限
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    String[] p = new String[]{Manifest.permission.READ_CONTACTS};
                    requestPermissions(p, 100);
                }else {//已经获取过权限,直接读取
                    getContacts();
                }
            }
        });
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == 100 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            getContacts();
        }else {
            finish();
        }
    }

    private void getContacts() {
        //获取内容解析者
        ContentResolver contentResolver = getContentResolver();
        Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
        Cursor cursor = contentResolver.query(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));

                Toast.makeText(this, name + "---" + number, Toast.LENGTH_SHORT).show();
                Contacts contact = new Contacts(name, number);
                contacts.add(contact);
            }
            cursor.close();
        }

    }
}

2.获取手机短信信息

整体实现思路一样,不同的是Uri和权限,还有内容解析者获取游标的字段
权限

<uses-permission android:name="android.permission.READ_SMS" />

整体代码

public class Main2Activity extends AppCompatActivity {
    private Button butRead2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);

        initViews();
    }

    private void initViews() {
        butRead2 = (Button) findViewById(R.id.but_read2);

        butRead2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                //动态获取读短信的权限
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    requestPermissions(new String[]{Manifest.permission.READ_SMS}, 100);
                } else {
                    getSms();
                }
            }
        });
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == 100 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {//获取成功
            getSms();
        } else {
            finish();
        }
    }

    private void getSms() {
        Uri uri = Telephony.Sms.CONTENT_URI;
        ContentResolver contentResolver = getContentResolver();
        Cursor cursor = contentResolver.query(uri, null, null, null, null);
        if (cursor != null) {
           while (cursor.moveToNext()){
               String address = cursor.getString(cursor.getColumnIndex(Telephony.Sms.ADDRESS));//地址
               String body = cursor.getString(cursor.getColumnIndex(Telephony.Sms.BODY));//内容

               Toast.makeText(this, address + "---" + body, Toast.LENGTH_SHORT).show();
           }
            cursor.close();

        }
    }
}

3.获取手机音频信息

整体思路一样,只不过权限注意需要SD卡的读写权限,以及字段名不同

SD卡的读写权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

整体代码

public class Main3Activity extends AppCompatActivity {

    private Button butRead3;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main3);

        initViews();
    }


    private void initViews() {
        butRead3 = (Button) findViewById(R.id.but_read3);

        butRead3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //动态获取读音频的权限
                //因为音频在SD卡中存储 所以需要获取SD卡的权限
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}, 100);
                } else {
                    getMusic();
                }
            }
        });
    }

    private void getMusic() {
        //音频的Uri
        Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
        ContentResolver contentResolver = getContentResolver();
        Cursor cursor = contentResolver.query(uri, null, null, null, null);
        if (cursor != null) {
            while (cursor.moveToNext()) {
                String title = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE));//音频名
                String artist = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST));//作者
                String duration = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DURATION));//总时长
                String data = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA));//地址
                String size = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.SIZE));//大小
                String id = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM_ID));//封面id


                Toast.makeText(this, title + artist + duration + data + size + id, Toast.LENGTH_SHORT).show();
            }
            cursor.close();

        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == 100 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            //获取权限成功
            getMusic();
        } else {
            finish();
        }
    }
}

4.获取手机图片信息

权限同上,字段名不同
整体代码

public class Main4Activity extends AppCompatActivity {
    private Button butRead4;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main4);

        initViews();
    }

    private void initViews() {
        butRead4 = (Button) findViewById(R.id.but_read4);
        butRead4.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //动态获取读图片的权限
                //需要获取SD卡的权限
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}, 100);
                } else {
                    getImg();
                }
            }
        });
    }

    private void getImg() {
        //图片的Uri
        Uri uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
        ContentResolver contentResolver = getContentResolver();
        Cursor cursor = contentResolver.query(uri, null, null, null, null);
        if (cursor != null) {
            while (cursor.moveToNext()) {
                String title = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.TITLE));//图片名称
                String size = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.SIZE));//大小
                String data = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));//地址
                String hight = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.HEIGHT));//高
                String width = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.WIDTH));//宽


                Toast.makeText(this, title + hight + width + data + size, Toast.LENGTH_SHORT).show();
            }
            cursor.close();

        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == 100 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            //获取权限成功
            getImg();
        } else {
            finish();
        }
    }
}

5.获取手机视频信息

需要的权限同上

整体代码

public class Main5Activity extends AppCompatActivity {
    private Button butRead5;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main5);

        initViews();
    }

    private void initViews() {
        butRead5 = (Button) findViewById(R.id.but_read5);
        butRead5.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //动态获取读视频的权限
                //需要获取SD卡的权限
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}, 100);
                } else {
                    getVideo();
                }
            }
        });
    }

    private void getVideo() {
        //视频的Uri
        Uri uri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
        ContentResolver contentResolver = getContentResolver();
        Cursor cursor = contentResolver.query(uri, null, null, null, null);
        if (cursor != null) {
            while (cursor.moveToNext()) {
                String title = cursor.getString(cursor.getColumnIndex(MediaStore.Video.Media.TITLE));//视频名
                String artist = cursor.getString(cursor.getColumnIndex(MediaStore.Video.Media.ARTIST));//作者
                String duration = cursor.getString(cursor.getColumnIndex(MediaStore.Video.Media.DURATION));//总时长
                String data = cursor.getString(cursor.getColumnIndex(MediaStore.Video.Media.DATA));//地址
                String size = cursor.getString(cursor.getColumnIndex(MediaStore.Video.Media.SIZE));//大小


                Toast.makeText(this, title + artist + duration + data + size, Toast.LENGTH_SHORT).show();
            }
            cursor.close();
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == 100 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            //获取权限成功
            getVideo();
        } else {
            finish();
        }
    }
}

二.小案例

实现当手机收到新的短信时,读取出来

在这里需要借助内容观察者

1.ContentObserver简介

ContentObserver——内容观察者,目的是观察(捕捉)特定Uri引起的数据库的变化,继而做一些相应的处理

2.实现思路

思路:

  1. 创建一个观察者
  2. 观察者一直监视短信状态
  3. 如果发现短信有变化,就执行相应操作

3.代码

首先创建内容观察者
需要自定义类去继承ContentObserver
然后重写onChange()方法和构造方法

public class MyObserver extends ContentObserver {
    /**
     * Creates a content observer.
     *
     * @param handler The handler to run {@link #onChange} on, or null if none.
     */

    private Handler handler;
    private Context context;

    public MyObserver(Handler handler, Context context) {
        super(handler);
        this.context = context;
        this.handler = handler;
    }

    @Override
    public void onChange(boolean selfChange) {
        super.onChange(selfChange);
        ContentResolver contentResolver = context.getContentResolver();
        Uri uri = Telephony.Sms.CONTENT_URI;
        Cursor cursor = contentResolver.query(uri, null, null, null, null);
        if (cursor != null) {
            cursor.moveToFirst();
            String body = cursor.getString(cursor.getColumnIndex(Telephony.Sms.BODY));
            Message message = new Message();
            message.obj = body;
            handler.sendMessage(message);
        }
        cursor.close();
    }
}

在Activity中
创建自定义的观察者对象
通过调用contentResolverregisterContentObserver方法注册观察者
记得在onDestroy方法中解除注册

public class YzmActivity extends AppCompatActivity {
    private EditText etShow;
    private MyObserver myObserver;
    private ContentResolver contentResolver;
    private Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            String mess = (String) msg.obj;
            etShow.setText(mess);
        }
    };


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_yzm);

        initViews();
    }

    private void initViews() {
        etShow = (EditText) findViewById(R.id.et_show);
        //获取内容解析者
        contentResolver = getContentResolver();
        //创建观察者
        myObserver = new MyObserver(handler,this);
        //短信的Uri
        Uri uri = Telephony.Sms.CONTENT_URI;
        //注册观察者
        contentResolver.registerContentObserver(uri,true,myObserver);


    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        contentResolver.unregisterContentObserver(myObserver);
    }
}

效果展示
在这里插入图片描述
要开心加油

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值