android 自定义ContentProvider的实现
- 格式:pdf
- 大小:143.92 KB
- 文档页数:9
- ContentProvider示例一:联系人数据库在Android开发中,我们经常会需要访问设备的联系人信息。
这时就可以使用ContentProvider来提供联系人数据库的访问功能。
首先,我们需要在文件中声明READ_CONTACTS权限。
然后,我们可以通过ContentResolver类来获取联系人信息,实现对联系人数据库的访问。
我们可以通过以下步骤来实现对联系人数据库的访问:1. 首先,我们需要创建一个继承自ContentProvider的子类,例如ContactsProvider。
在ContactsProvider中,我们需要重写query、insert、update和delete方法,这些方法分别对应了查询、插入、更新和删除操作。
2. 在query方法中,我们可以构建合适的SQL语句,然后通过ContentResolver的query方法来执行查询操作,从而获取联系人信息。
3. 在insert方法中,我们可以通过ContentResolver的insert方法来执行插入操作,向联系人数据库中添加新的联系人信息。
4. 在update方法中,我们可以通过ContentResolver的update方法来执行更新操作,更新联系人数据库中的联系人信息。
5. 在delete方法中,我们可以通过ContentResolver的delete方法来执行删除操作,从联系人数据库中删除指定的联系人信息。
用中获取、添加、更新和删除联系人信息。
- ContentProvider示例二:媒体文件访问除了联系人数据库之外,我们还可以使用ContentProvider来实现对媒体文件的访问。
例如,我们可以访问设备上的音乐文件、视频文件和图片文件。
通过ContentProvider,我们可以实现对媒体文件的查询、插入、更新和删除操作。
要实现对媒体文件的访问功能,我们可以按照以下步骤进行操作:1. 首先,我们需要创建一个继承自ContentProvider的子类,例如MediaProvider。
利用 ContentProvider 进行跨应用数据共享近年来,随着移动应用的快速发展,越来越多的用户在使用不同的应用程序进行各种操作。
然而,由于每个应用都有自己的数据存储机制,造成了数据孤岛的问题。
为了解决这一问题,Android 提供了ContentProvider 来实现应用间的数据共享。
本文将介绍如何利用ContentProvider 进行跨应用数据共享。
一、概述ContentProvider 是 Android 系统提供的一种机制,用于实现应用程序之间的数据共享。
它可以让其他应用程序获取和修改指定应用程序的数据。
ContentProvider 的实现通常包含以下几个重要组件:1. Authority(权限):是一个唯一标识,在跨应用通信时用于区分不同的 ContentProvider。
2. URI(统一资源标识符):用于唯一标识 ContentProvider 中的数据。
3. 数据操作方法:用于对数据进行增删改查等操作。
二、创建 ContentProvider要创建一个 ContentProvider,需要遵循以下步骤:1. 创建一个继承自 ContentProvider 的子类,并重写相关方法,如onCreate、query、insert 等。
2. 在 AndroidManifest.xml 文件中声明 ContentProvider,指定Authority 和对应的类名。
三、实现跨应用数据共享要实现跨应用数据共享,首先需要确保提供方(数据源应用)已经创建了 ContentProvider,并且在 AndroidManifest.xml 中声明了相应的权限和 URI。
接下来,使用获取 ContentResolver 的方式来访问 ContentProvider 提供的数据。
具体步骤如下:1. 获取 ContentResolver 实例:```ContentResolver resolver = getContentResolver();```2. 定义查询的 URI:```Uri uri = Uri.parse("content://authority/data");```3. 执行查询操作:```Cursor cursor = resolver.query(uri, null, null, null, null);```4. 处理查询结果:```if (cursor != null && cursor.moveToFirst()) {do {String data = cursor.getString(cursor.getColumnIndex("data"));// 处理数据} while (cursor.moveToNext());}```四、权限控制和数据访问为了保证数据的安全性,ContentProvider 还提供了权限控制和数据访问限制的机制。
Android使⽤ContentProvider初始化SDK库⽅案总结做Android SDK开发的时候,⼀般我们会将初始化的⽅法封装为,然后让调⽤SDK的开发者在Application的onCreate⽅法中进⾏初始化。
但是⽬前⼀些主流的SDK框架,并没有提供相关的⽅法进⾏初始化,但是我们在使⽤的时候也能正常使⽤,通过挖掘其源码,可以看出来他们⼀般使⽤的ContentProvider来进⾏SDK的初始化的,⽬前使⽤ContentProvider的知名SDK有:ButterKnife、Leakcanary、BlockCanary...等等。
这⾥补充⼀个概念,SDK初始化的本质是什么?SDK初始化的本质是将App的上下⽂(Context)注⼊到SDK中,使其能通过这个上下⽂访问到App的资源与服务。
也包括在初始化时调⽤SDK⽅法进⾏相关选项的⾃定义配置。
⼀、ContentProvider初始化SDK库的实现要实现在ContentProvider初始化SDK库,⾸先要在库中创建⼀个 ContentProvider,然后在 ContentProvider 的 onCreate() ⽅法中借助getContext() 返回的 Context 来完成你的库初始化,当然,这个 Context 的实际类型就是应⽤的 Application。
下⾯是通过ContentProvider实现SDK库初始化的⽰例代码:class ToolContentProvider : ContentProvider() {override fun onCreate(): Boolean {Log.e(GlobalConfig.LOG_TAG, "ToolContentProvider onCreate")AppContextHelper.init(context!!.applicationContext)AppContextHelper.initRoomDB(context!!.applicationContext)return true}override fun query(uri: Uri, projection: Array<out String>?, selection: String?, selectionArgs: Array<out String>?, sortOrder: String?): Cursor? {return null}override fun getType(uri: Uri): String? {return null}override fun insert(uri: Uri, values: ContentValues?): Uri? {return null}override fun delete(uri: Uri, selection: String?, selectionArgs: Array<out String>?): Int {return 0}override fun update(uri: Uri, values: ContentValues?, selection: String?, selectionArgs: Array<out String>?): Int {return 0}}<providerandroid:name=".ToolContentProvider"android:authorities="${applicationId}.library-tool"android:exported="false" />class MaoApplication : Application() {private lateinit var currentActivityRef: WeakReference<Activity>;override fun attachBaseContext(base: Context?) {super.attachBaseContext(base)Log.e(GlobalConfig.LOG_TAG, "MaoApplication attachBaseContext")}override fun onCreate() {super.onCreate()Log.e(GlobalConfig.LOG_TAG, "MaoApplication onCreate")initMMKV()initCodeView()}/*** 初始化MMKV⼯具*/private fun initMMKV() {Log.e(GlobalConfig.LOG_TAG, "init MMKV")MMKV.initialize(this);}private fun initCodeView() {CodeProcessor.init(this)}}通过ContentProvider实现SDK库初始化的功能实现了,那么 ContentProvider 的 onCreate() ⽅法是什么时候被调⽤的呢?下⾯是⽇志输出,来帮助助我们理解初始化时机:com.renhui.maomaomedia E/MaoMaoMedia: MaoApplication attachBaseContextcom.renhui.maomaomedia E/MaoMaoMedia: ToolContentProvider onCreatecom.renhui.maomaomedia E/MaoMaoMedia: MaoApplication onCreate可以看到,它是介于 Application 的 attachBaseContext(Context) 和 onCreate() 之间所调⽤的,Application 的 attachBaseContext(Context)⽅法被调⽤这就意味着 Application 的 Context 被初始化了。
ContentProvider的工作原理什么是ContentProviderContentProvider是Android中的一个组件,用于实现数据共享和数据访问的机制。
它允许一个应用程序将其数据暴露给其他应用程序,从而实现不同应用之间的数据共享和交互。
ContentProvider可以提供对结构化数据的访问,例如数据库中的表格,也可以提供对非结构化数据的访问,例如文件系统中的文件。
ContentProvider的作用ContentProvider主要有以下几个作用:1.数据共享:ContentProvider可以将一个应用程序的数据暴露给其他应用程序,从而实现数据的共享和交互。
其他应用程序可以通过ContentProvider访问和操作这些数据,而无需了解数据的具体存储方式和实现细节。
2.数据访问:ContentProvider提供了一种标准的接口,其他应用程序可以通过这个接口来访问和操作数据。
这样可以实现数据的统一管理,避免了重复的数据访问和操作代码。
3.数据保护:ContentProvider可以对数据进行权限控制,只有具有相应权限的应用程序才能访问和操作数据。
这样可以保护数据的安全性和私密性。
ContentProvider的工作原理ContentProvider的工作原理可以分为以下几个步骤:1. 注册ContentProvider在AndroidManifest.xml文件中,需要为ContentProvider注册一个相应的标签。
这个标签中需要指定ContentProvider的类名、权限等信息。
<providerandroid:name=".MyContentProvider"android:authorities="com.example.myapp.provider"android:exported="true" />2. 实现ContentProvider创建一个类来实现ContentProvider,并重写相应的方法。
28215.2 Content Provider常用操作Android系统为常用数据类型提供了很多预定义的Content Provider(声音、视频、图片、联系人等),它们大都位于android.provider包中。
开发人员可以查询这些provider以获得其中包含的信息(尽管有些需要适当的权限来读取数据)。
Android系统提供的常见Content Provider如下。
Browser:读取或修改书签、浏览历史或网络搜索。
CallLog:查看或更新通话历史。
Contacts:获取、修改或保存联系人信息。
LiveFolders:由Content Provider提供内容的特定文件夹。
MediaStore:访问声音、视频和图片。
Setting:查看和获取蓝牙设置、铃声和其他设备偏好。
SearchRecentSuggestions:能被配置以使用查找意见provider操作。
SyncStateContract:用于使用数据数组账号关联数据的Content Provider约束。
希望使用标准方式保存数据的provider可以使用它。
UserDictionary:在可预测文本输入时,提供用户定义单词给输入法使用。
应用程序和输入法能增加数据到该字典。
单词能关联频率信息和本地化信息。
15.2.1 查询数据开发人员需要下面3条信息才能查询Content Provider中的数据。
标识该Content Provider的URI。
需要查询的数据字段名称。
字段中数据的类型。
如果查询特定的记录,还需要提供该记录的_ID值。
为了查询Content Provider中的数据,开发人员需要使用ContentResolver.query()或Activity.managedQuery()方法。
这两个方法使用相同的参数,并且都返回Cursor对象。
然而,managedQuery()方法导致Activity管理Cursor的生命周期。
Android四大组件的ContentProvider实例——获取联系人1.ContentProvider简述ContenttProvider(以下简称CP)是为了获取不同应用之间的数据而诞生的组件,并且官方为常见的一些数据提供了默认的CP。
例如,联系人、短信等。
CP的几点关键:Uri:是CP的标志符,是识别CP的唯一方式。
ContentResolver:对CP进行操作的类。
权限:有时候操作一些地方需要一些权限。
2.获取联系人实现思路3.具体实现3.1 申请权限android6.0不仅要在AndroidManifest.xml中静态申请,还需要在代码中进行动态申请。
静态申请在AndroidManifest.xml中进行申请。
<manifest ...><uses-permissionandroid:name="android.permission.READ_CONTACTS" /></manifest>动态申请动态申请的流程为:发起申请和申请结果。
发起申请:主要使用requestPermissions(permission名字的数组,整型的自定义reques code)方法注:什么时候进行动态申请呢?版本大于等于6.0且当前页面没有这个权限。
request code 为自定义数值,例子中我定义了一个常量int--PERMISSIONS_REQUEST_READ_CONTACTS,这个是为了在查看申请结果时判定用的。
private void showContacts() {//检验是否版本大于6.0,当前页面是否有这个权限if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M &&checkSelfPermission(Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {//发起申请requestPermissions(newString[]{Manifest.permission.READ_CONTACTS}, PERMISSIONS_REQUEST_READ_CONTACTS);} else {//低版本直接运行,跳过动态申请。
使用contentprovider 分享数据的步骤使用ContentProvider分享数据的步骤ContentProvider是Android中用于管理与其他应用程序共享数据的组件。
它提供了一种标准化的方式,让应用程序能够安全地发布和获取数据,而无需直接访问底层数据源。
以下是使用ContentProvider分享数据的一般步骤:1.设计数据结构和数据库模式:在开始使用ContentProvider之前,首先需要设计数据结构和确定数据库模式。
这包括确定数据表、字段以及数据表之间的关系。
在设计数据库时,应考虑到需要与其他应用程序共享的数据类型和关联。
2.创建ContentProvider类:创建一个类继承自Android提供的ContentProvider基类。
该类负责管理数据的发布和获取,它必须实现一组标准的CRUD(Create, Read, Update, Delete)方法,以便其他应用程序可以执行数据操作。
3.定义URI:URI(Uniform Resource Identifier)用于标识要操作的数据资源。
在ContentProvider中,URI通常由以下几个部分组成:authority、path和optional ID。
authority是ContentProvider的唯一标识符,path用于指定资源的类型,optional ID是可选的资源ID。
根据具体需求,可以定义多个URI 以满足不同的操作。
4.实现CRUD方法:根据设计的数据结构和数据库模式,实现ContentProvider 中的CRUD方法。
这些方法包括insert、query、update和delete,分别对应数据的插入、查询、更新和删除操作。
可以根据不同的URI来处理不同的数据操作。
5.注册ContentProvider:在AndroidManifest.xml文件中注册ContentProvider。
在<application>标签下添加<provider>标签,并设置ContentProvider的authority属性以及其他属性,如读写权限等。
contentprovide用法ContentProvide是Android平台上的一个组件,用于为应用程序提供数据访问的能力。
在本文中,将逐步回答关于ContentProvide的使用方法。
第一步:了解ContentProvider的基本概念和作用ContentProvider是Android中提供数据访问的组件之一,它允许应用程序共享和访问数据,从而实现多个应用程序之间的数据共享。
ContentProvider提供了一种标准化的方式来访问和管理数据,使得应用程序可以通过URI(Uniform Resource Identifier)来查询、插入、更新和删除数据。
第二步:创建一个ContentProvider类要使用ContentProvider,首先需要创建一个继承自android.content.ContentProvider类的自定义ContentProvider类。
这个类负责处理数据的访问请求,并提供数据给其他应用程序。
第三步:实现ContentProvider的必要方法自定义ContentProvider类需要实现以下几个重要的方法:- onCreate():在ContentProvider被创建时调用,用于初始化一些资源和数据库的连接。
- query():用于处理查询数据库的请求,并返回查询结果。
- insert():用于处理向数据库中插入数据的请求,并返回插入的URI。
- update():用于处理更新数据库的请求,并返回更新的行数。
- delete():用于处理删除数据库记录的请求,并返回删除的行数。
- getType():根据URI返回相应的数据类型。
第四步:在AndroidManifest.xml文件中注册ContentProvider在使用ContentProvider之前,需要在AndroidManifest.xml文件中对其进行注册。
使用<provider>元素进行注册,指定自定义ContentProvider类的名称、权限和数据访问URI。
android 自定义ContentProvider的实现: 1.定义一个MainActivity.java package com.amaker.ch10.app;
import com.amaker.ch10.app.Employees.Employee; import android.app.Activity; import android.content.ContentUris; import android.content.ContentValues; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.util.Log;
public class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Insert(); query(); update(); query(); del(); query(); }
private void del() { Uri uri=ContentUris.withAppendedId(Employee.CONTENT_URI, 1); getContentResolver().delete(uri, null, null);
} private void update() { Uri uri=ContentUris.withAppendedId(Employee.CONTENT_URI, 1); ContentValues values=new ContentValues(); values.put(Employee.NAME, "hz.guo"); values.put(Employee.GENDER, "male"); values.put(Employee.AGE, 31); getContentResolver().update(uri, values, null, null); }
private void query() { String []projection=new String[]{ Employee._ID, Employee.NAME, Employee.GENDER, Employee.AGE };
Cursor cursor=managedQuery(Employee.CONTENT_URI, projection, null, null, Employee.DEFAULT_SORT_ORDER); if(cursor.moveToFirst()){ for(int i=0;i cursor.moveToPosition(i); String name=cursor.getString(1); String gender=cursor.getString(2); String age =cursor.getString(3); Log.i("emp", name+":"+gender+":"+age); } } }
private void Insert() { ContentValues values =new ContentValues(); values.put(Employee.NAME, "amaker"); values.put(Employee.GENDER, "male"); values.put(Employee.AGE, 30); getContentResolver().insert(Employee.CONTENT_URI,values); } } 2.修改AndroidManifest.xml package="com.amaker.ch10.app" android:versionCode="1" android:versionName="1.0" >
android:icon="@drawable/ic_launcher" android:label="@string/app_name" > android:name=".MainActivity" android:label="@string/app_name" >
android:authorities="com.amaker.provider.Employees"/>
3.定义一个DBHelper.java package com.amaker.ch10.app;
import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; public class DBHelper extends SQLiteOpenHelper { private static final String DATEBASE_NAME="Employee.db"; private static final int DATEBASE_VERSION=1; public static final String EMPLOYEES_TABLE_NAME="employee";
public DBHelper(Context context) { super(context, DATEBASE_NAME, null, DATEBASE_VERSION); }
@Override public void onCreate(SQLiteDatabase db) { db.execSQL("CREATE TABLE "+EMPLOYEES_TABLE_NAME+"(" +Employees.Employee._ID+" INTEGER PRIMARY KEY," +Employees.Employee.NAME+" TEXT," +Employees.Employee.GENDER+" TEXT," +Employees.Employee.AGE+" INTEGER" +");"); }
@Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("DROP TABLE IF EXISTS employee"); onCreate(db); }
} 4.定义一个javabean类Employees.java package com.amaker.ch10.app;
import android.net.Uri; import android.provider.BaseColumns;
public final class Employees { public static final String AUTHORITY="com.amaker.provider.Employees"; public Employees(){} public static final class Employee implements BaseColumns{ private Employee(){} public static final Uri CONTENT_URI=Uri.parse("content://"+AUTHORITY+"/employee"); public static final String CONTENT_TYPE="vnd.android.cursor.dir/vnd.amaker.employees"; public static final String CONTENT_ITEM_TYPE_STRING="vnd.android.cursor.item/vnd.amaker.employees"; public static final String DEFAULT_SORT_ORDER="name DESC"; public static final String NAME="name"; public static final String GENDER="gender"; public static final String AGE="age"; } }
5.定义一个内容提供者类EmployeeProvider.java package com.amaker.ch10.app;
import java.util.HashMap; import com.amaker.ch10.app.Employees.Employee; import android.content.ContentProvider; import android.content.ContentUris; import android.content.ContentValues; import android.content.UriMatcher; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteQueryBuilder; import android.net.Uri; import android.text.TextUtils; import android.util.Log;
public class EmployeeProvider extends ContentProvider { private DBHelper dbHelper; private static UriMatcher sUriMatcher=null;
private static final int EMPLOYEE=1;