四大组件之ContentProvider(四)-ContentProvider的权限使用和监听

第5节 ContentProvider的使用权限

ContentProvider可以被其他应用使用(就像一个公共网站,可以被任何人访问);也可以被设置成只被自己所在的应用使用(就像一个内部网站,只能在公司内部访问)。

这只需要在应用的AndroidManifest.xml文件中,给ContentProvider设置上android:exported属性,

<provider
    android:name=".MyContentProvider"
    android:authorities="com.anddle.mycontentprovider"
    android:enabled="true"
    android:exported="true" />
  1. android:exported属性设置成true:可被其他应用使用;
  2. android:exported属性设置成false:只能被自己所在的应用使用;

在对其他应用开放ContentProvider的时候,也可以设置上访问权限,只对部分应用开放使用的权限。

5.1 ContentProvider设置权限

  1. AndroidManifest.xml文件中,对要设置权限的ContentProvider设置上android:permission属性,该属性值可以任意指定一个字符串。通常使用程序的包名作为其中的一部分,这样可以避免和其他应用中的权限声明冲突。例如"com.anddle.provideraccess

    <provider
        android:name=".MyContentProvider"
        android:authorities="com.anddle.mycontentprovider"
        android:enabled="true"
        android:exported="true"
        android:permission="com.anddle.provideraccess" />
  2. AndroidManifest.xml文件中,与同级的位置,对外声明前面使用的标签,表示这个应用发布了一个叫做com.anddle.provideraccess的权限,
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.anddle.lifetime">
    
        <permission
            android:name="com.anddle.provideraccess"
            android:label="provider pomission"
            android:protectionLevel="normal" />
    
       <application
            ....../>
    
    </manifest>

    其中android:name属性的值,就是<provider/>标签中设置的android:permission的值。

5.2 使用带权限的ContentProvider

假如应用B要使用应用A中带权限的ContentProvider,需要在应用B的AndroidManifest.xml中加入权限的使用,

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.anddle.calculator">

    <uses-permission android:name="com.anddle.provideraccess"/>

    <application
            ....../>

</manifest>

其中,<uses-permission/>标签中设置的android:name的值,就是应用A中对外声明的那个provider的权限值。

5.3 进一步的权限设置

应用A的ContentProvider还可以将访问的权限进一步细化,分成允许读取和允许写入两种。

如果应用B只需要读取数据,就单独申请读取的权限;如果应用C只需要写入数据,就单独申请写入的权限;

  1. 声明“只能读取”权限,

    <provider
        android:name=".MyContentProvider"
        ......
        android:readPermission="com.anddle.provideraccess.read" />

    发布“只能读取”权限,

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.anddle.lifetime">
    
        <permission
            android:name="com.anddle.provideraccess.read"
            android:label="provider pomission"
            android:protectionLevel="normal" />
    
       <application
            ....../>
    
    </manifest>
  2. 声明“只能写入”权限,
    <provider
        android:name=".MyContentProvider"
        ......
        android:writePermission="com.anddle.provideraccess.write" />

    发布“只能写入”权限,

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.anddle.lifetime">
    
        <permission
            android:name="com.anddle.provideraccess.write"
            android:label="provider pomission"
            android:protectionLevel="normal" />
    
       <application
            ....../>
    
    </manifest>

需要注意的是,android:writePermissionandroid:readPermission权限的优先级比android:permission的优先级高,只要设置了高优先级的,那么其他应用要使用高优先级的功能,就要声明高优先级的权限。

例如,一个ContentProvider同时设置了android:readPermissionandroid:permission权限,第三方应用如果只请求了android:permission权限,是没有办法进行读取操作的。



/*******************************************************************/

* 版权声明

* 本教程只在CSDN和安豆网发布,其他网站出现本教程均属侵权。

/*******************************************************************/


第6节 ContentProvider的监听

ContentProvider中存储的数据内容发生变化时,是可以被关注了这些消息的查询者监听到的。

6.1 调用者监听的方法

  1. 继承ContentObserver,创建监听器类,

    public class MyObserver extends ContentObserver {
        public MyObserver(Handler handler) {
            super(handler);
        }
    
        @Override
        public void onChange(boolean selfChange) {
            super.onChange(selfChange);
            //添加变化的处理逻辑
        }
    }
  2. 注册对指定Uri的监听函数,一旦该Uri指向的内容发生改变,将通知到MyObserver
    mContentObserver = new MyObserver(new Handler());
    
    ContentResolver
    cr = getContentResolver();
    cr.registerContentObserver(MyContentProvider.CONTENT_BOOKS_URI, true, mContentObserver);
  3. 当程序退出或者不需要再监听Uri的变化时,要主动取消对Uri的监听,
    ContentResolver
    cr = getContentResolver();
    
    cr.unregisterContentObserver(mContentObserver);

6.2 ContentProvider的配合

ContentProvider里,每当特定Uri上的数据发生变化,要触发对调用者对通知。通知使用ContentResolvernotifyChange()方法触发,

@Override
public Uri insert(Uri uri, ContentValues values) {

 Uri result = null;?
 switch (sUriMatcher.match(uri)) {

     case BOOKS: {
           SQLiteDatabase db = mDBHelper.getWritableDatabase();
           long id = db.insert(DBHelper.TABLE_NAME, null, values);
           if(id > 0) {
               result = ContentUris.withAppendedId(CONTENT_BOOKS_URI, id);
               getContext().getContentResolver().notifyChange(uri, null);
           }
     }
     break;
     ......
     default:
         throw new IllegalArgumentException("Unknown URI " + uri);
 }

 return result;
}
时间: 2024-08-14 10:01:29

四大组件之ContentProvider(四)-ContentProvider的权限使用和监听的相关文章

Android四大组件之内容提供者--ContentProvider

Android四大组件之内容提供者--ContentProvider 1,什么是ContentProvider ContentProvider将应用中的数据对其它应用进行共享, 提供增删改查的方法 ContentProvider统一了数据的访问方式,不必针对不同数据类型采取不同的访问策略 ContentProvider将数据封装,只暴露出我们希望提供给其它程序的数据 ContentProvider中可以注册观察者, 监听数据的变化 2,怎么创建 2.1定义类继承ContentProvider,

安卓实训第十四天---使用ContentProvider共享数据,并且利用ContentResolver监听共享数据

ContentProvider: 一.当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据.虽然使用其他方法也可以对外共享数据,但数据访问方式会因数据存储的方式而不同,如:采用文件方式对外共享数据,需要进行文件操作读写数据:采用sharedpreferences共享数据,需要使用sharedpreferences API读写数据.而使用ContentProvider共享数据的好处是统一了数据访问方式. 第二步需要在AndroidManif

四大组件之BroadcastReceiver(二)-使用权限和常用的系统广播

第4节 Broadcast的使用权限 为广播设置权限要考虑两方面的问题. 作为广播的发送者,希望限制广播的接收者,只让特定的应用组件接收到发出的广播: 作为广播的接收者,不希望任何组件都能模仿它关心的广播,因此希望在接受广播的时候能检查一下这条广播的发送者是否具有发送这条广播的资格: 无论是上面哪种情况,解决方法都试一样的:为发送者和接收者都设置一个相同的权限,只有它们的权限匹配上了,广播机制才能产生效果. 4.1 限制接收者 假设组件A要发布广播, 在AndroidManifest.xml文件

vue 组件 子向父亲通信用自定义方法用事件监听

<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>Title of page</title> </head> <body> <div id="example"> <input v-model="parentsg"> <br> <child v-

Android四大组件应用系列——使用ContentProvider实现跨进程通讯

一.问题描述 如何在Android中实现不同应用之间的通讯(既跨进程进行调用)?Android提供了多种实现方式,使我们可以实现跨进程访问Activity.通过ContentProvider跨进程访问其他应用的数据.通过Broadcast可以向android系统中所有应用程序发送广播.使用AIDL实现跨进程的Service.下面我们就使用ContentProvider实现跨进程访问数据,并可对数据进行增.删.改.查 二.应用实现 使用ContentProvider实现数据共享,主要是共享应用的S

android 意图和四大组件

意图 Intent                                            一.显式意图        直接指定要实现的类:            Intent intent=new Intent(MainActivity.this,xxx.class);            this.startActivity(intent);            二.隐式意图        1:xml配置:在意图所指向的类的配置中添加属性<intent-filter>&l

四大组件的理解

四大组件之ContentProvide: *ContentProvider关联的数据一般在内部存储中 *ContentProvide的生命周期由系统管理 四大组件之Service start模式: *onCreat()1次 *onStartCommand()多次* onDestroy().调用startService启动.stopService()或stopSelf()停止 bind模式:*onCreat()1次,onBind()1次,onDestory()1次 bindService启动,un

Android 四大组件 (四) ContentProvider介绍

ContentProvider虽然与Activity.Service.BroadcastReceiver齐名为Android四大组件.如果你不是特别开发一款与其他APP有数据交互的应用,它的使用频率远没有另外三者高.因为已经介绍了前三大组件,为了完善Android四大组件介绍了解,这次补充下ContentProvider介绍.哈哈~一边在看世界杯,巴西打瑞士.目前巴西1:0.我把所有金币全压巴西了~题外话说完,下面简单介绍下ContentProvider. 一.  ContentProvider

android四大组件--ContentProvider详解

一.相关ContentProvider概念解析: 1.ContentProvider简介 在Android官方指出的Android的数据存储方式总共有五种,分别是:Shared Preferences.网络存储.文件存储.外储存储.SQLite.但是我们知道一般这些存储都只是在单独的一个应用程序之中达到一个数据的共享,有时候我们需要操作其他应用程序的一些数据,例如我们需要操作系统里的媒体库.通讯录等,这时我们就可能通过ContentProvider来满足我们的需求了. 2.为什么要选择Conte