最近利用下班时间,找了看什么书比较适合初学android的朋友,很多人推荐了这本书,于是就买了一本,感觉看书,思考,动手,再思考和总结这样过程还是很有必要的,于是就打算把自己学习的东西简单的总结一下;方便自己以后查找,也有利于学习的巩固。在这里首先要感谢一下书籍的作者——郭霖前辈。
我们在手机上安装APP的时候,经常会出现要授予例如允许获取通讯录,短信等的权限;还有就是在有些时候,我们在使用一个APP的时候,比如发一张游玩图片到某个APP上时,通常都会要求获取GPS位置的权限等;其实上面所述都是关于Android权限授予的两种现象,不同的是,一个是安装时授权,一个是运行时授权;那么,有什么不同吗?答案是显然的;如果一个APP你觉得很好,但是它的其中一个功能需要获取你的通讯录,但是了你又不想授予;那么因为这一个权限或者说其中的某一个功能而不去使用一个好的APP,你感觉很难受也很不合理。所以,在Android 6.0及之后提出上面所述的第二种现象,运行时权限授予。顾名思义,就是在安装的时候并不需要授予该APP所以功能所需的所有权限;只有在用到部分功能时才需要对应部分的权限授予。这样,就合理很多了是不是。下面就来看看两种实现的区别。示例代码下载链接
1,危险权限总结
上面说的运行时授权只是针对Android中的危险权限,下面就来看看Android中有哪些危险权限:
(1)CALENDER :READ_CALENDER, WRITE_CALENDER;
(2)CAMERA :CAMERA
(3)CONTACTS : READ_CONTACTS, WRITE_CONTACTS, GET_ACCOUNTS
(4)LOCATION : ACCESE_FINE_LOCATION, ACCESE_COARSE_LOCATION
(5)MICROPHONE: RECORD_AUDIO
(6)PHONE: READ_PHONE_STATE, CALL_PHONE, READ_CALL_LOG,WRITE_CALL_LOG, ADD_VOICEMAIL,
USE_SIP, PROCESS_OUTGOING_CALLS
(7)SENSOR : BODY_SENSORS
(8)SMS: SEND_SMS,RECEIVE_SMS,READ_SMS,RECEIVE_WAP_PUSH,RECEIVE_MMS
(9)STORAGE: READ_EXTERNAL_STIRAGE,WRITE_EXTERNAL_STORAGE
好吧,终于写完了,其实网上到处都有,我也不知道为什么要一个一个打出来,以上就是Android中的24个危险权限。
2,示例代码
上面写了很多,下面示例我就直接使用书上的代码了,流程全部都是一样的,只是权限不一样而已。
MainActivity.java代码:
package com.hfut.runtimepemissiondemo;
import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
/**
* Android 6.0之前的实现,当然还要配合主配置文件权限授予一起使用
*/
// public void dial(View view){
// Intent intent=new Intent(Intent.ACTION_CALL);
// intent.setData(Uri.parse("tel:10010"));
// startActivity(intent);
// }
/**
* Android 6.0之后的实现
*
*/
public void dial(View view){
if(ContextCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE)!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.CALL_PHONE},1);
}
else{
makeCall();
}
}
private void makeCall() {
Intent intent=new Intent(Intent.ACTION_DIAL);
intent.setData(Uri.parse("tel:10010"));
startActivity(intent);
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode){
case 1:
if(grantResults.length>0&&grantResults[0]==PackageManager.PERMISSION_GRANTED){
makeCall();
}
else{
Toast.makeText(this,"你已经拒绝了该权限",Toast.LENGTH_SHORT).show();
}
break;
default:
}
}
}
layout_main.xml代码:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.hfut.runtimepemissiondemo.MainActivity">
<Button
android:onClick="dial"
android:text="打电话"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
主配置文件AndrodiManifest.xml代码:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.hfut.runtimepemissiondemo">
<uses-permission android:name="android.permission.CALL_PHONE"></uses-permission>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
3,运行结果
第一步:运行程序
第二步:点击“打电话”按钮
第三步:在弹出框中授予权限
第四步:操作到第三步,然后拒绝权限授予(在此之前,你需要首先把该APP的打电话权限关闭)
思考:
(1)我使用的Android 6.0模拟器,你可以试试低于该版本的模拟器试试
(2)运行时权限授权,需不需要在主配置文件中声明
(3)我使用Android 6.0以下版本代码在Android 6.0以上版本运行,结果会怎么样(这里代码就是指我注释的那部分)
总结:关于Android中的权限就简单介绍到这里。后续在使用内容提供者的时候会经常用到,所以先简单说一下。
注:欢迎扫码关注