外界只关心采用 CURD 来访问 ContentProvider 的数据,至于其内部数据的实现是采用文件存储还是数据库存储,外界是不感知的。...通常来说,ContentProvider 是单例的,特殊情况可以设置android:multiprocess属性来决定是不是单例:当属性值为 true 时,每个调用者进程都会存在一个 ContentProvider...因此我们说一般情况下 ContentProvider 是单例的,只在服务提供进程创建实例。 ---- 2....在通过 ContentResolver 解析数据时,URI 是必要的参数,其遵循的格式体现在ContentUris.java: Content URIs have the syntax:content:...//com.android.calendar/events 正好就是插入数据时使用的 URI。
Contacts Provider:联系人提供者,这个就不用说了,这个用得最多 Storage Access Framework(SAF):存储访问框架,4.4 API 19 以后引入的一个新玩意,为用户浏览手机中的...它是DocumentsProvider的子类,另外,document-provider的存储格式 和传统的文件存储格式一致,至于你的内容如何存储,则完全决定于你自己,Android系统已经内置了几个 这样的...3)流程图: 如上面所述,document provider data是基于传统的文件层次结构的,不过那只是对外的表现形式, 如何存储你的数据,取决于你自己,只要你对外的接口能够通过DocumentsProvider...uri 删除文件: 前提是Document.COLUMN_FLAGS包含SUPPORTS_DELETE DocumentsContract.deleteDocument(getContentResolver...Authority为包名+provider的类型名,如: com.example.android.storageprovider.documents android:exported属性的值为ture
,我们在Activity的onCreate()方法为按钮添加点击事件,点击之后调用我们自己写的一个读取联系人的方法readContrast(),在该方法中我们获取系统联系人的存放的Uri,然后通过获取的...我们可以通过新建一个类去继承ContentProvider的方式来创建一个自己的内容提供器。...注意,只有放存在VontentResolver尝试访问我们程序中的数据时,内容提供器才会被初始化。...注意只有当存在ContentResolver尝试访问 33 * 我们程序中的数据时,内容提供器才会被初始化。...你只应该在这个方法中执行快速的初始任务,并且要把数据库的创建和数据的装载延迟到提供器接收到实际的数据请求之后。
xml 处理时Dalvik会通过自带底层的本地XML Parser解析,比如XMLpull方式,这样对于内存资源占用比较好。...创建SDCard可以在Eclipse创建模拟器时随同创建,也可以使用DOS命令进行创建,如下: 在Dos窗口中进入android SDK安装路径的tools目录,输入以下命令创建一张容量为2G的SDCard...当某个值插入数据库时,SQLite 将检查它的类型。如果该类型与关联的列不匹配,则 SQLite 会尝试将该值转换成该列的类型。如果不能转换,则该值将作为其本身具有的类型存储。...外界根本看不到,也不用看到这个应用暴露的数据在应用当中是如何存储的,或者是用数据库存储还是用文件存储,还是通过网上获得,这些一切都不重要,重要的是外界可以通过这一套标准及统一的接口和程序里的数据打交道,...创建你的数据存储系统。大多数Content Provider使用Android文件系统或SQLite数据库来保持数据,但是你也可以以任何你想要的方式来存储。 4.
/开头, 比如:要得到全部person记录的Uri为content://com.ljq.provider.personprovider/person,那么返回的MIME类型字符串应该为:”vnd.android.cursor.dir...那么MIME类型字符串应该以vnd.android.cursor.item/开头, 比如:得到id为10的person记录,Uri为content://com.ljq.provider.personprovider.../person/10,那么返回的MIME类型字符串为:”vnd.android.cursor.item/person”。...尽管大部分ContentProvider操作的数据都是来自于数据库,可是有时候能够来自于文件、XML或网络等其它的存储方式。...一般来说Content是单例模式,当多个应用程序通过ContentResolver来操作ContentProvider提供的数据时。数据操作会托付给同一个ContentProvider处理。
在通过 ContentResolver 进行数据请求时(比如 contentResolver.insert(uri, contentValues);), 系统会检查指定 URI 的 authority...例如,您可以使用 BLOB 列来存储协议缓冲区或 JSON 结构。 之前反编译微信时,保存朋友圈的数据就是 BLOB 类型。...例如使用 BLOB 列来存储 JSON 创建 ContentProvider 子类,实现关键方法 ContentProvider 实例通过处理来自其他应用的请求来管理对结构化数据集的访问 所有形式的访问最终都会调用...设计数据存储 这里我们使用 SQLite 存储数据,创建一个数据库帮助类: public class DbOpenHelper extends SQLiteOpenHelper { private...在 ContentProvider 中可以通过 UriMatcher 来为不同的 URI 关联不同的 code,便于后续根据 URI 找到对应的表。
小结 ---- 简介 前面我们介绍了: 进程间通信基础介绍 通过AIDL介绍Binder的工作机制 通过 Bundle、文件共享、Messenger实现进程间通信 进程间通信的方式之AIDL...onCreate() 代表ContentProvider的创建,getType(...)...用来返回一个Uri请求所对应的 MIME类型,如果我们不关心这个可以直接返回 null 或者 */*,query(...)、insert(...)、delete(...)、update(...)...); //参数为 “content://authorities” authorities为manifest中注册的 Uri uri = Uri.parse("content...三次查询操作则运行在不同的非UI线程中。 接下来我们来完善 TestProvider 来实现访问 日程安排 的功能。 首先我们来创建保存数据用的数据库。
不同于文件存储和SharePreferences存储中的两种全局可读性操作模式,内容提供器可以选择只对那一部分数据进行共享,从而保证我们程序中的隐私数据不糊有泄漏的风险。 ...-ContentResolver ---- 对于每一个应用程序来说,如果你想要访问内容提供器当中共享的数据,就一定要借助 ContentResolver 类,可以通过Context类当中的getContentResolver...selectionArgs, 为where中的占位符提供具体的值 sortOrder); ...new ArrayAdapter(ContactsActivity.this, android.R.layout.simple_list_item_1, list);...,返回false表示失败,注意的是只有当ContentResolver尝试访问我们的数据库的时候内容提供器才会被初始化 query() 从内容提供器中查询数据,使用uri参数来确定查询哪张表
,intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, takePhoto)中,设置了拍完照照片的存放路径takePhoto,在此情况下,部分机型的...onActivityResult()中不会返回数据,即data.getData()为空,因为可以根据存放路径即可获取拍照图片。...根据Uri获取真实路径 还是因为机型适配的问题,以下提供两种方法,大家自己尝试: 方法一 public static String getRealPathFromURI(final Context context...This is useful for * MediaStore Uris, and other file-based ContentProviders....4.4后通过Uri获取路径以及文件名一种方法 public static String getRealPathFromURI(final Context context, final Uri
studio创建的时候默认自己加上去的 时要返回的代码。...code int: URI与给定组件匹配时返回的代码。必须是正数。...为获得最佳性能,调用者应遵循以下准则: 1.提供明确的投影,以防止从存储中读取不会被使用的数据。 2.使用问号参数标记,例如'phone =?'..."); int delete = getContentResolver().delete(uri2, "name=?"
Android的数据存储方式总共有五种,分别是:Shared Preferences、网络存储、文件存储、外储存储、SQLite。...而且Android为常见的一些数据提供了默认的ContentProvider(包括音频、视频、图片和通讯录等)。...2URL URL(统一资源标识符)代表要操作的数据,可以用来标识每个ContentProvider,这样你就可以通过指定的URI找到想要的ContentProvider,从中获取或修改数据。...D:指向特定的记录,这里表示操作user表id为7的记录。如果要操作user表中id为7的记录的name字段, D部分变为 /7/name即可。...Android中类型已经固定好了,不能更改,只能区别是集合还是单条具体记录,子类型可以按照格式自己填写。 在使用Intent时,会用到MIME,根据Mimetype打开符合条件的活动。
话不多说,让我们赶紧开始学习吧~ 简介 ContentProvider是Android系统中为开发者专门提供的不同应用间进行数据共享的组件,其提供了一套标准的接口用来获取以及操作数据,准许开发者把自己的应用数据根据需求开放给其他应用进行增删改查...public abstract ContentResolver getContentResolver(); 所以可以在所有继承Context的类中通过 getContentResovler() 方法获取...authorities:自定义ContentProvider的唯一标识,外部应用通过该属性值来访问我们的ContentProvider。因此该属性值必须是唯一的,建议在命名时以包名为前缀。...3 Uri 观察MyContentProvider中的几个方法,可以发现除了 onCreate() 方法外,其它五个抽象方法都包含了一个Uri(统一资源标识符)参数,通过这个对象可以来匹配对应的请求。...首先,自定义一个ContentProvider,然后向其写入和读取数据,使用SQLite作为ContentProvider的数据存储地址和数据来源,因此需要先建立一个SQLiteOpenHelper,创建一个名为
Android数据存储实现的5大方式 数据存储在开发中是使用最频繁的,在这里主要介绍Android平台中实现数据存储的5种方式,更加系统详细的介绍了5种存储的方法和异同。...xml 处理时Dalvik会通过自带底层的本地XML Parser解析,比如XMLpull方式,这样对于内存资源占用比较好。...创建SDCard可以在Eclipse创建模拟器时随同创建,也可以使用DOS命令进行创建,如下: 在Dos窗口中进入android SDK安装路径的tools目录,输入以下命令创建一张容量为2G的SDCard...当某个值插入数据库时,SQLite 将检查它的类型。如果该类型与关联的列不匹配,则 SQLite 会尝试将该值转换成该列的类型。如果不能转换,则该值将作为其本身具有的类型存储。...().delete(uri, null, null); } 你也可以指定WHERE条件语句来删除特定的记录: getContentResolver().delete(uri, “NAME=
需求是:通过内容提供器来给它加人外部访问接口。...对象; 1.1 内容提供器中增删改查的程序设计步骤为: 1.1.1 调用实例化DatabaseHelper的get方法获得SQLiteDatabase实例化对象;...A程序的内容提供器的程序中,构建对应的Uri,通过getContentResolver调用增删改查即可; 下面开始详细解析: 打开DatabaseTest项目(点击前往码云地址),首先将MyDatabaseHelper...中使用Toast弹出创建数据库成功的提示去除掉,因为跨程序访问时我们不能直接使用Toast(!!!!!)。...(这一点在调用getContentResolver().update()以及getContentResolver().delete()的时候都一样) ?
前言 好久没有写Android系列的文章了,最近有小伙伴问到了Android图片拼接的问题,写一篇相关的博客。...实现功能 检查并请求必要的存储权限 允许用户从相册选择一张或多张图片 异步加载选中的图片 使用ImageStitcher类拼接图片 将拼接后的图片保存到相册 在整个过程中显示适当的进度指示和操作反馈 类定义和成员变量...,高度为所有图片中的最大高度 纵向拼接:总高度为所有图片高度之和,宽度为所有图片中的最大宽度 创建并绘制拼接后的图片 // 创建拼接后的Bitmap Bitmap result...} } 绘制过程 创建一个新的空白Bitmap,大小为之前计算的总尺寸 使用Canvas在这个Bitmap上绘制所有输入图片 根据拼接方向,依次将每张图片绘制到正确的位置 更新当前位置指针(currentPos...),以便下一张图片绘制在正确的位置 注意事项 所有输入图片应为非空且尺寸相同(代码中未做严格检查) 拼接方向通过简单的int值判断(0为横向,非0为纵向) 使用了ARGB_8888配置创建Bitmap,
若ContentProvider的数据存储方式是内存,则需要自己实现线程同步 public boolean onCreate() // ContentProvider创建后...(Uri uri) // 得到数据类型,即返回当前 Url 所代表数据的MIME类型 Android为常见的数据(如通讯录、日程表等)提供了内置了默认的ContentProvider 但也可根据需求自定义...Context的类中 通过调用getContentResolver()来获得ContentResolver ContentResolver resolver = getContentResolver(...2创建完毕 源码地址 Carson-Ho Github地址:ContentProvider2 结果展示 在进程展示时,需要先运行准备数据的进程1,再运行需要访问数据的进程2 运行准备数据的进程1 在进程...而采用ContentProvider方式,其 解耦了 底层数据的存储方式,使得无论底层数据存储采用何种方式,外界对数据的访问方式都是统一的,这使得访问简单 & 高效 如一开始数据存储方式 采用 SQLite
若ContentProvider的数据存储方式是内存,则需要自己实现线程同步 public boolean onCreate() // ContentProvider创建后...(Uri uri) // 得到数据类型,即返回当前 Url 所代表数据的MIME类型 Android为常见的数据(如通讯录、日程表等)提供了内置了默认的ContentProvider 但也可根据需求自定义...Context的类中 通过调用getContentResolver()来获得ContentResolver ContentResolver resolver = getContentResolver(...2创建完毕 源码地址 Carson-Ho Github地址:ContentProvider2 ---- 结果展示 在进程展示时,需要先运行准备数据的进程1,再运行需要访问数据的进程2 1....而采用ContentProvider方式,其 解耦了 底层数据的存储方式,使得无论底层数据存储采用何种方式,外界对数据的访问方式都是统一的,这使得访问简单 & 高效 如一开始数据存储方式 采用 SQLite
;//com.itheima.people是01项目的内容提供者的地址,teacher表示插入teacher表 } public void delete(View...v){ ContentResolver cr = getContentResolver(); int i = cr.delete(Uri.parse("content:.../person";//表示请求的是person的多条数据 } else if(um.match(uri) == 3){ return "vnd.android.cursor.item.../person";//表示请求的是person的单条数据 } return null; } //此方法供其他应用调用,用于往people数据库里插数据..." android:exported="true"> authorities="com.itheima.people"是一个地址,是内容提供者的地址,通过这个地址就可以访问到这个内容提供者
,”w”,null); 1.3.2.1.8.删除文件 通过ContentResolver接口删除文件,Uri为query出来的Uri: getContentResolver().delete(contentUri...● 如果应用未选择停用分区存储,并且请求 READ_EXTERNAL_STORAGE 权限,则用户会看到不同于 Android 10 的对话框。该对话框会指示应用正在请求访问相册和多媒体。...3 如果尝试请求ACCESS_BACKGROUND_LOCATION,同时请求任何其他权限,系统会抛出一个异常。(只针对sdk为android 11),具体表现为闪退。...2 兼容性影响 如果您的应用目标Sdk为R则堆指针标记默认开启,目标SDK低于R时,默认关闭。 使用如下命令开启或关闭此特性,查看您的应用是否有错误的使用指针场景。...2 兼容性影响 如果您的APP需要使用Mac地址作为设备的标识,无论您的Target SDK是否设置为R,只要运行在Android 11上,您就需要进行适配。
思路: 网络权限:android:name="android.permission.INTERNET"/> 1.通过ByteArrayOutputStream拷贝...Bitmap的字节 2.通过MultipartBody模拟表单,生成请求对象Request 3.将Request封装为Call对象,并执行Call /** * 模拟表单上传Bitmap:通过MultipartBody...OOM时.png ?...media的内容提供者数据库.png 1.获取内容提供者并添加一条自定义信息的图片 private void insertImg() { //1.创建ContentValues对象,记录插入照片信息...= getContentResolver().delete(imgUri, "_id=1064830", null); L.d(delete + L.l());//1 表示删除了1行 } 6.