Android6.0 動態權限 筆錄
導航:
- Android6.0 動態權限申請程序
- 普通權限與動態權限
- 完整代碼
在Android6.0中,系統權限被分為兩大類:一類是Normal Permissions,這類權限一般不涉及用戶隱私,是不需要用戶進行授權的,比如手機震動、訪問網絡等;另一類是Dangerous Permission,一般是涉及到用戶隱私的,需要用戶進行授權,比如讀取sdcard、訪問通訊錄等。
一、Android6.0 動態權限申請程序
當我們的Android工程的targetSdkVersion大于等于23的時候,對于Dangerous Permission,我們就需要手動編寫邏輯代碼實現權限的授權申請。
以申請相機權限為例,首先,需要在配置文件AndroidManifest中申請我們需要的權限:
<!-- 相機 -->
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.hardware.camera.autofocus" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.BROADCAST_STICKY" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
第二步,我在需要使用相機權限的地方進行權限申請操作。首先判斷當前系統是否為Android6.0或之上的版本,如果不是,直接直接執行下一步,否則進入權限申請程序:
首先,checkSelfPermission檢查該權限是否已經申請;
shouldShowRequestPermissionRationale檢查用戶是否已經拒絕過一次了,再次彈出授權框詢問并解釋為什么需要這個權限;
ActivityCompat.requestPermissions進行權限申請,申請的結果在onRequestPermissionsResult中接收。
//SDK版本為Android6.0以上
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
//檢查權限
int checkPermissionCamera = ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CAMERA);
if(checkPermissionCamera != PackageManager.PERMISSION_GRANTED){
Log.d(Tag, "權限還沒有申請");
if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this,
Manifest.permission.CAMERA)){
Log.d(Tag, "用戶已經拒絕一次了,再次彈出授權框詢問并解釋為什么需要這個權限");
}
else {
//申請授權
Log.d(Tag, "申請授權");
ActivityCompat.requestPermissions(MainActivity.this
//要申請的權限
, new String[]
{
Manifest.permission.CAMERA
}
//申請請求返回碼
, 100);
}
}
else{
Log.d(Tag, "權限已經申請");
}
}</code></pre>
onRequestPermissionsResult:
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults){
switch (requestCode){
case 100:{
if(permissions[0].equals(Manifest.permission.CAMERA) && grantR
esults[0] == PackageManager.PERMISSION_GRANTED){
Log.d(Tag, "CAMERA 權限授權成功");
}
else{
Log.d(Tag, "用戶拒絕授權權限 CAMERA");
}
break;
}
}
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
各種情況下的程序運行流程:
1、已經授權:

1.png
2、未授權,授權框點擊允許:

2.png
3、未授權,授權框點擊拒絕:

3.png
二、普通權限與動態權限
1、普通權限
android.permission.ACCESS_LOCATION_EXTRA_COMMANDS
android.permission.ACCESS_NETWORK_STATE
android.permission.ACCESS_NOTIFICATION_POLICY
android.permission.ACCESS_WIFI_STATE
android.permission.ACCESS_WIMAX_STATE
android.permission.BLUETOOTH
android.permission.BLUETOOTH_ADMIN
android.permission.BROADCAST_STICKY
android.permission.CHANGE_NETWORK_STATE
android.permission.CHANGE_WIFI_MULTICAST_STATE
android.permission.CHANGE_WIFI_STATE
android.permission.CHANGE_WIMAX_STATE
android.permission.DISABLE_KEYGUARD
android.permission.EXPAND_STATUS_BAR
android.permission.FLASHLIGHT
android.permission.GET_ACCOUNTS
android.permission.GET_PACKAGE_SIZE
android.permission.INTERNET
android.permission.KILL_BACKGROUND_PROCESSES
android.permission.MODIFY_AUDIO_SETTINGS
android.permission.NFC
android.permission.READ_SYNC_SETTINGS
android.permission.READ_SYNC_STATS
android.permission.RECEIVE_BOOT_COMPLETED
android.permission.REORDER_TASKS
android.permission.REQUEST_INSTALL_PACKAGES
android.permission.SET_TIME_ZONE
android.permission.SET_WALLPAPER
android.permission.SET_WALLPAPER_HINTS
android.permission.SUBSCRIBED_FEEDS_READ
android.permission.TRANSMIT_IR
android.permission.USE_FINGERPRINT
android.permission.VIBRATE
android.permission.WAKE_LOCK
android.permission.WRITE_SYNC_SETTINGS
com.android.alarm.permission.SET_ALARM
com.android.launcher.permission.INSTALL_SHORTCUT
com.android.launcher.permission.UNINSTALL_SHORTCUT
2、危險權限

三、完整代碼
package com.peos.permissiondemo;
import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Build;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
private static final String Tag = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
((Button)findViewById(R.id.btn_signle)).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//SDK版本為Android6.0以上
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
//檢查權限
int checkPermissionCamera = ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CAMERA);
if(checkPermissionCamera != PackageManager.PERMISSION_GRANTED){
Log.d(Tag, "權限還沒有申請");
if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this,
Manifest.permission.CAMERA)){
Log.d(Tag, "用戶已經拒絕一次了,再次彈出授權框詢問并解釋為什么需要這個權限");
}
else {
//申請授權
Log.d(Tag, "申請授權");
ActivityCompat.requestPermissions(MainActivity.this
//要申請的權限
, new String[]
{
Manifest.permission.CAMERA
}
//申請請求返回碼
, 100);
}
}
else{
Log.d(Tag, "權限已經申請");
}
}
}
});
}
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults){
switch (requestCode){
case 100:{
if(permissions[0].equals(Manifest.permission.CAMERA) && grantResults[0] == PackageManager.PERMISSION_GRANTED){
Log.d(Tag, "CAMERA 權限授權成功");
}
else{
Log.d(Tag, "用戶拒絕授權權限 CAMERA");
}
break;
}
}
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
來自:http://www.jianshu.com/p/390bd60e6ee3
本文由用戶 EdwDoe 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!