Android-Android内容提供器之运行时权限

---恢复内容开始---

在Android数据持久化的技术中(包括文件存储、SharedPreferences和SQLite),我们发现Google给我们提供的MODE_WORLD_READABLE和MODE_WORLD_WRITEABLE这两种模式,用于给其他的应用程序访问当前应用的数据,但是这两种模式在Android 4.2中版本中被废弃了。为什么呢?因为Google已经不再推荐使用这种方式来实现跨程序数据共享的功能,而是应该使用更加安全可靠的内容提供器技术。

1.内容提供器的简介

内容提供器(Content Provider)主要用于在不同的应用程序之间实现数据共享的功能,它提供了一套完整的机制,允许一个程序访问另一个程序的数据,同时还保证了数据的安全性。目前,使用内容提供器是Android实现跨程序共享数据的标准方式

不同于文件存储和SharedPreferences存储中的两种不同全局可读写操作模式,内容提供器可以选择哪一部分数据进行共享,从而保证我们程序中的隐私数据不会有泄漏的风险。

不过在学习内容提供器之前,我们需要先掌握另外一个非常重要的知识--Android运行权限。

2.运行时权限

为了尽可能保护用户的安全和隐私,Google在Android 6.0版本中推出了运行时权限这个功能,从而能够更好保护用户的安全和隐私。

(1).Android权限机制

在应用开发过程中,应用的某一些功能可能涉及系统的安全性,为了能够保证系统的安全和应用程序正常运行,所以Google引入应用权限这个概念。其实,权限这个东西我们并不陌生,如图:

图中所示的权限是QQ所申请的一部分权限。

Android权限,说的简单一点就是,当一个应用程序进行某一个种操作时,必须经过系统的认可才能被允许操作。比如,一个应用想要使用网络,必须向系统申请网络访问的权限,才能正常的访问。

但是这个仍然不足,因为如果一个应用想要一个权限,那就在AndroidManifest.xml文件中申请,如果是一些危险的权限,比如说直接发短信,或者直接打电话等等权限,如果不经过用户的许可而在安装应用的时候默认许可了,这个就会导致非常严重的问题。

所以,有一些权限必须经过用户的同意才能正常授权,Google在Android 6.0开始就引入了运行时权限,意思就是说,在应用要用到这个的功能的时候,才向系统申请这个权限,而且必须经过用户的许可才能正常的使用。

 (2).在程序运行时申请权限

CALL_PHONE这个权限是在拨打电话的时候会使用到的,因为拨打电话涉及到用户手机费用的问题,所以在列为危险权限。在Android 6.0之前的版本中,这个功能实现起来比较简单

 1 public class MainActivity extends AppCompatActivity  implements View.OnClickListener{
 2     private Button buttonCall = null;
 3     @Override
 4     protected void onCreate(@Nullable Bundle savedInstanceState) {
 5         super.onCreate(savedInstanceState);
 6         setContentView(R.layout.activity_main);
 7         initView();
 8     }
 9     private void initView()
10     {
11         buttonCall = (Button)findViewById(R.id.id_button_call);
12         buttonCall.setOnClickListener(this);
13     }
14     public void onClick(View v) {
15         call();
16     }
17     private void call()
18     {
19         Intent intent = new Intent(Intent.ACTION_CALL);
20         intent.setData(Uri.parse("tel:10086"));
21         startActivity(intent);
22     }
23
24 }

然后再在AndroidManifest.xml文件中申请CALL_PHONE权限

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
 3     package="com.example.android_demo">
 4
 5     <uses-permission android:name="android.permission.CALL_PHONE" />
 6
 7     <application
 8         android:allowBackup="true"
 9         android:icon="@mipmap/ic_launcher"
10         android:label="@string/app_name"
11         android:roundIcon="@mipmap/ic_launcher_round"
12         android:supportsRtl="true"
13         android:theme="@style/AppTheme">
14         <activity android:name=".MainActivity"
15             android:launchMode="singleTask"
16             >
17             <intent-filter>
18                 <action android:name="android.intent.action.MAIN"></action>
19                 <category android:name="android.intent.category.LAUNCHER"></category>
20             </intent-filter>
21         </activity>
22     </application>
23 </manifest>

但是这个代码如果运行在Android 6.0版本之后的话,就会出现问题

原因就是因为这个权限被Google列为了危险权限,在Android 6.0之后就不能直接的在AndroidManifest.xml文件中直接申请,而是要通过动态申请权限的方式来正常的申请

 1 public class MainActivity extends AppCompatActivity  implements View.OnClickListener{
 2     private Button buttonCall = null;
 3     @Override
 4     protected void onCreate(@Nullable Bundle savedInstanceState) {
 5         super.onCreate(savedInstanceState);
 6         setContentView(R.layout.activity_main);
 7         initView();
 8     }
 9     private void initView()
10     {
11         buttonCall = (Button)findViewById(R.id.id_button_call);
12         buttonCall.setOnClickListener(this);
13     }
14     public void onClick(View v) {
15         //检查CALL_PHONE权限时候已经被授权,如果没有的话,进入if语句
16         if(ContextCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED)
17         {
18             //对CALL_PHONE权限的申请,1表示请求码
19             ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CALL_PHONE}, 1);
20         }
21         else
22         {
23             call();
24         }
25
26     }
27     private void call()
28     {
29         Intent intent = new Intent(Intent.ACTION_CALL);
30         intent.setData(Uri.parse("tel:10086"));
31         startActivity(intent);
32     }
33
34     /**
35      * 当我们申请了权限,经过用户的选择(不管是同意还是不同意),系统自动回调这个方法
36      * @param requestCode  请求码
37      * @param permissions  所申请的权限
38      * @param grantResults  权限申请的结果(同意或者拒绝)
39      */
40     @Override
41     public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
42         if(requestCode == 1)
43         {
44             if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED)
45             {
46                 call();
47             }
48             else
49             {
50                 Toast.makeText(this, "权限不允许!", Toast.LENGTH_SHORT).show();
51             }
52         }
53     }
54
55 }

经过上面的改写,我们发现在Android 6.0之后的版本,我们都可以正常的运行,只不过CALL_PHONE权限必须经过用户的选择

被Google列为危险权限还有如下权限

时间: 2024-10-07 18:57:25

Android-Android内容提供器之运行时权限的相关文章

Android 6.0版本以后运行时权限提醒

Android发布6.0以后对app运行所需要的权限提示进行了友好的提示,类似于苹果系统,比如在某个页面要用到打电话的权限,会弹出一个提示框,提示你是否需要同意这个权限,如果同意则app就有了打电话的权限,既可以拨打电话了,不同意则不能拨打电话,只能去设置中勾选,在6.0以前,权限配置都是在AndroidManifest.xml文件中添加例如: <?xml version="1.0" encoding="utf-8"?> <manifest xml

Android 6.0+ 运行时权限探索

原创文章,转载请注明 ( 来自:http://blog.csdn.net/leejizhou/article/details/51511630 李济洲的博客 ) 引言:去年Android 6.0发布后,其新引入的(Requesting Permissions at Run Time)运行时权限就备受开发者关注,随着今年国内手机厂商对6.0系统的普及,觉得大家有必要了解下这个新特性,因为在TargetSDK23+进行开发不注意这些会造成APP运行在6.0+手机上崩溃,这篇博文将对这个新特性进行探索

Android6.0运行时权限(基于RxPermission开源库)

版权声明:本文为博主原创文章,未经博主允许不得转载. 前言 在6.0以前的系统,都是权限一刀切的处理方式,只要用户安装,Manifest申请的权限都会被赋予,并且安装后权限也撤销不了. Android 6.0 采用新的权限模型,只有在需要权限的时候,才告知用户是否授权:是在runtime时候授权,而不是在原来安装的时候 ,同时默认情况下每次在运行时打开页面时候,需要先检查是否有所需要的权限申请. 判断是否是需要运行时权限的标记就是targetSDKVersion. 当targetSDKVersi

Android 6.0 运行时权限管理

android 6.0 对权限进行了严格的管理 新的权限策略讲权限分为两类,第一类是不涉及用户隐私的,只需要在Manifest中声明即可,比如网络.蓝牙.NFC等:第二类是涉及到用户隐私信息的,需要用户授权后才可使用,比如SD卡读写.联系人.短信读写等. Normal Permissions 此类权限都是正常保护的权限,只需要在AndroidManifest.xml中简单声明这些权限即可,安装即授权,不需要每次使用时都检查权限,而且用户不能取消以上授权,除非用户卸载App. ACCESS_LOC

Android 6.0 运行时权限管理最佳实践

Android 6.0 运行时权限管理最佳实践 版权声明:转载必须注明本文转自严振杰的博客: http://blog.yanzhenjie.com 这是一篇迟来的博客,Android M已经发布一年多了(6.0的变化),在Android M中权限系统被重新设计,发生了颠覆性的变化,很多人把握不好这个变化,一是对这个权限策略和套路还没有摸透,二是没有一个很好的实践来支撑,在我的技术开发群里很多人问我关于权限的问题,往往我都没有直接回答,因为这个问题不是一两句说的清楚的,这几点是今天我写这篇博客的原

Android 6.0的运行时权限

原文  http://droidyue.com/blog/2016/01/17/understanding-marshmallow-runtime-permission/ 主题 安卓开发 Android 6.0,代号棉花糖,自发布伊始,其主要的特征运行时权限就很受关注.因为这一特征不仅改善了用户对于应用的使用体验,还使得应用开发者在实践开发中需要做出改变. 没有深入了解运行时权限的开发者通常会有很多疑问,比如什么是运行时权限,哪些是运行时的权限,我的应用是不是会在6.0系统上各种崩溃呢,如何才能

聊一聊 Android 6.0 的运行时权限

权限一刀切 棉花糖运行时权限 权限的分组 正常权限 正常权限列表 特殊权限危险权限 请求SYSTEM_ALERT_WINDOW 请求WRITE_SETTINGS 必须要支持运行时权限么 不支持运行时权限会崩溃么 然而有点糟糕的是 该来的还得来 一个标准的流程 如何批量申请 申请这么多权限岂不是很累 注意事项两个权限 API问题 多系统问题 些许建议 注意 Android 6.0,代号棉花糖,自发布伊始,其主要的特征运行时权限就很受关注.因为这一特征不仅改善了用户对于应用的使用体验,还使得应用开发

Android 6.0 运行时权限处理完全解析

一.概述 随着Android 6.0发布以及普及,我们开发者所要应对的主要就是新版本SDK带来的一些变化,首先关注的就是权限机制的变化.对于6.0的几个主要的变化,查看查看官网的这篇文章http://developer.android.com/intl/zh-cn/about/versions/marshmallow/android-6.0-changes.html,其中当然包含Runtime Permissions. ok,本篇文章目的之一就是对运行时权限处理的一个介绍,以及对目前权限相关的库

Android M 新的运行时权限开发者需要知道的一切

本文来自微凉一季的博客http://jijiaxin89.com/2015/08/30/Android-s-Runtime-Permission/ 更多文章点击跳转微凉一季 tags: 翻译,这是一篇译文. android M 的名字官方刚发布不久,最终正式版即将来临! android在不断发展,最近的更新 M 非常不同,一些主要的变化例如运行时权限将有颠覆性影响.惊讶的是android社区鲜有谈论这事儿,尽管这事很重要或许在不远的将来会引发很严重的问题. 这是今天我写这篇博客的原因.这里有一切