• 安卓 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)

    这个不受安卓系统的级别影响,而且也是大多数人选择。

      友情连接:除了图片,音频uri也可以类似获得,详情见下面:

    Android系统中标准Intent的使用

    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内没有所需的数据。


  • 相关阅读:
    vue 数字滚动的插件 vue-count-to
    ASP.NET Core EF 查询获取导航属性值,使用Include封装
    nginx在asp.net mvc项目中 配置 初步快速入门
    JQuery EasyUI 扩展方法 日期控件 设置时间段函数
    JQueryEasyUI easyui-combobox 单击文本区域显示下拉菜单
    Jquery Easy UI Datagrid 上下移动批量保存数据
    ASP.NET MVC BundleConfig介绍和使用
    ASP.NET MVC5 视图相关学习
    SqlDependency数据库同步+signalr 推送消息
    T4 模板自动生成带注释的实体类文件
  • 原文地址:https://www.cnblogs.com/vitabebeauty/p/7094233.html
Copyright © 2020-2023  润新知