Android6.0 動態權限 筆錄

EdwDoe 8年前發布 | 8K 次閱讀 安卓開發 Android開發 移動開發

導航:

  • 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
![1.png](http://upload-images.jianshu.io/upload_images/797252-49f05105989697ed.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)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 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!