Android6.0運行時權限

本文主要內容:簡單介紹Android6.0權限、權限區分、基本使用;用簡單的demo進行對Android6.0運行時權限入門瞭解。

從androi 6.0開始,不再是安裝應用時用戶確定獲得全部的權限.而是在使用軟件過程中需要該權限時,彈出對話框讓用戶選擇權限.不僅如此,用戶選擇權限後還可以關閉。

Android 6.0 運行時權限的介紹

在保護用戶隱私方面:Android6.0爲了更好的保護個人隱私,添加了運行時權限:分爲兩類,一類是Normal Permissions,這類權限不涉及個人隱私,不需要用戶進行授權,比如手機震動,訪問網絡;一類是Dangerous Permissions,這類權限涉及個人隱私,需要用戶進行授權,比如讀取SD卡,訪問通訊錄等。

在用戶操作方面:當執行敏感操作之前彈出對話框,請求權限,可以拒絕,可以同意;可以在設置頁面對APP的權限進行查看,以及對單個權限進行授權或者解除授權。

正常權限和危險權限羅列:

 Normal Permissions:

WRITE_SYNC_SETTINGS 寫同步設置
WAKE_LOCK 喚醒鎖
VIBRATE 顫動
USE FINGERPRINT 使用指紋
UNINSTALL_SHORTCUT 卸載快捷方式
TRANSMIT_IR 紅外傳輸
SET_WALLPAPER_HINTS 壁紙設置提示
SET_WALLPAPER 設置壁紙
SET_TIME_ZONE 設置時區
SET_ALARM 設置鬧鐘
REQUEST_INSTALL_PACKAGES 請求安裝包
REORDER_TASKS 重新排序的任務
RECEIVE_BOOT_COMPLETED 收到啓動完成
READ_SYNC_STATS 讀同步數據
NFC
MODIFY_AUDIO_SETTINGS 修改音頻設置
KILL_BACKGROUND_PROCESSES 殺死後臺進程
INTERNET 網絡
INSTALL_SHORTCUT 安裝快捷方式
GET PACKAGE SIZE 得到包的大小
EXPAND_STATUS_BAR 擴大狀態欄
DISABLE_KEYGUARD 禁用鍵盤守衛
CHANGE_WIFI_STATE 更改無限網絡狀態
CHANGE_WIFI_MULTICAST_STATE 改變無限多播狀態
CHANGE_NETWORK_STATE 改變網絡狀態
BROADCAST_STICKY 粘性廣播
BLUETOOTH_ADMIN 藍牙管理
BLUETOOTH 藍牙技術
ACCESS_WIFI_STATE 訪問無限網絡狀態
ACCESS_NOTIFICATION_POLICY 訪問通知策略
ACCESS_NETWORK_STATE 訪問網絡狀態
ACCESS_LOCATION_EXTRA_COMMANDS 訪問地點額外的命令

Dangerous Permissions(9組24個):

group:android.permission-group.CONTACTS 通訊錄方面 
permission:android.permission.WRITE_CONTACTS 寫入通訊錄 
permission:android.permission.GET_ACCOUNTS 訪問通訊錄權限 
permission:android.permission.READ_CONTACTS 讀取通訊錄

group:android.permission-group.PHONE 電話方面 
permission:android.permission.READ_CALL_LOG 看電話記錄 
permission:android.permission.READ_PHONE_STATE 讀取手機狀態 
permission:android.permission.CALL_PHONE 打電話 
permission:android.permission.WRITE_CALL_LOG 編寫調用日誌 
permission:android.permission.USE_SIP 使用SIP 
permission:android.permission.PROCESS_OUTGOING_CALLS 過程輸出調用 permission:com.android.voicemail.permission.ADD_VOICEMAIL 添加語音信箱

group:android.permission-group.CALENDAR 日曆 
permission:android.permission.READ_CALENDAR 讀取日曆 
permission:android.permission.WRITE_CALENDAR 寫入日曆 

group:android.permission-group.CAMERA 照相機 
permission:android.permission.CAMERA

group:android.permission-group.SENSORS 傳感器 
permission:android.permission.BODY_SENSORS 體傳感器

group:android.permission-group.LOCATION 位置 
permission:android.permission.ACCESS_FINE_LOCATION 獲取好位置 
permission:android.permission.ACCESS_COARSE_LOCATION 

獲取粗定位group:android.permission-group.STORAGE 存儲 
permission:android.permission.READ_EXTERNAL_STORAGE 讀取外部存儲器 permission:android.permission.WRITE_EXTERNAL_STORAGE 寫外部存儲器

group:android.permission-group.MICROPHONE 擴音器;麥克風 
permission:android.permission.RECORD_AUDIO 錄音

group:android.permission-group.SMS 信息 
permission:android.permission.READ_SMS 讀取信息 
permission:android.permission.RECEIVE_WAP_PUSH 收到WAP推送 
permission:android.permission.RECEIVE_MMS 接收彩信 
permission:android.permission.RECEIVE_SMS 收信息 
permission:android.permission.SEND_SMS 發信息 

基本寫法

1、在AndroidManifest添加危險性權限

    <!--電話權限-->
    <uses-permission android:name="android.permission.CALL_PHONE"/>

2、在代碼中,對權限危險性權限進行判斷

if (view != null) {
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) !=
                PackageManager.PERMISSION_GRANTED) {
            //對權限進行申請
        } else {
           // 直接處理邏輯
        }
    }

PERMISSION_DENIED:權限未授權;PERMISSION_GRANTED:權限授權

false:已經授權 ----進行其他邏輯

true:未授權---需要去請求權限:

3、通過ActivityCompat類的requestPermissions方法進行請求權限

 ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CALL_PHONE}, 1);

三個參數分別是:context 要請求權限的數組 請求碼(返回時使用)

4、回調到onRequestPermissionsResult方法當中並返回三個參數int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults;分別是 請求碼、申請的權限、對應的下標此方法在Activity和Fragment中才能重寫

 

代碼

1、AndroidManifest 在清單文件中添加危險性權限

    <!--電話權限-->
    <uses-permission android:name="android.permission.CALL_PHONE"/>

2、xml 在佈局上添加一個按鈕

<Button
    android:textSize="26sp"
    android:onClick="btnClick"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"
    android:text="Permission"/>

3、Java 在MainActiviy中寫Java邏輯代碼

邏輯梳理:

  1. 點擊按鈕,進行判斷權限是否需要申請;

  2. 若無權限,進行申請權限;

  3. 若有權限,直接進行撥打電話號碼。

//點擊事件
public void btnClick(View view) {
    if (view != null) {
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) !=
                PackageManager.PERMISSION_GRANTED) {
            //context   要申請的權限數組    請求碼
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CALL_PHONE}, 1);
        } else {
            makeCall();
        }
    }
}

//撥打電話
public void makeCall() {
    try {
        Intent intent = new Intent(Intent.ACTION_CALL);
        intent.setData(Uri.parse("tel:1234567890"));
        startActivity(intent);
    } catch (SecurityException e) {
        e.printStackTrace();
    }
}

/**
 * 用戶請求授權的結果
 *
 * @param requestCode  請求碼
 * @param permissions  權限
 * @param grantResults 下標
 */
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
                                       @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    switch (requestCode) {
        case 1:
            if (grantResults.length > 0 && grantResults[0] == PackageManager
                    .PERMISSION_GRANTED) {
                //同意權限申請
                makeCall();
            } else {
                //拒絕申請申請
                Toast.makeText(MainActivity.this, "您拒絕了權限", Toast.LENGTH_SHORT).show();
            }
            break;
        default:
            break;
    }
}

簡單的Demo已經寫好啦,快動手試試吧。

注意事項:

在使用6.0新特性的時候,AndroidSdk版本targetSdkVersion設置爲23或更高;如果我們不想使用6.0或者7.0的新特性,那麼我們把targetSdkVersion設置22,就可以很好的避開動態配置運行時權限。而targetSdkVersion設置爲22,並不影響其在Android 6.0或7.機制上使用,因爲高版本兼容低版本。

 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章