首页 > 其他分享 >Android学习笔记(五十):声明、请求和检查许可

Android学习笔记(五十):声明、请求和检查许可

时间:2023-04-09 13:38:36浏览次数:40  
标签:许可 permission 笔记 manifest provider 授权 Android 五十


基于安全需求,应用对Android系统提供的content provider或者service的访问需要在安装时进行许可,这就是AndroidManifest.xml文件中的permission中声称,之前已经很多例子。同样如果其他应用要访问我们的数据,我们也可以要求这些应用必须获得用户授权方可访问我们的数据。

申请授权:请求permission

申请许可的格式为

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

Android系统所提供的均已android.permission开头,具体的定义参见reference中Manifest.permission的定义。例如INTENET,WRITE_EXTERNAL_STORAGE, ACCESS_COARSE_LOCATION(粗定位)、ACCESS_FINE_LOCATION,CALL_PHONE。第三方应用将有他们定义自定义的许可。

在安装的时候,系统会提示用户是否同意许可。但是如果通过USB安装,即开发模式,系统将不会出现提示。如果用户不授权,将不被安装和运行。如果在AndroidMenifest.xml中忘了申请授权,则会抛出SecurityException的异常信息。

要求访问者须获得授权:声明permission

如果应用有content provider或者服务,例如按有私人信息,基于安全,同样可要求对其他程序访问进行安全控制。声明permission比请求要复杂些,如下:

<!-- 包括三个部分:(1)android:name,为了避免出现冲突,使用应用的Java的命名空间作为前缀 -->
 <permission android:name="com.wei.android.learning.READ_GRAVITY"
                      <!-- permission的标签说明,简单明了 -->
                      android:label="@string/read_gravity_label"
                      <!-- 对permission的进一步说明,比标签要长和详细 -->
                      android:description="@string/read_gravity_description" />

上面只是对这是个可能的permission进行定义,要真正起到保护还需要近一步声明在那里需要保护,可以通过下面两种方式之一。

方式一:在AndroidManifest中表明要求强制许可

这种方式简单。如果对于provider,有readPermission和writePermission,我们在上面已经将读的许可进行了定义,可以被外部引用。例子如下:

<provider android:name=".GravityProvider" android:authorities="com.wei.android.learning.provider"
   android:readPermission="com.wei.android.learning.READ_GRAVITY"
   android:writePermission="com.wei.android.learning.WRITE_GRAVITY" />

若某个应用要通过这个content provider访问数据,如果忘了在manifest中请求许可,运行则会报错,如下图所示。



Android学习笔记(五十):声明、请求和检查许可_android

 

为了访问该content provider,应用应在manifest中申请许可,在安装时,用户授权后,才能有权限通过该provider来读取信息。本例如下:

<uses-permission android:name="com.wei.android.learning.READ_GRAVITY" />

除了provider之外,activity,service,receiver都可以申明要求许可,增加参数android:permission即可,以activity为例,如下:

<activity  android:name=".xxxxx"  android:label="yyyyyy"  android:permission="com.wei.android.learning.MY_PERMISSION">
   <intent-filter>     … …   </intent-filter> 
 </activity>

对于安全架构而言,如果要求了声明了permission,对于activity,没有许可,则无法启动该activity;对于service,没有许可,则无法启动、停止、绑定activity;对于Intent receiver,没有许可,则会忽略通过sendBroadcast( )发送的消息。

方式二:在代码中声明

我们也可以在代码中要求检查权限。请注意,仍需在manifest中对权限进行声明。我们仍以content Provider为例子。我们首先在manifest中声明一个新的permission:<user-permission andriod:name="com.wei.android.learning.MYTEST">。我们将在读数据时进行检查。

public Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder){ 
     if ( getContext().checkCallingPermision(“com.wei.android.leanring.MYTEST”) !=PackageManager.PERMISSION_GRNTED )  
        throw new SecurityException(“Required <com.wei.android.learning.MYTEST> Permission”);
     } 
     … … 
 }

也可用于service,或者在sendBroadcast( )中进行检查。对于service,如果提供多种级别的权限,例如只读,读写,我们可以在代码中根据权限的级别进行处理,而在manifest中只能提供一种权限,对于多种权限,考虑在代码中区分。对于sendBroadcast( ),如果没有获得权限,则不能接收该广播消息。

一些注意

由于是否获得许可不是在编译时检查,而是在运行是发现,如果我们提供的API要求许可,包括content provider,service,将被其他activity调取的intent,都应当在文档中声明。另外,我们也应当详细告知用户,使他们在安装时给予许可。这也就是为何在permission声明中使用了@string/xxxx的方式,方便多国语言的使用。

Android系统有时会增加一些许可,而之前版本是没有,这会造成以前编写程序的许可授权问题。Android的解决方式如下,在manifest中定义最新版本x:<uses-sdk android:minSdkVersion="x">,例如x=3,表明应用定义的最低版本为Android 1.5版本,那么在安装时,系统自动将以后增添的许可全列上,请求用户授权。

Android的许可方式也有一定的限制。例如所有的许可必须在安装时被授权,哪怕极少使用到的许可,不能在以后授权;用户授权只能同意或者不同意,没有可选的授权方式,例如授权一部分,不授权另一部分。


标签:许可,permission,笔记,manifest,provider,授权,Android,五十
From: https://blog.51cto.com/u_9877302/6178789

相关文章

  • VisionMobile:移动平台生态系统冲突报告(八)Chapter C:Android(下)
    开发者的采纳2011年10月,AndroidMarket有30万应用,紧随Apple,是第二大的平台应用商店。功能丰富和易于学习的应用架构,强大的SDK,结合不断增长的手机数量,使大量开发者从PC领域和移动领域(Symbian,J2ME,WindowsMobile,和PalmOS)进入Android。在我们2011年开发者经济学研究中,Android名列开发......
  • VisionMobile:移动平台生态系统冲突报告(七)Chapter C:Android(上)
    操作系统来自Google在2005年收购的Android公司,该创业公司由ex-Danger和T-Mobile高管在SideKick开发后成立。SideKick是在青少年和一些名人中流行的移动设备。2007年11月,Google与合作伙伴宣布成立开发手机联盟(OHA),公布了开发名为Android的开源移动操作系统的业界承诺签署。在平台开......
  • Idea点击Run或者Debug无法启动项目_调试按钮按下以后变灰色_一会又恢复成绿色_但项目
    这个现象很烦人,点击了无数次了,就是项目启动不起来,很郁闷后来终于弄明白了,是这里,点击settings,然后找到这个runner这里,然后左上角这个delegateIDE...这个把勾去掉,去掉就可以了. 可以看到去掉以后,然后再点击运行可以看到,就已经显示正在运行中了. 终于弄好~......
  • Lasso回归_ElasticNet回归_PolynomialFeatures算法介绍---人工智能工作笔记0032
    然后我们再来看这个ridge回归,可以看到这里的这个岭回归,可以看到他的损失函数,其实就是添加了一个使用L2的正则化的,惩罚项对吧,目的是为了增强,损失函数的泛化能力,这里的alpha,实际上作用是为了,调整,这个损失函数的,正确率多一点还是泛化能力强一点. 可以看到他的使用函数的方......
  • ava: 程序包com.alibaba.nacos.api.common不存在_RuoYi-Cloud-Plus-master_jar包不存
    来看看原因吧,jar包是存在的,但是就是在idea中引用不到,来看看怎么回事: 原来就是这个包找不到,但是从下面看是有的: 但是注意,这里的com.alibaba.nacos.api...原来可不是这样的,这个是我后来修改过的,原来是只有com.alibaba.nacos.common,而引用的是com.alibaba.nacos.api.commo......
  • ruoyi-cloud微服务版启动过程报错_20230320版_ Verion 9 of Highlight.js has reached
      Verion9ofHighlight.jshasreachedEOL. Itwillnolonger报错: 这里修改成10.7.3版本D:\2023\qdBigData\RuoYi-Cloud-master\ruoyi-ui>npminstall--registry=https://registry.npm.taobao.org然后到对应目录,再去执行编译去看看.不报错了 >npmrundev然后执行看......
  • Java for Web学习笔记(二六):JSTL(2)Core Tag(上)
    可以在JSP中替代Java代码的几乎所有功能,包括条件编程,循环,迭代和内容输出。taglib的directive如下:<%@taglibprefix="c"uri="http://java.sun.com/jsp/jstl/core"%><c:out>AttributesNameRequiredRequest-timeTypeDescriptionvaluetruetruejava.lang.StringExpression......
  • Java for Web学习笔记(三):Servlet(1)Maven
    什么是Maven在http://maven.apache.org/中对Mavent进行介绍,可以:一、发布project信息二、管理Jar包三、提供uniformbuildsystem,使用POM(projectobjectmodel)如果我们使用Eclipse是最新的Mars版本,Maven已经集成进来,所以不需要进行额外的配置,当然,如果我们需要自行安装一个特定位......
  • Pro Android学习笔记(九):了解Content Provider(下下)
    Contentprovider作为信息的读出,比较常见的还有文件的读写,最基础的就是二进制文件的的读写,例如img文件,音频文件的读写。在数据库中存放了该文件的路径,我们可以通过ContentProvider获得InputSream和OutputStream,实现对文件的操作。ProAndroid4.0提及有关内容,但语焉不详,可同时参考h......
  • Pro Android学习笔记(八):了解Content Provider(下中)
    在之前提供了小例子BookProvider,我们回过头看看如何将通过该ContentProvider进行数据的读取。(1)增加privatevoidaddBook(Stringname,Stringisbn,Stringauthor){/*从ContentProvider的insert()方法的参数可以看到,通过ContentValues来进行数据的传递。ContentValues是k......