参考一下大神
http://wiki.eoeandroid.com/Permissions
Android是一种特权隔离的操作系统,在Android上运行的每个程序都有自己的独立的系统标识,(Linux用户ID和组id).系统各个部分有不同的身份标识.因此,Linux上运行的各个应用程序相互独立,且和系统无关.
Android安全体系架构设计的核心是在默认情况没有任何一个应用程序可以执行对其他程序,操作系统,或者用户有害的操作,包括读写用户的隐私数据(例如联系人,邮箱),度且其他程序的文件,进行网络访问等等.
由于内核让每个应用程序运行在独立的沙箱中,应用程序必须通过声明所需要而沙箱没有提供的权限来明确分配资源和数据,Android没有才用回事用户体验复杂并且不利于安全的动态授权机智.应用程序静态的声明他们所需要的权限,在程序安装是Android系统会提示用户同意它们获得这些权限.
沙箱程序独立于生成普通应用程序的机智,特别地,Dalvik虚拟机不是一个安全便捷,任何一个应用程序都能够运行本地代码,.所有类型的应用程序--java.native和混合的--均用相同的方式置以相同的方式置以相同的安全等级在沙盒中运行.
所有的Andriod应用程序都必须使用一个开发人员掌握私钥,用于识别应用程序作者的证书进行签名.Android证书的目的是区分用于程序的作者,可以容许操作系统授予或者拒绝应用程序使用签名级别的权限和操作系统授予或者拒绝应用程序请求和其他应用程序相同的Linux身份.
在拨打电话的时候,我们会使用这样的方式:
Uri uri = Uri.parse (
"tel:12345678"
);
Intent intent =
new
Intent(Intent.
ACTION_CALL
, uri);
startActivity(intent);
运行之后发现会报错,
ERROR/AndroidRuntime: java.lang.SecurityException: Permission Denial: 权限拒绝
解决的方式很简单,只要在清单文件中 加上
<
uses-permission
android:name
=
"android.permission.CALL_PHONE"
/>
就可以了
有一次在面试的时候,有个面试官问我一个问题 在使用contentprovider的时候如何不让别的程序访问我的数据,在对方知道我们URL的时候,我说吧一个属性设置为false就可以了,这样其他程序就访问不到了,然后他就问,还有其他方法吗?,然后我就说没有了,今天在看到一篇博客 的时候才发现,其实用自定义权限也是可以完成的,那么如何来自定义权限呢?
首先创建一个定义权限的项目,PermissionMain,
然后在清单文件中自定义权限
<
permission
android:name
=
"com.android.permission.MY_PERMISSION"
android:protectionLevel
=
"normal"
>
</
permission
>
我们还需要其他程序启动的类里面加上权限
<
activity
android:name
=
"com.example.permissionmain.MainActivity"
android:label
=
"@string/app_name"
android:permission
=
"com.android.permission.MY_PERMISSION"
>
再创建一个用于开启PerssionMain的类, Permission
然后开启界面
Intent intent =
new
Intent();
intent.setClassName(
"com.example.permissionmain"
,
"com.example.permissionmain.MainActivity"
);
startActivity(intent);
我们会发现这和我们之前在调用拨打电话的时候的时候没有加权限的时候报了一样的错
,
ERROR/AndroidRuntime: java.lang.SecurityException: Permission Denial: 权限拒绝
这时候我们就
要开启我们定义好需要权限的Actiivty,所以就需要在清单文件中加入所需要的权限,其实我们在调用系统上网的权限时候也是一样的原理
<
uses-permission
android:name
=
"com.android.permission.MY_PERMISSION"
/>
最后是开启Actiivty
Intent intent =
new
Intent();
intent.setClassName(
"com.example.permissionmain"
,
"com.example.permissionmain.MainActivity"
);
startActivity(intent); 然后就开启成功了,这样我们就实现了
除了Actiivty,其他的组件也可以通过它来限制其他程序访问
-
- 当调用系统调用时,阻止应用程序执行特定的功能。
-
- 当启动一个Activity时,阻止应用程序启动其他应用程序的Activity。
-
- 在发送或接受广播时,控制谁可以接受你的广播或者谁可以向你发送广播。
-
- 谁可以访问或操作一个特定的内容提供者。
-
- 绑定或者启动一项服务。
传送门
- 绑定或者启动一项服务。