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

眼前多少难甘事,自古男儿当自强。这篇文章主要讲述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引入应用权限这个概念。其实,权限这个东西我们并不陌生,如图:

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

文章图片

图中所示的权限是QQ所申请的一部分权限。
  Android权限,说的简单一点就是,当一个应用程序进行某一个种操作时,必须经过系统的认可才能被允许操作。比如,一个应用想要使用网络,必须向系统申请网络访问的权限,才能正常的访问。
  但是这个仍然不足,因为如果一个应用想要一个权限,那就在AndroidManifest.xml文件中申请,如果是一些危险的权限,比如说直接发短信,或者直接打电话等等权限,如果不经过用户的许可而在安装应用的时候默认许可了,这个就会导致非常严重的问题。
  所以,有一些权限必须经过用户的同意才能正常授权,Google在Android 6.0开始就引入了运行时权限,意思就是说,在应用要用到这个的功能的时候,才向系统申请这个权限,而且必须经过用户的许可才能正常的使用。
  (2).在程序运行时申请权限
  CALL_PHONE这个权限是在拨打电话的时候会使用到的,因为拨打电话涉及到用户手机费用的问题,所以在列为危险权限。在Android 6.0之前的版本中,这个功能实现起来比较简单
1 public class MainActivity extends AppCompatActivityimplements View.OnClickListener{ 2private Button buttonCall = null; 3@Override 4protected void onCreate(@Nullable Bundle savedInstanceState) { 5super.onCreate(savedInstanceState); 6setContentView(R.layout.activity_main); 7initView(); 8} 9private void initView() 10{ 11buttonCall = (Button)findViewById(R.id.id_button_call); 12buttonCall.setOnClickListener(this); 13} 14public void onClick(View v) { 15call(); 16} 17private void call() 18{ 19Intent intent = new Intent(Intent.ACTION_CALL); 20intent.setData(Uri.parse("tel:10086")); 21startActivity(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" 3package="com.example.android_demo"> 4 5< uses-permission android:name="android.permission.CALL_PHONE" /> 6 7< application 8android:allowBackup="true" 9android:icon="@mipmap/ic_launcher" 10android:label="@string/app_name" 11android:roundIcon="@mipmap/ic_launcher_round" 12android:supportsRtl="true" 13android:theme="@style/AppTheme"> 14< activity android:name=".MainActivity" 15android: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版本之后的话,就会出现问题
Android-Android内容提供器之运行时权限

文章图片

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

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

文章图片

被Google列为危险权限还有如下权限
Android-Android内容提供器之运行时权限

文章图片

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

    推荐阅读