首页 > 代码库 > 安卓 ContentProvider
安卓 ContentProvider
ContentProvider是暴露数据给另一个应用使用的组件。一般呢,我们大部分时候是利用ContentResovler获取系统ContentProvider暴露的数据,比如:联系人,图片音频视频等文件,日历等;所以这一次主要是记录如何使用这些数据。
理解ContentProvider:
ContentProvider是不同应用程序之间进行数据交换的标准API,ContentProvider以某种Uri的形式对外提供数据,运行其他应用访问或修改数据,即其他应用程序使用ContentResolver根据Uri去访问操作指定数据, UriMatcher类用于帮助解析URI。
昨天研究了一下午的ContractsProvider,Android是将联系人信息存储在Sqlite数据库中,对数据库的操作让我头疼了一下午。
先列出最简单的获取联系人名字电话邮箱的方法吧:
mContentResolver = getContentResolver(); Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI; Cursor cursor = mContentResolver.query(uri,null,null,null, null);//全是null,效率很低的,会获取一大堆数据,cursor集,但是加了参数之后,不断的入坑,至今未爬出来,容我缓缓 while (cursor.moveToNext()){ String cName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)); String cNum = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
String cEmail = cursor.getString(cursor.getColumnIndex(android.provider.ContactsContract.CommonDataKinds.Email.DATA));
Log.i(TAG, "name: "+cName+";number:"+cNum); Log.i(TAG,"================="); } cursor.close();
Storage Acess Framwork,
DocumentProvider获取图片
1,打开图库的方式
private void Opendocument(){ // Log.i(TAG, "Opendocument111: "); Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.addCategory(Intent.CATEGORY_OPENABLE); intent.setType("image/*"); startActivityForResult(Intent.createChooser(intent,null),2); // Log.i(TAG, "Opendocument: "); }
官方文档上说,这个intent是用来“检索一个特定类型的文件”并且回返回检索到的文件的一个引用(文件的copy)
这个不受安卓系统的级别影响,而且也是大多数人选择。
2获取uri,
protected void onActivityResult(int requestCode, int resultCode, Intent data) { Uri uri; if (requestCode==2&&resultCode== Activity.RESULT_OK){ if (data!=null){ uri = data.getData(); Log.i(TAG, "onActivityResult: URI:"+uri); if (getBitmapFromUri(uri)!=null) { mImageView.setImageBitmap(getBitmapFromUri(uri)); } } } }
比较简单,回调函数onActivityResult的data包含我们选择的图片的资源标识符。
3.通过图片uri,获取图片到当前activity
private Bitmap getBitmapFromUri(Uri uri){
Bitmap image=null;
ContentResolver contentResolver = getContentResolver();
Cursor mCursor = contentResolver.query(uri,null,null,null,null);
while (mCursor.moveToNext()) {
String path = mCursor.getString(mCursor
.getColumnIndex(MediaStore.Images.Media.DATA));
image = BitmapFactory.decodeFile(path);
}
return image;
}
一定要写这一步while (mCursor.moveToNext()),因为cursor的起始位置在-1;
不然该cursor内没有所需的数据。
安卓 ContentProvider
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。