第10天ContentProvider内容提供者
A:ContentProvider
一.ContentProvider介绍:
1.ContentProvider内容提供者(四大组件之一)主要用于在不同的应用程序之间实现数据共享的功能。
2.技能get点:
(1)访问系统自带的内容提供者(******)
手机联系人/音频/视频/图库/短信/
(2)自己写内容提供者
3.注意:
二.原理图
三.获取手机中的音乐,展现在ListView中
1.读写SD卡权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
2.代码实现
(1)实体类
/***
MediaStore.Audio.Media.TITLE, 歌名
MediaStore.Audio.Media.ARTIST, 歌手
MediaStore.Audio.Media.DURATION, 总时长
MediaStore.Audio.Media.DATA, 地址
MediaStore.Audio.Media.SIZE, 大小
MediaStore.Audio.Media.ALBUM_ID, 专辑封面的id
*/
public class SongEntity {
private String title;
private String artist;
private String duration;
private String data;
private String size;
private String album;//专辑
public SongEntity(String title, String artist, String duration, String data, String size, String album) {
this.title = title;
this.artist = artist;
this.duration = duration;
this.data = data;
this.size = size;
this.album = album;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getArtist() {
return artist;
}
public void setArtist(String artist) {
this.artist = artist;
}
public String getDuration() {
return duration;
}
public void setDuration(String duration) {
this.duration = duration;
}
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
public String getSize() {
return size;
}
public void setSize(String size) {
this.size = size;
}
public String getAlbum() {
return album;
}
public void setAlbum(String album) {
this.album = album;
}
@Override
public String toString() {
return "SongEntity{" +
"title='" + title + '\'' +
", artist='" + artist + '\'' +
", duration='" + duration + '\'' +
", data='" + data + '\'' +
", size='" + size + '\'' +
", album='" + album + '\'' +
'}';
}
}
(2)工具类获得
public class MusicUtils {
/***
* 获得手机中所有的音乐
* @return
*/
public static List<SongEntity> getSongs(Context context){
List<SongEntity> list = new ArrayList<>();
//TODO 1:获得ConetentResovler对象 context的方法
ContentResolver resolver = context.getContentResolver();
//TODO 2:查询
Cursor cursor = resolver.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null, null);
//TODO 3:获得数据
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 album_id = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM_ID));
//根据id获得专辑的图片uri 封面字段:album_art
Cursor cursor1 = resolver.query(Uri.parse("content://media/external/audio/albums/"+album_id),null,null,null,null);
if(cursor1 != null){
while (cursor1.moveToNext()){
String album = cursor1.getString(cursor1.getColumnIndex("album_art"));
list.add(new SongEntity(title,artist,duration,data,size,album));
}
}
}
}
cursor.close();//关闭游标
return list;
}
}
3.播放音乐
/***
* contentprovider:内容提供者
*/
public class MainActivity extends AppCompatActivity {
private ListView listView;
private SongAdapter songAdapter;
private List<SongEntity> list;
private MediaPlayer mediaPlayer = new MediaPlayer();//音乐/视频
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
requestPermissions(new String[]{
"android.permission.WRITE_EXTERNAL_STORAGE",
"android.permission.READ_EXTERNAL_STORAGE"
},101);
}
}
//播放音乐
public void play(int position){
if(mediaPlayer != null){
try {
mediaPlayer.reset();//重置资源
mediaPlayer.setDataSource(list.get(position).getData());//设置媒体资源
mediaPlayer.prepareAsync();//异步准备
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mediaPlayer.start();//播放
}
});//准备完成 播放
} catch (IOException e) {
e.printStackTrace();
}
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if(requestCode == 101){
int grantResult = grantResults[0];
if(grantResult == PackageManager.PERMISSION_GRANTED){//权限收于成功
listView = findViewById(R.id.lv);
list = MusicUtils.getSongs(this);
songAdapter = new SongAdapter(list,this);
listView.setAdapter(songAdapter);
//设置item的点击
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
play(position);
}
});
}
}
}
}
四.获取手机联系人,展现在ListView中
1.添加获取手机联系人的权限
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.WRITE_CONTACTS"/>
2.添加获取手机联系人的权限
//获取手机联系人
public void click1(View view) {
//TODO 1:获得ContentResolver
ContentResolver resolver = getContentResolver();
//TODO 2:确定uri和要查询的字段
Uri uri= ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
String[] strs={ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,ContactsContract.CommonDataKinds.Phone.NUMBER};
//TODO 3:执行查询并将结果遍历展现在ListView中和存储到本地的数据库中
Cursor cursor=resolver.query(uri,strs,null,null,null);
ArrayList<Phone> list=new ArrayList<>();
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(new Phone(name,number));
//将每条记录存储到自己的数据库中
}
//将list集合中的数据展现在ListView中,此处省略
}
class Phone{
private String name;
private String number;
public Phone(String name, String number) {
this.name = name;
this.number = number;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
}
五.获取手机短信
(1)添加获取手机短信的权限
<uses-permission android:name="android.permission.READ_SMS" />
(2)获得短信内容,展现在ListView中 并将信息存储到数据库中
uri:Telephony.Sms.CONTENT_URI
字段:Telephony.Sms.ADDRESS 地址 Telephony.Sms.BODY 内容
//获取短信
@RequiresApi(api = Build.VERSION_CODES.KITKAT)
public void click2(View view) {
ContentResolver resolver = getContentResolver();
Uri uri= Telephony.Sms.CONTENT_URI;
String[] strs={Telephony.Sms.BODY,Telephony.Sms.ADDRESS};
Cursor cursor=resolver.query(uri,strs,null,null,null);
//第一种ListView 中 第二种 :存到数据库
ArrayList<Msm> list=new ArrayList<>();
while(cursor.moveToNext()){
String address=cursor.getString(cursor.getColumnIndex(Telephony.Sms.ADDRESS));
String body=cursor.getString(cursor.getColumnIndex(Telephony.Sms.BODY));
list.add(new Msm(address,body));
//执行insert语句
}
}
class Msm{
private String address;
private String body;
public Msm(String address, String body) {
this.address = address;
this.body = body;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getBody() {
return body;
}
public void setBody(String body) {
this.body = body;
}
}
四.获取手机所有的图片/视频
五.获得手机通话记录
。。。。