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.实现思路
思路:
- 创建一个观察者
- 观察者一直监视短信状态
- 如果发现短信有变化,就执行相应操作
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中
创建自定义的观察者对象
通过调用contentResolver的registerContentObserver方法注册观察者
记得在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);
}
}
效果展示
要开心加油