本文主要內容:簡單介紹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邏輯代碼
邏輯梳理:
-
點擊按鈕,進行判斷權限是否需要申請;
-
若無權限,進行申請權限;
-
若有權限,直接進行撥打電話號碼。
//點擊事件
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.機制上使用,因爲高版本兼容低版本。