在开发Android应用的时候,我们常需要在AndroidManifest.xml 中添加一些权限。才能完成对应的功能。如调用电话簿,让手机震动等等。
那么什么是权限呢?
其实权限一种应用程序级的安全机制,他可以限制对应用程序组件的访问。权限可以组织对应用程序的恶意破坏,来限制对敏感信息,硬件资源或者外部通信信道的过度使用。总之就是让你的应用程序更加安全,合理。
在AndroidManifest.xml我们常常使用两种标签来添加权限。“<permission/>”和“<uses-permission/>”这两个权限标签有什么区别么?
permission
<permission/>标签:添加自定义权限,防止其他应用程序随意访问你的数据或者代码接口等。如果想访问你的应用程序的接口或者数据等,就必须在他的代码中使用<uses-permission/>来添加你自己定义的权限。才可以方位你的应用程序。
简单说就是告诉其他程序,必须有你自定义权限,才可以访问你的应用程序的接口或者数据等;
用途:例如你的应用对外提供了数据或者接口等,但你并不想让所有应用程序访问,这时候你就可以使用<permission/>来指定权限啦。其他应用必须含有你自定义的权限,才可以访问你的程序。
代码:
<permission
android:description="@stirng/my_permission" android:icon="drawable resource" android:label="我自定义权限" android:name="权限的名字string类型的值" android:permissionGroup="权限所属的分组string类型的值" android:protectionLevel=["normal" | "dangerous" | "signature" | "signatureOrSystem"]
/>
android:name :属性是必须的,其他的可选,未写的系统会指定默认值
android:description :权限的详细描述,比lable长,一般是两句话,第一句话描述这个权限所针对的操作,第二句话告诉用户授予app这个权限会带来的后果,这个值必须从resource中读取。
例如这里是:@stirng/my_permission
android:label:对权限的简短描述,显示给用户看的,值可是一个string数据,例如这里的“我自定义权限”。
android:name :权限的名字,这个值必须是唯一的,否则会造成权限冲突。最好使用“包名”+“权限名”或者其他有意义的组合,其他app想要访问你的应用程序需要添加这个名字的权限。
android:permissionGroup: 权限所属权限组的名称
android:protectionLevel:权限的级别,分为4个级别:
(1)normal:低风险权限,在安装的时候,系统会自动授予权限给app,不会提示用户。
(2)dangerous:对应的操作有安全风险,系统在安装声明此类权限的app时会提示用户
(3)signature:签名权限,只针对使用同一个证书签名的app开放
(4)signatureOrSystem :引用该权限的app需要有和系统同样的签名才能授予的权限,一般不推荐使用。
如果想调用上面应用程序里的数据代码接口等。就需要在自己的AndroidManifest.xml中使用uses-permission添加上面定义的权限:
uses-permission
<uses-permission/>标签:给应用程序添加权限的时候使用。如你访问手机的震动器,NFC等功能。就需要使用这个标签来添加权限。或者你想访问其他应用程序的时候,你就要使用这个标签来添加对方自定义的权限支持。
例如让手机震动权限:
<uses-permission android:name="android.permission.VIBRATE"/>
android:name 权限名字
关于组件使用权限:
Activity:添加一个权限来限制其他应app来启动此Activity。
BroadcastReceiver:控制哪些app可以向你的接收器发送消息。
intent:筛选哪些BroadcastReceiver可以接收Broadcast Intent。
Service:限制其他app启动或者绑定此Service。
content provider:限制其他app对content provider的读取,写入操作的权限
Activity:
<activity android:name=".MyAcitivity" android:lable="@string/app_name" android:permission="com.test.my_device"/>
Service:
<Service android:name=".MyService" android:permission="com.test.my_device"/>
Receiver:
<receiver android:name=".MyReceiver" android:permission="com.test.my_device"> <intent-filter> <action android:name="com.test.my_device"/> </intent-filter> </receiver
Provider
可以通过设置 writepermission 和 readpermission可以增加细粒度更高的 读 写 权限控制
<provider android:name=".MyProvider" android:authorities="com.test.myprovider" android:writePermission="com.test.wirte_dervice" android:readPermission="com.test.read_dervice""/>