精华内容
下载资源
问答
  • android provider
    千次阅读
    2016-02-26 10:38:14

    语法

    <provider android:authorities="list"
              android:enabled=["true" | "false"]
              android:exported=["true" | "false"]
              android:grantUriPermissions=["true" | "false"]
              android:icon="drawable resource"
              android:initOrder="integer"
              android:label="string resource"
              android:multiprocess=["true" | "false"]
              android:name="string"
              android:permission="string"
              android:process="string"
              android:readPermission="string"
              android:syncable=["true" | "false"]
              android:writePermission="string" >
        . . .
    </provider>

    特性

    • < provider >标签包含于 < application>下
    • < provider >标签可以包含< meta-data> < grant-uri-permission> < path-permission>标签

    声明

    声明一个Conteng Provider组建,content provider是一个由application管理的ContentProvider一个子类并且提供了结构化的数据访问方法。在应用程序中的所有content provider必须声明在Manifest文件中的< provider>标签下,需要注意一点的是:系统并不知道是否存在该content provider更不知道它是否运行。
    只需要将你要实现的content provider声明为你应用程序的一部分就可以了,止于在当前应用程序中使用到的其他content provider是不需要声明的,直接使用它们就好了。
    Android系统会根据content provider的authority 字符串保存一个该content provider的引用,并将其作为该content provider的URI的一部分。

     假设你需要访问一个提供了个人健康信息的content provider。为了实现这一点,调用ContentResolver.query()方法,并传入相应的URI参数即可,该参数标识了从该content provider获得数据
    

    实例URI:content://com.example.project.healthcareprovider/nurses/rn
    - content组合,指示了该URI是一个content URI并且指向一个content provider,
    - com.example.project.healthcareprovider指示了该content provider他自己;Android系统会根据该authority查找到当前的content provider
    - nurses/rn 这个字符串代表了路径,指示了有查询的数据存储在当前content provider中的什么位置。

    需要注意一点的是:当我们在Manifest文件中的< provider>中声明content provider的时候,不能再android:name中包含URI中其他参数,只能声明authority。更加详细的,如何使用content provider,可以查阅API Guide

    属性

    android:authorities

    列出一个或者多个由content provider的提供的URI的authorities。多个authorities由分号隔开。为了避免冲突,authority的命名规则应该遵循java的编码惯例(例如使用com.example.provider.cartoonprovider作为authority),通常情况authority的名字就是实现了provider的一个子类的名称。authority没有默认值,必须显式的指定。

    android:enabled

    该属性表明了该content provider是否可以被实例化

    • true –>可以被实例化
    • false –>不可以被实例化

    默认情况下该属性值是true。< application>标签启用了他属于他自己的该属性,并且同样适用于被< application>包含的子标签;当然,content provider也被包含在内。< application > & < provider>中针对该属性的设置,必须同时为true(都为默认值)时,content provider才能够被启用。不论是< application > 还是< provider>中的任何一个该属性被设置为false,则该content provider不会被实例化,不会被启用。

    android:exported

    该属性指示了content provider是否可以被其他应用程序使用。

    • true ,代表该content provider可以被其他应用程序使用。其他所有的应用程序都可以通过该content provider提供的URI访问由该content provider提供的数据,在访问的时候,只需要遵循相应的权限就ok。
    • false,代表该content provider对其他应用程序来说是不可见的。将android:exported设置为false用用限制你的应用程序来访问由该content provider提供的数据,只有当应用程序的UID和该content provider的UID相同时,才可以访问。

    当minSdkVersion或者targetSdkVersion小于16时该属性的默认值是true。当大于17时,该属性默认值为false。我们可以通过设置该属性的值为false或者通过访问权限来控制该content provider是否可以被其他应用程序使用

    android:grantUriPermissions

    该属性用于标识哪些没有数据访问权限的应用程式是否可以访问该数据。当该值为true时,并且有其他应用访问该content provider提供的数据是,依据readPermissionwritePermission中的规则给出限制。

    • true,代表可以获得权限,当访问该content provider的任意数据时,都会被授权。
    • false,代表不能获得权限,当访问该content provider的任意数据时,回依据< grant-uri-permission>子标签中的规则进行授权

    默认值为false。
    权限授权是一种给与某应用程序或者组建一次性访问受保护数据的一种策略。例如:当我们收到一封带有附件的电子邮件时,即便是用户没有给与email访问content provider数据的权限,email程序应该呈现给用户并打开它。
    在大多数情况下,权限的授权通过在intent中指定FLAG_GRANT_READ_URI_PERMISSION FLAG_GRANT_WRITE_URI_PERMISSION标志来获取。例如上面的email应用程序,在发出打开附件的intent中应该指定FLAG_GRANT_READ_URI_PERMISSION 标志。
    如果我们开启了当前的这个权限授权功能,不论是通过将该属性设置为true还是将其定义在< grant-uri-permission>标签中;当我们删除一些URI对应的资源时,必须要调用Context.revokeUriPermission()方法,详细参见< grant-uri-permission>标签

    android:icon

    设置content provider的图标资源。如果没有设置,则默认为< application>的图标

    android:initOrder

    对于处在同一进程中的不同content provider来说,该属性值代表了不同content provider之间的初始化顺序。当不同的content provider之间有相互依赖时,设置该属性之后,可以确保相互依赖的content provider被按照一定的顺序创建。该属性的值为整数,并且数值越大优先级越高

    android:label

    代表可读的content provider标签。如果该属性尚未设置,则默认为< application>的label标签。该属性的值为字符串,因此该属性同样也是可以参照不同的语言环境来进行切换的。但是为了方便开发,该属性通常被设置为一个常量的不可变的字符串

    android:multiprocess

    该content provider 是否可以被任意一个进程实例化(默认值为false)

    • true 代表该content provider可以运行在多个进程中
    • false 代表该content provider只能运行在一个进程中

    通常情况content provider又其对应的application进行实例化。但如果将该属性设置为true,任意一个进程都可以创建一个content provider;贴别是需要在不同进程之间交互时;因此要尽量避免进程间通信的开销

    android:name

    该属性代表实现了content provider的类的名称,也就是ContentProvider的子类。该属性应该是一个类的全名称(例如:com.example.project.TransportationProvider)。但是当我们在< manifest>中指定了完整的包名。此时也可以使用.TransportationProvider来代替。
    该属性没有默认值,必须指定

    android:permission

    读写该content provider数据的权限的名称。这个属性很方便的规定了读和写两种权限。但是readPermissionwritePermission的优先级要高于该属性的优先级。如果readPermission 设置的值,用于控制查询content provider的数据;writePermission设置的值,用于控制修改content provider的数据。

    android:process

    该content provide应该运行在哪个进程中。通常情况下application的所有组件都运行在一个由application创建的默认认的进程中。content provider的该属性值和application的相同。< application> 标签中的process属性可以左右其所有子组件的默认值,但是每个子组件同样是可以覆盖< application> 标签的该属性的。进而允许你的应用跨进程通信。如果这个分配的名称以冒号:开始,那么当它需要运行在哪个进程的时候,一个新的,私有的进程就被创建。如果这个进程名称以小写字母开始,那么这个provider将运行在全局进程中。这就允许这个进程在不同的应用中共享,进而降低对资源的消耗。

    android:readPermission

    客户端读取content provider数据所需的权限。

    android:syncable

    content provider的数据是否要和服务数据进行同步,若同步则为true,否则为false。”false” if not.

    android:writePermission

    客户端修改由content provider控制的数据时所需的权限。

    更多相关内容
  • Android Provider用法

    万次阅读 2018-03-31 17:39:57
    Android为这种场景提供了provider的子标签 ,path-permission包括了以下几个标签。 < path-permission android:path = "string" android:pathPrefix = "string" android:pathPattern = "string" android...

    ContentProvider

    ContentProvider一般为存储和获取数据提供统一的接口,可以在不同的应用程序之间共享数据。

    之所以使用ContentProvider,主要有以下几个理由:
    1,ContentProvider提供了对底层数据存储方式的抽象。比如下图中,底层使用了SQLite数据库,在用了ContentProvider封装后,即使你把数据库换成MongoDB,也不会对上层数据使用层代码产生影响。

    2,Android框架中的一些类需要ContentProvider类型数据。如果你想让你的数据可以使用在如SyncAdapter, Loader, CursorAdapter等类上,那么你就需要为你的数据做一层ContentProvider封装。

    3,第三个原因也是最主要的原因,是ContentProvider为应用间的数据交互提供了一个安全的环境。它准许你把自己的应用数据根据需求开放给其他应用进行增、删、改、查,而不用担心直接开放数据库权限而带来的安全问题。

    ContentProvider是对数据层的封装,我们可以通过ContentResolver,来对不同的ContentProvider进行增,删,改,查的操作。

    ContentResolver

    有些人可能会疑惑,为什么我们不直接访问Provider,而是又在上面加了一层ContentResolver来进行对其的操作,这样岂不是更复杂了吗?其实不然,大家要知道一台手机中可不是只有一个Provider内容,它可能安装了很多含有Provider的应用,比如联系人应用,日历应用,字典应用等等。所以Android提供了ContentResolver来统一管理与不同ContentProvider间的操作。

    Context.java的源码中有一段

    /** Return a ContentResolver instance for your application's package. */
     public abstract ContentResolver getContentResolver();
    

    所以我们可以通过在所有继承Context的类中通过调用getContentResolver()来获得ContentResolver

    那ContentResolver是如何来区别不同的ContentProvider的呢?这就涉及到URI(Uniform Resource Identifier)问题,对URI是什么还不明白的童鞋请自行Google。

    ContentProvider中的URI

    ContentProvider中的URI有固定格式,如下图:

    Authority:授权信息,用以区别不同的ContentProvider;
    Path:表名,用以区分ContentProvider中不同的数据表;
    Id:Id号,用以区别表中的不同数据;

    URI组装代码示例:

    public class TestContract {
    
        protected static final String CONTENT_AUTHORITY = "me.pengtao.contentprovidertest";
        protected static final Uri BASE_CONTENT_URI = Uri.parse("content://" + CONTENT_AUTHORITY);
    
        protected static final String PATH_TEST = "test";
        public static final class TestEntry implements BaseColumns {
    
            public static final Uri CONTENT_URI = BASE_CONTENT_URI.buildUpon().appendPath(PATH_TEST).build();
            protected static Uri buildUri(long id) {
                return ContentUris.withAppendedId(CONTENT_URI, id);
            }
    
            protected static final String TABLE_NAME = "test";
    
            public static final String COLUMN_NAME = "name";
        }
    }
    

    从上面代码我们可以看到,我们创建了一个
    content://me.pengtao.contentprovidertest/test的uri,并且开了一个静态方法,用以在有新数据产生时根据id生成新的uri。下面介绍下如何把此uri映射到数据库表中。

    实作

    首先我们创建一个自己的TestProvider继承ContentProvider。默认该Provider需要实现如下六个方法,onCreate(), query(Uri, String[], String, String[], String),insert(Uri, ContentValues), update(Uri, ContentValues, String, String[]), delete(Uri, String, String[]), getType(Uri),方法的具体介绍可以参考
    http://developer.android.com/reference/android/content/ContentProvider.html

    下面我们以实现insert和query方法为例

    private final static int TEST = 100;
    
    static UriMatcher buildUriMatcher() {
        final UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);
        final String authority = TestContract.CONTENT_AUTHORITY;
    
        matcher.addURI(authority, TestContract.PATH_TEST, TEST);
    
        return matcher;
    }
    
    @Nullable
    @Override
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
        final SQLiteDatabase db = mOpenHelper.getReadableDatabase();
    
        Cursor cursor = null;
        switch ( buildUriMatcher().match(uri)) {
            case TEST:
                cursor = db.query(TestContract.TestEntry.TABLE_NAME, projection, selection, selectionArgs, sortOrder, null, null);
                break;
        }
    
        return cursor;
    }
    
    @Nullable
    @Override
    public Uri insert(Uri uri, ContentValues values) {
        final SQLiteDatabase db = mOpenHelper.getWritableDatabase();
        Uri returnUri;
        long _id;
        switch ( buildUriMatcher().match(uri)) {
            case TEST:
                _id = db.insert(TestContract.TestEntry.TABLE_NAME, null, values);
                if ( _id > 0 )
                    returnUri = TestContract.TestEntry.buildUri(_id);
                else
                    throw new android.database.SQLException("Failed to insert row into " + uri);
                break;
            default:
                throw new android.database.SQLException("Unknown uri: " + uri);
        }
        return returnUri;
    }
    

    此例中我们可以看到,我们根据path的不同,来区别对不同的数据库表进行操作,从而完成uri与具体数据库间的映射关系。

    因为ContentProvider作为四大组件之一,所以还需要在AndroidManifest.xml中注册一下。

    <provider    
        android:authorities="me.pengtao.contentprovidertest"  
        android:name=".provider.TestProvider" />
    

    然后你就可以使用getContentResolver()方法来对该ContentProvider进行操作了,ContentResolver对应ContentProvider也有insert,query,delete等方法,详情请参考:
    http://developer.android.com/reference/android/content/ContentResolver.html

    此处因为我们只实现了ContentProvider的query和insert的方法,所以我们可以进行插入和查询处理。如下我们可以在某个Activity中进行如下操作,先插入一个数据peng,然后再从从表中读取第一行数据中的第二个字段的值。

    ContentValues contentValues = new ContentValues();
    contentValues.put(TestContract.TestEntry.COLUMN_NAME, "peng");
    contentValues.put(TestContract.TestEntry._ID, System.currentTimeMillis());
    getContentResolver().insert(TestContract.TestEntry.CONTENT_URI, contentValues);
    
    Cursor cursor = getContentResolver().query(TestContract.TestEntry.CONTENT_URI, null, null, null, null);
    
    try {
        Log.e("ContentProviderTest", "total data number = " + cursor.getCount());
        cursor.moveToFirst();
        Log.e("ContentProviderTest", "total data number = " + cursor.getString(1));
    } finally {
        cursor.close();
    }
    

    数据共享

    以上例子中创建的ContentProvider只能在本应用内访问,那如何让其他应用也可以访问此应用中的数据呢,一种方法是向此应用设置一个android:sharedUserId,然后需要访问此数据的应用也设置同一个sharedUserId,具有同样的sharedUserId的应用间可以共享数据。

    但此种方法不够安全,也无法做到对不同数据进行不同读写权限的管理,下面我们就来详细介绍下ContentProvider中的数据共享规则。

    首先我们先介绍下,共享数据所涉及到的几个重要标签:
    android:exported 设置此provider是否可以被其他应用使用。
    android:readPermission 该provider的读权限的标识
    android:writePermission 该provider的写权限标识
    android:permission provider读写权限标识
    android:grantUriPermissions 临时权限标识,true时,意味着该provider下所有数据均可被临时使用;false时,则反之,但可以通过设置<grant-uri-permission>标签来指定哪些路径可以被临时使用。这么说可能还是不容易理解,我们举个例子,比如你开发了一个邮箱应用,其中含有附件需要第三方应用打开,但第三方应用又没有向你申请该附件的读权限,但如果你设置了此标签,则可以在start第三方应用时,传入FLAG_GRANT_READ_URI_PERMISSIONFLAG_GRANT_WRITE_URI_PERMISSION来让第三方应用临时具有读写该数据的权限。

    知道了这些标签用法后,让我们改写下AndroidManifest.xml,让ContentProvider可以被其他应用查询。

    声明一个permission

    <permission android:name="me.pengtao.READ" android:protectionLevel="normal"/>
    

    然后改变provider标签为

    <provider
        android:authorities="me.pengtao.contentprovidertest"
        android:name=".provider.TestProvider"
        android:readPermission="me.pengtao.READ"
        android:exported="true">
    </provider>
    

    则在其他应用中可以使用以下权限来对TestProvider进行访问。

    <uses-permission android:name="me.pengtao.READ"/>
    

    有人可能又想问,如果我的provider里面包含了不同的数据表,我希望对不同的数据表有不同的权限操作,要如何做呢?Android为这种场景提供了provider的子标签<path-permission>,path-permission包括了以下几个标签。

    <path-permission android:path="string"
                     android:pathPrefix="string"
                     android:pathPattern="string"
                     android:permission="string"
                     android:readPermission="string"
                     android:writePermission="string" />
    

    可以对不同path设置不同的权限规则,具体如何设定我这里就不做详细介绍了,可以参考
    http://developer.android.com/guide/topics/manifest/path-permission-element.html

    进阶原理介绍

    可以参考:http://gityuan.com/2016/07/30/content-provider/

    展开全文
  • 我这个是android7.0拍照,因为更换头像是自己条用系统的拍照,为了解决Android7.0权限,所以自己在xml中配置了provider,然后项目中有上传多张图片的功能,我是使用的是第三方框架com.lzy.widget:imagepicker,这个...

     

    首先描述一下我的问题

    我这个是android7.0拍照,因为更换头像是自己条用系统的拍照,为了解决Android7.0权限,所以自己在xml中配置了provider,然后项目中有上传多张图片的功能,我是使用的是第三方框架com.lzy.widget:imagepicker,这个框架里面也配置了provider的权限,然后就发生了冲突。当选择多张图片的时候,使用拍照,Android 7.0就会闪退。

    开始的时候,运行是正常的,什么错都没有,就是点击拍照就闪退

    这个时候的我一脸懵逼,不存在啊,这个是使用的最新的版本啊,官方也说了7.0是可以的啦,好崩溃,然后我就换了一个0.3.5版本的clear项目,在重新builder,哈哈哈哈,这回就不能运行了,报错了。哎呀报错了好呀,这样才能看到报错的原因啊。下面是报错的详细信息

     

    然后配上我的xml配置

     

    <!-- Android7.0系统  拍照 -->
    <provider
        android:name="android.support.v4.content.FileProvider"
        android:authorities="com.example.ruidun.ShanXunApplication.fileprovider"
        android:exported="false"
        android:grantUriPermissions="true"
        >
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/file_paths"
            />
    </provider>

     

     

     

     

    分析报错可以看到说的是provider这个标签里面的

    android:authorities

     

    这个的值是错的,imagepicker不是用的这个值,然后说要加上 tools:replace=“android:authorities”

    还有一个地方就是meta-data标签下的这个resource值也不对,这个是用 @xml = "provier_paths"

     

     android:resource

    根据报错信息,说是要加入

     

    tools:replace=“android:authorities”

    然后我按照报错的信息又加入相应的tools,然后重新运行项目,现在运行的试试不报错了,但是点击imagepick的拍照功能还是闪退。

    然后网上搜索了一下,也没有解决这个问题,然后我吧版本换到最新的版本,然后下载官网的源码去看看源码里面怎么配置的。

    下面是源码里面的provider配置的相关代码,

    1.在AndroidMain里面

            <provider
                android:name=".ImagePickerProvider"
                android:authorities="${applicationId}.provider"
                android:exported="false"
                android:grantUriPermissions="true">
                <meta-data
                    android:name="android.support.FILE_PROVIDER_PATHS"
                    android:resource="@xml/provider_paths"/>
            </provider>

    2.@xml/provider_paths里面的东西

    <?xml version="1.0" encoding="utf-8"?>
    <paths xmlns:android="http://schemas.android.com/apk/res/android">
        <external-path name="external_files" path="."/>
    </paths>

    3.ImagePickerProvider中的代码

    package com.lzy.imagepicker;
    import android.support.v4.content.FileProvider;
    /**
     * 自定义一个Provider,以免和引入的项目的provider冲突
     *
     * Author: nanchen
     * Email: liushilin520@foxmail.com
     * Date: 2017-03-17  16:10
     */
    public class ImagePickerProvider extends FileProvider {
    }

     

     

    然后我就尝试自己再按照源码的配置再配一次,出现这样问题是因为provider文件不能共享

    下面我就直接贴代码了

     

    1.自定义的MyProvider继承自

    import com.lzy.imagepicker.ImagePickerProvider;

     

     

    
    import com.lzy.imagepicker.ImagePickerProvider;
    
    /**
     * C
     * 项目名称:¥{PROJECT_NAME}
     * 创建人:潇潇
     * 
     */
    
    public class MyProvider extends ImagePickerProvider {
    }
    

     

     

     

    2.在res-value新建一个xml文件,然后创建provider_paths

     

     

    <?xml version="1.0" encoding="utf-8"?>
    <paths xmlns:android="http://schemas.android.com/apk/res/android">
      
        <!--解决 imagePick 7.0拍照是 与自己配置的 provider的冲突-->
        <external-path
            name="external_files"
            path="." />
    </paths>

     

     

     

     

    3.在AndroidManifest中配置

     

    <!--imagePick  拍照7.0系统-->
    <provider
        android:name=".ui.activity.MyProvider"
        android:authorities="com.lzy.imagepicker.ImagePickerProvider"
        android:exported="false"
        android:grantUriPermissions="true"
        tools:replace="name,authorities,exported,grantUriPermissions"
        >
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/provider_paths"
            tools:replace="name,resource"
            />
    </provider>

     

     

     

    O(∩_∩)O哈哈~,就这样完美解决了,如果对你有帮助,记得点赞哦,(づ ̄ 3 ̄)づ么么哒

     

     

     

     

    展开全文
  • Android Provider权限

    千次阅读 2014-12-04 11:11:36
    访问其他应用的content provider 我们在ProPermission中提供了一个content provider,成为PrivProvider,然后在ProPermissionClient中对调用这个provider接口。在ProPermission的... android:authorities=

    访问其他应用的content provider

    我们在ProPermission中提供了一个content provider,成为PrivProvider,然后在ProPermissionClient中对调用这个provider接口。在ProPermission的AndroidManifest.xml中,对provider声明如下:

    <provider android:name=".PrivProvider" 
        android:authorities="cn.wei.flowingflying.propermission.PrivProvider" 
        android:exported="true" /> 

    android:exported属性非常重要。这个属性用于指示该服务是否能够被其他应用程序组件调用或跟它交互。如果设置为true,则能够被调用或交互,否则不能。设置为false时,只有同一个应用程序的组件或带有相同用户ID的应用程序才能启动或绑定该服务。如果content provider允许其他应用调用,即允许其他进程调用,需要将该属性设置为true。如果,我们设置该属性,会报下面的错误:

    Provider的读写权限

    Provider可以提供读权限,写权限,或者权限,例如:

    <permission android:name="wei.permission.READ_CONTENTPROVIDER" 
        android:label="Allow read content provider" 
        android:protectionLevel="normal" />  

        …… 

    <provider android:name=".PrivProvider" 
        android:authorities="cn.wei.flowingflying.propermission.PrivProvider" 
        android:readPermission="wei.permission.READ_CONTENTPROVIDER"
        android:exported="true" > 
    </provider> 

    设置写权限属性为android:writePermission,读写权限为android:permission。我们仍使用ProPermissionClient来访问provider接口,则出现权限错误:

    我们在ProPermissionClient的AndroidManifest.xml中加上权限声明即可:

    <uses-permission android:name="wei.permission.READ_CONTENTPROVIDER" />

    Provider的URI权限

    前面,我们定义的整个provider的权限,但实际使用中,provider可以只开放部分URI的权限,例如本例,我们可以只开发content://cn.wei.flowingflying.propermission.PrivProvider/hello路径下权限,不允许访问其他路径,如下声明:

    <provider android:name=".PrivProvider" 
        android:authorities="cn.wei.flowingflying.propermission.PrivProvider" 
        android:readPermission="wei.permission.READ_CONTENTPROVIDER" 
        android:exported="true" > 
        <path-permission android:pathPrefix="/hello" android:readPermission="READ_HELLO_CONTENTPROVIDER" />
    </provider> 

    我们可以针对其中某个或某部分URI,单独进行权限设置。除了android:pathPrefix,还可以有android:path和android:pathPatten,例如android:pathPattern="/hello/.*"(注意,通配符*之前有个‘.’)。

    在ProPermissionClient如果要读取content:content://cn.wei.flowingflying.propermission.PrivProvider/hello/1则需要声明整个provider的权限wei.permission.READ_CONTENTPROVIDER或者该路径的权限READ_HELLO_CONTENTPROVIDER。

    Provider的granting

    全局granting

    ProPermissionClient具有读取content provider的权限,它去调用另一个应用C的activity,例子中这个另一个应用C为ProPermissionGrant,但是这个例子没有读取content provider的权限,ProPermissionClient可以将自己的权限通过intent传递给应用C,让其也具有访问content provider的权限。

    对于应用A,相关的content provider为:

    <provider android:name=".PrivProvider" 
         android:authorities="cn.wei.flowingflying.propermission.PrivProvider" 
         android:readPermission="wei.permission.READ_CONTENTPROVIDER"
     
         android:grantUriPermissions="true" 
         android:exported="true" /> 

    对于应用B,其具有wei.permission.READ_CONTENTPROVIDER的权限,而应用C不具备,应用B通过intent调用应用C的代码如下:

    Intent intent = new Intent(this,ReadProvider.class); 
    intent.setClassName("com.example.propermissiongrant", "com.example.propermissiongrant.MainActivity");
    intent.setData(Uri.parse("content://cn.wei.flowingflying.propermission.PrivProvider/world/1"));

    intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);  //传递权限 
    startActivity(intent); 

    所调用的C的activity具备访问content provider的权限。

    如果我们将provider的属性android:grantUriPermissions设置为false,则不允许通过接受传递的权限方式进行访问,即B所调用的C的activity不能读content provider,报错如下:

    部分URI的granting

    有时候,我们只希望部分的URI允许grant权限访问,而不是开放整个provider,如下:

    <provider android:name=".PrivProvider" 
         android:authorities="cn.wei.flowingflying.propermission.PrivProvider" 
         android:readPermission="wei.permission.READ_CONTENTPROVIDER" 
         android:exported="true" >  
         <grant-uri-permission android:pathPrefix="/hello" />
    </provider> 

    我们将之允许前缀为hello的部分URI访问。一旦我们设置了grant-uri-permission,则全局的android:grantUriPermissions属性将无效,无论设置true还是flase,也都是只允许grant-uri-permission是声明的部分uri可以被grant权限访问。

    本博所涉及的例子代码,可以在Pro Android学习:permission例子中下载。

    自:http://blog.csdn.net/flowingflying/article/details/17412609
    展开全文
  • Android 7.0 provider属性说明

    千次阅读 2021-06-09 00:49:12
    2018-07-18生命不息,奋斗不止,万事起于忽微,量变...注册一个providerandroid:name="android.support.v4.content.FileProvider"android:authorities="com.test.demo.fileprovider"android:exported="false"androi...
  • Android provider authorities冲突

    千次阅读 2014-10-29 17:00:00
    Android项目中的AndroidManifest中provider的authorities相当于一个系统级的全局变量它的值必须唯一,如果有两个应用的authorities相同会导致安装失败。 转载于:...
  • Android attribute provider#androidx.core.content.FileProvider
  • 关于Provider的安全的东西,一直不太理解,最近几天看了《XXX》这篇文章,这里有个盲点,之前没有搞定,统一写一篇文章记录一下 2 Google的说明 3 对Run函数的Test 3.1 设置全局权限 3.2 设置Read&Write两个权限...
  • Android的FileProvider使用解释

    千次阅读 2022-04-21 10:45:03
    FileProviderandroid support v4包提供的,是ContentProvider的子类,便于将自己app的数据提供给其他app访问。
  • 一次,项目修改了compileSdkVersion之后,拍照就报错了,之后...定义MineFileProvider继承 FileProvider 然后把上面androidx.core.content.FileProvider 修改为自定义得MineFileProvider再运行就可以编译通过了。 ...
  • 一行代码完成Android 8 FileProvider适配~
  • 这一章我们来学习“ content provider SQL注入风险”。 漏洞原理 首先,我们需要知道的是来自用户的输入都是不安全的,我们需要对其进行校验,当校验通过时我们可以近似的认为是安全,那这与我们这一章有什么关系呢...
  • Android FileProvider冲突处理方法

    千次阅读 2020-05-19 11:07:29
    众所周知,在android7.0是上做适配,需要额外添加FileProvider,因为选则文件的uri发现了一些变化。当然在android10.0的基础上做适配的话,就发现另外一些变化,这个可以另外一篇文章,但是总体变化不大。android10...
  • 1.效果 安卓手机收到短信后,会自动弹框。 2.代码 // 文件清单 1.MainActivity.java 2.ComposeSmsActivity.java 3.MmsReceiver.java 4.SmsReceiver.java ...import androidx.annotation.RequiresApi;
  • 解决多个provider配置问题

    千次阅读 2021-05-27 02:22:29
    方案一 合并资源文件声明简单粗暴速度快当面临两个及以上provider声明时可以采用合并resource文件的方式在/res/xml/xx_file_paths.xml中进行合并声明但此处有一个风险,因为只有一个provider节点,所以如果面临各...
  • Android FileProvider的配置==========

    千次阅读 2020-10-13 10:10:38
    FileProviderAndroid 7.0出现的新特性,它是ContentProvider的子类,可以通过创建一个Content URI并赋予临时的文件访问权限来代替File URI实现文件共享 FileProvider注册配置 Manifest中声明FileProvider对象 ...
  • Android 中 子moudle中provider和主工程中provider冲突Android 中 子moudle中provider和主工程中provider冲突Android 中 子moudle中provider和主工程中provider冲突
  • Android:Content Provider的使用。 1、Content Provider 简介 2、使用现成的Content Provider 3、定义自己的Content Provider 一、Content Provider 简介 我们说Android应用程序的四个核心组件是:Activity、...
  • Android FileProvider 详解

    千次阅读 2021-07-21 17:36:34
    FileProvider 是 ContentProvider 的一个特殊子类,它可以为应用生成关联的 content:// 内容 URI ,而不是 file:/// 类型的 URI,使得应用能够实现安全地共享文件。 内容 URI 允许授予对文件临时的读/写访问权限。当...
  • OnekeyWalletWeb3Provider 如何识别OnekeyWallet提供程序 如果OnekeyWallet提供程序已正确注入,则isOneKeyWallet将为true web3 . currentProvider . isOneKeyWallet 如何编译 步骤1 您的计算机需要安装NodeJS 第2...
  • android关于provider包冲突的问题

    千次阅读 2017-12-17 20:00:17
    最近项目要集成app自动更新的... 当然今天的重点不是这个 ,在我集成了这个之后,在android6.0和以下的手机下载和自动安装都没有问题,到了7.0的手机莫名其妙闪退了,发现报了一个这样的错误 Caused by: java.lang.NullP
  • 有些系统属性定义在frameworks/base/core/java/android/provider/Settings.java文件中,其中分为System、Global、Secure。 调试时,可以通过get和put指令,临时获取和修改相应的属性: 例如: adb shell settings ...
  • Android监听SettingsProvider的数据变化

    千次阅读 2020-10-20 14:58:59
    Android应用和framework层面添加监听器去监听SettingsProvider的数据变化。 监听类:SettingsObserver class SettingsObserver extends ContentObserver { SettingsObserver(Handler handler) { super...
  • ProviderAndroid四大组件之一,是一种数据共享机制(封装数据的接口规范)。是一个数据库的代理,实现跨应用间的数据共享,类似于window服务本身不负责启动和关闭,多个应用可同时访问统一provider。主要类: ...
  • Android Provider

    千次阅读 2010-05-21 14:49:00
    ="vnd.android.cursor.item/vnd.google.note"   />   intent-filter >   <!--  This filter says that we can create a new note inside  of a directory of ...
  • Android FileProvider的基本使用

    千次阅读 2022-03-09 14:17:59
    关于FileProvider FileProvider是一个ContentProvider的子类,它取代了“file://”形式的Uri 通过“content://”形式的Uri实现了App间的安全通信。content Uri 可以赋予你临时的读写权限。当你创建一个包含Content...
  • android7.0+,修改了对私有存储的限制,导致在获取资源的时候,不能通过Uri.fromFile来获取uri了我们需要适配7.0+的机型需要这样写: 1:代码适配  if (Build.VERSION.SDK_INT &gt; 23) {//  intent....
  • Android 7.0的以上的系统中,尝试传递file://URI可能会触发FileUriExposedException FileProvider的这个概述包括以下主题: 1.定义FileProvider 2.指定可用文件 3.检索文件的Content URI 4.授予URI的临时权限 5....
  • Android FileProvider详细解析和踩坑指南

    万次阅读 2019-07-05 18:01:58
    其实很早之前我的应用就已经兼容到Android7.0了,此次写这个文章就是想详细梳理一下android的文件系统,以及做一下FileProvider的解析。 Android7.0 (N) 开始,将严格执行 StrictMode 模式,也就是说,将对安全做...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 105,760
精华内容 42,304
关键字:

android provider

友情链接: AIA.rar