ContentProvider 内容提供者(四大组件之一)
作用:跨app提供数据
三个要素(1)内容提供者:ContentProvider (2)内容解析者 ContentResolver (3)Uri
补充:
常用权限:
<!--读写联系人-->
<uses-permission android:name="android.permission.READ_CONTACTS"></uses-permission>
<uses-permission android:name="android.permission.WRITE_CONTACTS"></uses-permission>
<!--读写SD卡-->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<!--读写短信-->
<uses-permission android:name="android.permission.READ_SMS"></uses-permission>
<uses-permission android:name="android.permission.WRITE_SMS"></uses-permission>
<!--读写通话记录-->
<uses-permission android:name="android.permission.READ_CALL_LOG"></uses-permission>
<uses-permission android:name="android.permission.WRITE_CALL_LOG"></uses-permission>
<!--网络权限-->
<uses-permission android:name="android.permission.INTERNET"/>
常用Uri:
1.获取音频: (1)uri:MediaStore.Audio.Media.EXTERNAL_CONTENT_URI (2)字段:TITLE:歌名 ARTIST 歌手 DURATION 总时长 DATA 地址
String[] strs= new String[]{MediaStore.Audio.Media.TITLE , MediaStore.Audio.Media.ARTIST , MediaStore.Audio.Media.DURATION , MediaStore.Audio.Media.DATA};
2.获取视频: (1)uri:MediaStore.Video.Media.EXTERNAL_CONTENT_URI (2)字段:TITLE:歌名 ARTIST 歌手 DURATION 总时长 DATA 地址
String[] strs= new String[]{MediaStore.Video.Media.TITLE , MediaStore.Video.Media.ARTIST , MediaStore.Video.Media.DURATION , MediaStore.Video.Media.DATA};
3.获取图库: (1)uri:MediaStore.Images.Media.EXTERNAL_CONTENT_URI (2)字段:
MediaStore.Images.Media.TITLE;图片名称
MediaStore.Images.Media.SIZE;大小
MediaStore.Images.Media.DATA;地址
4.获取联系人: (1)uri:ContactsContract.CommonDataKinds.Phone.CONTENT_URI (2)字段:Phone.DISPLAY_NAME:姓名 NUMBER:电话 String[] strs= new
String[]{ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME , ContactsContract.CommonDataKinds.Phone.NUMBER};
5.获取短信: (1)uriTelephony.Sms.CONTENT_URI (2)字段:ADDRESS 地址 BODY 内容 String[] strs= new
String[]{Telephony.Sms.ADDRESS , Telephony.Sms.BODY};
备注:1 2 3 读sd卡的权限 4 读联系人的权限 5 读短信的权限
6.通话记录:(1)uri:CallLog.Calls.CONTENT_URI
(2)字段:NUMBER:电话号码 DATE:时间 毫秒 DURATION:总时长 秒 TYPE 类型
使用
/**
* 获取联系人:
* 权限:<uses-permission android:name="android.permission.READ_CONTACTS"/>
* (1)uri:ContactsContract.CommonDataKinds.Phone.CONTENT_URI
* (2)字段:Phone.DISPLAY_NAME:姓名 NUMBER:电话
* */
public void person(){
//TODO 1:获得内容解析对象
ContentResolver contentResolver = getContentResolver();
//TODO 2:确定Uri
Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
//TODO 3:查询
//参数1 uri,参数2:要查询字段的数组 ,参数3:条件 ,参数4:为条件中的占位符赋值 参数5:排序
Cursor cursor = contentResolver.query(uri, null, null, null, null);
//TODO 4:遍历
while(cursor.moveToNext()){
//名字和电话号码
String name = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
String number = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
}
}
public class MainActivity extends AppCompatActivity {
Button btn1,btn2,btn3,btn4;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn1 = findViewById(R.id.person);
btn2 = findViewById(R.id.picture);
btn3 = findViewById(R.id.video);
btn4 = findViewById(R.id.audio);
btn1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
person();
}
});
btn2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
picture();
}
});
btn3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
video();
}
});
btn4.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
audio();
}
});
}
private void audio() {
ContentResolver contentResolver = getContentResolver();
Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
Cursor cursor = contentResolver.query(uri, null, null, null, null);
while (cursor.moveToNext()){
String title = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE));
String singer = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST));
String location = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA));
Long size = cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media.DURATION));
Toast.makeText(this, title+":"+singer+":"+location+":"+size, Toast.LENGTH_SHORT).show();
}
}
private void video() {
ContentResolver contentResolver = getContentResolver();
Uri uri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
Cursor query = contentResolver.query(uri, null, null, null, null);
while (query.moveToNext()){
String title = query.getString(query.getColumnIndex(MediaStore.Video.Media.TITLE));
String location = query.getString(query.getColumnIndex(MediaStore.Video.Media.DATA));
String singer = query.getString(query.getColumnIndex(MediaStore.Video.Media.ARTIST));
Long size = query.getLong(query.getColumnIndex(MediaStore.Video.Media.DURATION));
Toast.makeText(this, title+":"+location+":"+size+":"+singer, Toast.LENGTH_SHORT).show();
}
}
private void picture() {
ContentResolver contentResolver = getContentResolver();
Uri uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
Cursor query = contentResolver.query(uri, null, null, null, null);
while (query.moveToNext()){
String title = query.getString(query.getColumnIndex(MediaStore.Images.Media.TITLE));
String location = query.getString(query.getColumnIndex(MediaStore.Images.Media.DATA));
Long size = query.getLong(query.getColumnIndex(MediaStore.Images.Media.SIZE));
Toast.makeText(this, title+":"+location+":"+size, Toast.LENGTH_SHORT).show();
}
}
public void person(){
ContentResolver contentResolver = getContentResolver();
Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
Cursor cursor = contentResolver.query(uri, null, null, null, null);
while (cursor.moveToNext()){
String name = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
String phoneNum = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
Toast.makeText(this, name+":"+phoneNum, Toast.LENGTH_SHORT).show();
}
}
}
简单视频音频播放:
public class VideActivity extends AppCompatActivity {
ImageView imageView;
VideoView videoView;
String img_path="/sdcard/Pictures/b.png";
String video_path="/sdcard/Movies/day7_使用方法增删改查.mp4";
String music_path="/sdcard/Music/老狼 - 虎口脱险.mp3";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_vide);
imageView=findViewById(R.id.iv);
videoView=findViewById(R.id.vv);
//图片
Bitmap bitmap = BitmapFactory.decodeFile(img_path);
imageView.setImageBitmap(bitmap);
//视频
//TODO 1:设置视频资源
videoView.setVideoPath(video_path);
//TODO 2:设置控制器
videoView.setMediaController(new MediaController(this));
//TODO 3:准备资源
videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {//准备完成
//TODO 3:播放
videoView.start();
}
});
//音乐:MediaPalyer
//TODO 1:创建MediaPalyer
final MediaPlayer mediaPlayer=new MediaPlayer();
//TODO 2:设置音乐资源
try {
mediaPlayer.setDataSource(music_path);
//TODO 3:准备
mediaPlayer.prepare();
//TODO 4:准备监听
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {//准备完成
mediaPlayer.start();
}
});
} catch (IOException e) {
e.printStackTrace();
}
}
}
自定义内容提供者
跨app之间操作数据
1.内容提供者
数据库:
public class MySQLite extends SQLiteOpenHelper {
public MySQLite(Context context) {
super(context, "test", null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table myTest(id Integer primary key autoincrement,name varchar(20),age Integer)");
db.execSQL("insert into myTest values (null,'张三',20)");
db.execSQL("insert into myTest values (null,'李四',19)");
db.execSQL("insert into myTest values (null,'王五',21)");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
ContentProvider类
public class MyProvider extends ContentProvider {
MySQLite mySQLite;
SQLiteDatabase database;
@Override
public boolean onCreate() {
mySQLite = new MySQLite(getContext());
database = mySQLite.getWritableDatabase();
if (database == null){
return false;
}
return true;
}
@Override
public Cursor query( Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
Cursor cursor = database.query("myTest", projection, selection, selectionArgs, null, null, sortOrder);
return cursor;
}
@Override
public String getType( Uri uri) {
return null;
}
@Override
public Uri insert( Uri uri, ContentValues values) {
long myTest = database.insert("myTest", null, values);
if (myTest > 0){
return uri;
}
return null;
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
return database.delete("myTest",selection,selectionArgs);
}
@Override
public int update( Uri uri, ContentValues values, String selection, String[] selectionArgs) {
return database.update("myTest",values,selection,selectionArgs);
}
}
清单文件注册:
<provider
android:authorities="com.test.provider"<!-- Uri -->
android:name=".MyProvider"
android:exported="true"<!-- 设置其他app可访问数据库数据 -->>
</provider>
2.内容解析者:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ContentResolver contentResolver = getContentResolver();
Uri uri = Uri.parse("content://com.test.provider");
Cursor cursor = contentResolver.query(uri, null, null, null,null);
while (cursor.moveToNext()){
int id = cursor.getInt(cursor.getColumnIndex("id"));
int age = cursor.getInt(cursor.getColumnIndex("age"));
String name = cursor.getString(cursor.getColumnIndex("name"));
Toast.makeText(this, id+":"+name+":"+age, Toast.LENGTH_SHORT).show();
}
}
}