最近利用下班时间,找了看什么书比较适合初学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,运行结果

第一步:运行程序

                                   

android第一行代码第二版 安卓第一行代码第二版_权限

第二步:点击“打电话”按钮

                                   

android第一行代码第二版 安卓第一行代码第二版_权限_02

第三步:在弹出框中授予权限

                                    

android第一行代码第二版 安卓第一行代码第二版_Android运行时申请权限_03

第四步:操作到第三步,然后拒绝权限授予在此之前,你需要首先把该APP的打电话权限关闭

 

                                    

android第一行代码第二版 安卓第一行代码第二版_危险权限_04

                                    

android第一行代码第二版 安卓第一行代码第二版_android第一行代码第二版_05

                                  

android第一行代码第二版 安卓第一行代码第二版_运行时权限_06

思考:

(1)我使用的Android 6.0模拟器,你可以试试低于该版本的模拟器试试

(2)运行时权限授权,需不需要在主配置文件中声明

(3)我使用Android 6.0以下版本代码在Android 6.0以上版本运行,结果会怎么样(这里代码就是指我注释的那部分

总结:关于Android中的权限就简单介绍到这里。后续在使用内容提供者的时候会经常用到,所以先简单说一下