一.ContentProvider介绍:
1.ContentProvider内容提供者(四大组件之一)主要用于在不同的应用程序之间实现数据共享的功能。
2.技能get点:
(1)访问系统自带的内容提供者(******)
手机联系人/音频/视频/图库/短信/系统设置
(2)自己写内容提供者
3.注意:
二.原理图
三.一系列权限
<!-- 短信的权限 -->
<uses-permission android:name="android.permission.WRITE_SMS"/>
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
<uses-permission android:name="android.permission.READ_SMS"/>
<!-- 手机联系人权限 -->
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.WRITE_CONTACTS"/>
<!-- 读写SD卡的全选 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<!-- 通讯录权限 -->
<uses-permission android:name="android.permission.READ_CALL_LOG"/>
<uses-permission android:name="android.permission.WRITE_CALL_LOG"/>
<uses-permission android:name="android.permission.INTERNET"/>
四.动态获取权限
//权限数组
String[] strings = new String[]{Manifest.permission.INTERNET,Manifest.permission.READ_SMS,
Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_CALL_LOG,Manifest.permission.WRITE_CALL_LOG,
Manifest.permission.READ_CONTACTS,Manifest.permission.WRITE_CONTACTS,
Manifest.permission.RECEIVE_SMS};
//TODO 1: 判断手机安卓版本 安卓6.0以后SDK版本都是23
if(Build.VERSION.SDK_INT>=23){
//TODO 2: 判断权限是否授权过
for (int i=0;i<strings.length;i++){
int permission = ActivityCompat.checkSelfPermission(this, strings[i]);
//TODO 3:判断结果 授权:PERMISSION_GRANTED 没有授权:PERMISSION_DENIED
if(permission == PackageManager.PERMISSION_DENIED){
requestPermissions(strings,101);
break;
}
}
}
五.自定义内容提供者
一.什么是自定义内容提供者
谈到内容提供者,大家就应该想到提供方和索要方,之前我们获取手机联系人,提供方是系统APP本身,索要方是我们;现在,我们想要做提供方,别人来访问我们的数据库,那我们就需要自定义内容提供者了。
自定义内容提供者思路
1.提供方:ContentProvider
(1)创建数据库,自定义类继承SQLiteOpenHelper
(2)自定义内容提供者类,继承ContentProvider,重写insert/delete/update/query方法,向外界提供方法
(3)清单文件中注册内容提供者
2.索要方:ContentResolver
(1)通过Context的getContentResolver方法获得ContentResolver对象
(2)确定uri
(3)调用insert/delete/update/query方法访问数据库
创建提供者代码
(1)自定义类继承SQLiteOpenHelper
public class MyHelper extends SQLiteOpenHelper {
public MyHelper(Context context) {
super(context, "my_provider.db", null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table student(id integer primary key autoincrement,name varchar(20),age integer)");
for(int i=0;i<50;i++){
ContentValues values = new ContentValues();
values.put("name","张"+i);
values.put("age",i);
db.insert("student",null,values);
}
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
(2)自定义内容提供者类,继承ContentProvider
public class MyProvider extends ContentProvider {
SQLiteDatabase database;
static final String TABLE_NAME="student";
//创建
@Override
public boolean onCreate() {
MyHelper myHelper = new MyHelper(getContext());
database = myHelper.getWritableDatabase();
if(database==null){
return false;
}else{
return true;
}
}
//查询
@Override
public Cursor query( Uri uri, String[] projection, String selection,String[] selectionArgs,String sortOrder) {
Cursor query = database.query(TABLE_NAME, projection, selection, selectionArgs, null, null, sortOrder);
return query;
}
@Override
public String getType(Uri uri) {
return null;
}
//增加
@Override
public Uri insert(Uri uri,ContentValues values) {
database.insert(TABLE_NAME,null,values);
return uri;
}
//删除
@Override
public int delete( Uri uri,String selection,String[] selectionArgs) {
return database.delete(TABLE_NAME,selection,selectionArgs);
}
//修改
@Override
public int update( Uri uri, ContentValues values, String selection, String[] selectionArgs) {
return database.update(TABLE_NAME,values,selection,selectionArgs);
}
}
(3)清单文件中注册内容提供者
<provider
android:exported="true"
android:authorities="com.xh.day8"
android:name=".MyProvider"/>
内容索要方代码
(1)获取ContentResolver直接获取
确定Uri:conten://com.bawei 前面一定要加conten://
uri=Uri.parse("content://com.bawei");
contentResolver=getContentResolver();