1. 程式人生 > >Android6.0SDK23動態許可權的請求和直接使用-使用版

Android6.0SDK23動態許可權的請求和直接使用-使用版

自從Android6.0以後SDK23版本,現在的Android的很多許可權是需要動態請求的,例如常用的相機,讀寫儲存,定位,錄音等等,不僅僅要在AndroidManifest.xml裡面做許可權的請求,而且在程式碼裡,也需要做一些處理,為了方便自己使用,把基本的模板總結出來,若沒有“奇特”需求的情況下,基本是“拿來主義”直接使用。
文末會附上Demo下載。

貼圖幾張:

基本的操作,其他情況自己可以測試,可以自己在手機的應用管理處再把許可權給取消,這樣可以反覆測試各種情況:
基本頁面顯示

點選統一請求的顯示,第一個請求

第二個請求

請求都授權後的提示

撥打電話的請求
撥打電話允許後的顯示

貼完圖,上部分程式碼塊:

BaseActivity自定義基類:

/**
 * Created by zhenQi on 2016/12/27.
 * 自定義BaseActivity基類
 */
public class BaseActivity extends AppCompatActivity { //例項化監聽物件 private static PermissionListener mListener; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); //新增Activity管理類的方法-新增類 ActivityCollector.addActivity(this
); } @Override protected void onDestroy() { super.onDestroy(); //新增Activity管理類的方法-移除類 ActivityCollector.removeActivity(this); } //許可權請求的方法(直接貼上複製即可使用) public static void requestRuntimePermission(String[] permissions, PermissionListener listener) { Activity topActivity = ActivityCollector.getTopActivity(); if
(topActivity == null) { return; } mListener = listener; List<String> permissionList = new ArrayList<>(); for (String permission : permissions) { if (ContextCompat.checkSelfPermission(topActivity, permission) != PackageManager.PERMISSION_GRANTED) { permissionList.add(permission); } } if (!permissionList.isEmpty()) { ActivityCompat.requestPermissions(topActivity, permissionList.toArray(new String[permissionList.size()]), 1); } else { mListener.onGranted(); } } @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) { List<String> deniedPermissions = new ArrayList<>(); for (int i = 0; i < grantResults.length; i++) { int grantResult = grantResults[i]; String permission = permissions[i]; if (grantResult != PackageManager.PERMISSION_GRANTED) { deniedPermissions.add(permission); } } if (deniedPermissions.isEmpty()) { mListener.onGranted(); } else { mListener.onDenied(deniedPermissions); } } break; default: break; } } }

主要操作的類MainActivity:

/**
 * 許可權的請求操作封裝在BaseActivity基類中,當前類繼承BaseActivity基類
 * 首先宣告(廢話):動態許可權是Android 6.0版本以後(SDK:23),谷歌更新的對於一些危險/隱祕許可權的動態提醒和動態授權的“規定”
 * 可以用判斷方法:Build.VERSION.SDK_INT >= 23,來判斷當前版本是不是大於SDK 23。——廢話結束。
 * 使用許可權方法,直接呼叫requestRuntimePermission(要請求的許可權陣列,PermissionListener監聽方法)的方法,
 * 注:首先所有的動態請求,都是要在AndroidManifest.xml,中去新增的,例如:
 * <uses-permission android:name="android.permission.CALL_PHONE" />//打電話許可權
 * <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />//精準定位許可權
 * <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />//寫資料許可權
 * <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />//讀資料許可權
 * <uses-permission android:name="android.permission.CAMERA" />//相機許可權
 * <uses-permission android:name="android.permission.RECORD_AUDIO" />//錄音許可權
 * 等等...
 */
public class MainActivity extends BaseActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    /**
     * (這裡引用佈局的onClick點選方法)
     *
     * @param view 點選-統一請求很多許可權:
     */
    public void buttonClick(View view) {
        requestRuntimePermission(new String[]{
                Manifest.permission.CALL_PHONE,//打電話許可權
                Manifest.permission.ACCESS_FINE_LOCATION,//精準定位許可權
                Manifest.permission.CAMERA,//相機許可權
                Manifest.permission.WRITE_EXTERNAL_STORAGE,//寫資料許可權
                Manifest.permission.READ_EXTERNAL_STORAGE,//讀資料許可權
                Manifest.permission.RECORD_AUDIO//錄音許可權
        }, new PermissionListener() {
            //授權後的回撥方法
            @Override
            public void onGranted() {
                Toast.makeText(MainActivity.this, "所有許可權都同意了", Toast.LENGTH_SHORT).show();
            }

            //許可權被拒絕的回撥方法
            @Override
            public void onDenied(List<String> deniedPermission) {
                for (String permission : deniedPermission) {
                    Toast.makeText(MainActivity.this, "被拒絕許可權:" + permission, Toast.LENGTH_SHORT).show();
                }
            }
        });
    }

    //單獨請求相機許可權
    public void pai(View view) {
        requestRuntimePermission(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,
                Manifest.permission.READ_EXTERNAL_STORAGE}, new PermissionListener() {
            @Override
            public void onGranted() {
                Toast.makeText(MainActivity.this, "允許了拍照", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onDenied(List<String> deniedPermission) {
                for (String permission : deniedPermission) {
                    Toast.makeText(MainActivity.this, "被拒絕許可權:" + permission, Toast.LENGTH_SHORT).show();
                }
            }
        });
    }

    //單獨請求-儲存許可權
    public void cun(View view) {
        requestRuntimePermission(new String[]{Manifest.permission.CAMERA}, new PermissionListener() {
            @Override
            public void onGranted() {
                Toast.makeText(MainActivity.this, "允許了讀寫", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onDenied(List<String> deniedPermission) {
                for (String permission : deniedPermission) {
                    Toast.makeText(MainActivity.this, "被拒絕許可權:" + permission, Toast.LENGTH_SHORT).show();
                }
            }
        });
    }

    //單獨請求-打電話的許可權
    public void callClick(View view) {
        Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + "123456789"));
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
            // TODO: Consider calling
            //    ActivityCompat#requestPermissions
            // here to request the missing permissions, and then overriding
            //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
            //                                          int[] grantResults)
            // to handle the case where the user grants the permission. See the documentation
            // for ActivityCompat#requestPermissions for more details.
            return;
        }
        startActivity(intent);
    }

    //跳轉到下一頁
    public void tiao(View view) {
        Intent intent = new Intent(this, Main2Activity.class);
        startActivity(intent);
    }

    //抽出-做一些操作的方法
    private void doSomething() {
        // do something
        Toast.makeText(this, "所有許可權都同意了", Toast.LENGTH_SHORT).show();
    }
}

其他程式碼:

其他說明:

Demo中自定義了Util工具類,
PermissionListener(監聽回撥)介面,
自定義ActivityCollector(Activity)管理類

/**
 * Created by zhenQi on 2016/12/27.
 * 自定義的一個工具類
 */

public class Util {


    public void test() {
        BaseActivity.requestRuntimePermission(new String[]{}, new PermissionListener() {
            @Override
            public void onGranted() {

            }

            @Override
            public void onDenied(List<String> deniedPermission) {

            }
        });
    }

}

/**
 * Created by zhenQi on 2016/12/27.
 * Activity的管理類,方面統一管理Activity
 */

public class ActivityCollector {

    private static List<Activity> activityList = new ArrayList<>();

    public static void addActivity(Activity activity) {
        activityList.add(activity);
    }

    public static void removeActivity(Activity activity) {
        activityList.remove(activity);
    }

    public static Activity getTopActivity() {
        if (activityList.isEmpty()) {
            return null;
        } else {
            return activityList.get(activityList.size() - 1);
        }
    }

}
/**
 * Created by zhenQi on 2016/12/27.
 * 定義回撥介面,授權的方法,和拒絕的方法
 */

public interface PermissionListener {

    void onGranted();

    void onDenied(List<String> deniedPermission);

}
public class Main2Activity extends AppCompatActivity implements View.OnClickListener {

    private Button finish;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        initView();

    }

    //點選-請求錄音的許可權(這裡引用佈局的onClick(lu)點選方法)
    public void luyin(View view) {
        requestRuntimePermission(new String[]{Manifest.permission.RECORD_AUDIO}, new PermissionListener() {
            @Override
            public void onGranted() {
                //授權的操作
                Toast.makeText(Main2Activity.this, "錄音許可權-已經授權", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onDenied(List<String> deniedPermission) {
                for (String permission : deniedPermission) {
                    //未授權的操作
                    Toast.makeText(Main2Activity.this, "錄音許可權-未經授權", Toast.LENGTH_SHORT).show();
                }
            }
        });

    }

    private void initView() {
        finish = (Button) findViewById(R.id.finish);
        //這裡使用監聽點選事件的方法,啟用點選事件
        finish.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            //返回上一頁-殺死當前Activity
            case R.id.finish:
                finish();
                break;
        }
    }
}

許可權區分列表:

正常許可權 (Normal Permissions)
在API 23中,下面許可權被定義為正常許可權
關於Markdown 簡介Markdown,Markdown的優缺點
ACCESS_LOCATION_EXTRA_COMMANDS
ACCESS_NETWORK_STATE
ACCESS_NOTIFICATION_POLICY
ACCESS_WIFI_STATE
BLUETOOTH
BLUETOOTH_ADMIN
BROADCAST_STICKY
CHANGE_NETWORK_STATE
CHANGE_WIFI_MULTICAST_STATE
CHANGE_WIFI_STATE
DISABLE_KEYGUARD
EXPAND_STATUS_BAR
GET_PACKAGE_SIZE
INSTALL_SHORTCUT
INTERNET
KILL_BACKGROUND_PROCESSES
MODIFY_AUDIO_SETTINGS
NFC
READ_SYNC_SETTINGS
READ_SYNC_STATS
RECEIVE_BOOT_COMPLETED
REORDER_TASKS
REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
REQUEST_INSTALL_PACKAGES
SET_ALARM
SET_TIME_ZONE
SET_WALLPAPER
SET_WALLPAPER_HINTS
TRANSMIT_IR
UNINSTALL_SHORTCUT
USE_FINGERPRINT
VIBRATE
WAKE_LOCK
WRITE_SYNC_SETTINGS
敏感許可權 (Dangerous permissions)
Permission Group Permissions
CALENDAR READ_CALENDAR, WRITE_CALENDAR
CAMERA CAMERA
CONTACTS READ_CONTACTS ,WRITE_CONTACTS, GET_ACCOUNTS
LOCATION ACCESS_FINE_LOCATION , ACCESS_COARSE_LOCATION
MICROPHONE RECORD_AUDIO
PHONE READ_PHONE_STATE, CALL_PHONE READ_CALL_LOG , WRITE_CALL_LOG , ADD_VOICEMAIL , USE_SIP, PROCESS_OUTGOING_CALLS
SENSORS BODY_SENSORS
SMS SEND_SMS RECEIVE_SMS , READ_SMS RECEIVE_WAP_PUSH , RECEIVE_MMS
STORAGE READ_EXTERNAL_STORAGE , WRITE_EXTERNAL_STORAGE

相關推薦

Android6.0SDK23動態許可權請求直接使用-使用

自從Android6.0以後SDK23版本,現在的Android的很多許可權是需要動態請求的,例如常用的相機,讀寫儲存,定位,錄音等等,不僅僅要在AndroidManifest.xml裡面做許可權的請求,而且在程式碼裡,也需要做一些處理,為了方便自己使用,把基本

Android6.0動態許可權適配&XMPermissions

Android6.0動態許可權 簡介 從 Android 6.0(API 級別 23)開始,使用者開始在應用執行時向其授予許可權,而不是在應用安裝時授予。此方法可以簡化應用安裝過程,因為使用者在安裝或更新應用時不需要授予許可權。它還讓使用者可以對應用的功能進行

Android6.0動態許可權問題,使用PermissionDispatcher自動分配

Android 6.0 許可權問題 Android 6.0對許可權做了區分,將手機的許可權分為危險許可權和非危險許可權; 非危險許可權只要在AndroidManifest中加入許可權申請就可以使用了。 而危險許可權只在AndroidManifest中加入許可權申

android6.0動態許可權申請工具類

一、分析 android6.0後,僅在manifest.xml清單中配置相關許可權時,如果將targetSdkVersion設定為23及以上,部分敏感許可權需要動態申請後才能使用;如果不想處理6.0以上的適配,請將targetSdkVersion設定為22

android6.0動態許可權設定

android6.0後就需要手動獲取許可權。主要有以下步驟:1、在menifests檔案加入相應許可權,如:<!-- 獲取照相機拍照許可權 --> <uses-permission a

android6.0動態許可權的設定——幾行程式碼搞定

只需要兩步走: 一、程式碼請求許可權 /** * android6.0執行時許可權,檢測 */ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {//6.0以上 int checkPermission =

Android6.0 動態許可權申請步驟以及需要注意的一些坑

因為工作需要,簡單研究了一下Android6.0許可權申請,在Google提供的sample的基礎上,寫了一個簡單的demo。算是自己的筆記吧,可能會比較混亂,主要是方便以後檢視。後期有別的問題,隨時更新~ 6.0許可權的基本知識,以下是需要單獨申請的許可權,共分為9組,每組只要有一個許可權申請成功了,就

Android6.0動態許可權申請步驟以及需要注意的一些坑

簡單研究了一下Android6.0許可權申請,在Google提供的sample的基礎上,寫了一個簡單的demo。算是自己的筆記吧,可能會比較混亂,主要是方便以後檢視。 6.0許可權的基本知識,以下是需要單獨申請的許可權,共分為9組,每組只要有一個許可權申請成功了,就預設整組許可權都可以使用了。 gro

android6.0動態許可權申請

android6.0之前,所有的許可權都要求同意之後,app才能被安裝。6.0之後,動態許可權申請很好的處理了之前的強制行為,對使用者更加的友好。 新的許可權機制,將許可權分為兩大類,一種普通許可權,一種為危險許可權。普通許可權,在manifest中申請後,無需再主動申請;

安卓開發——Android6.0動態許可權申請步驟以及需要注意的一些坑

因為工作需要,簡單研究了一下Android6.0許可權申請,在Google提供的sample的基礎上,寫了一個簡單的demo。算是自己的筆記吧,可能會比較混亂,主要是方便以後檢視。後期有別的問題,隨時更新~ 6.0許可權的基本知識,以下是需要單獨申請的許可權,共分為9組,每組只要

使用EasyPermissions 來打造簡單的android6.0動態許可權

EasyPermissions 的介紹 EasyPermissions是一個三方庫,用於android6.0動態許可權的使用。 在android6.0版本中,涉及到許可權問題的使用,都需要進行動態申請。 EasyPermissions 的使用

android6.0動態許可權管理案例-打電話案例

package com.example.phone2; import android.Manifest; import android.content.Intent; import android.content.pm.PackageManager; import android.ne

Android6.0動態許可權獲取框架:RxPermission(基於RxJava2)

首先在build.gradle中新增依賴庫 rxjava和retrofit: compile 'io.reactivex.rxjava2:rxjava:2.x.y' compile 'io.reactivex.rxjava2:rxandroid:2.0.

Android6.0動態許可權獲取詳解

在Android6.0出來之前,大家基本都是在清淡配置檔案中間新增系統許可權。但在Android6.0之後很多許可權需要動態獲取。如拍Sd卡的寫入,寫出、震動,等等。 這裡為大家簡單的介紹一下如何進行動態許可權的獲取,以及如何編寫動態許可權封裝類。 這裡以獲取本地相機

android6.0動態許可權管理,小米bug適配

在Android6.0以後開始,對於部分敏感的“危險”許可權,需要在應用執行時向用戶申請,只有使用者允許的情況下這個許可權才會被授予給應用。這對於使用者來說,無疑是一個提升安全性的做法。那麼對於開發者,應該怎麼做呢? Android6.0規定的危險許可權有下面

關於android6.0動態許可權造成的app crash問題

今天我們為公司內部員工開發的app出現了一個bug,因為我們的app要繫結imei所以我就讀取imei並且有個許可權READ_PHONE_STATE就是這個許可權出現了問題,我就納悶了怎麼會有問題呢,我已經在manifest上聲明瞭,然後我就看一下他的android版本6.

Android高效開發之,Android6.0動態許可權的封裝

每次進行動態許可權註冊的時候,都要使用固定的流程 對該固定程式碼進行封裝,可以在所有介面Activity基類中進行動態許可權的申請。 子類Activity只需要構造一個LinkedList 傳入

Android6.0 動態許可權獲取記錄

        這應該算是一個比較老的東西了,但還是想寫一寫。         Android6.0 動態許可權,顧名思義,是在6.0及以上的Android生效的,6.0以下,及小米,魅族等自定義的許可權獲取,相對來說比較複雜,網上看了很多文章,有很多種不同的實現方法,但個

android6.0動態許可權,以及如何同時授予多個許可權,當用戶禁用的後續處理

AlertDialog mPermissionDialog;/** * 不再提示許可權 時的展示對話方塊 */private void showPermissionDialog() {     if (mPermissionDialog == null) {         mPermissionDialog

Android6.0以上獲取動態許可權

在執行時請求許可權 從 Android 6.0(API 級別 23)開始,使用者開始在應用執行時向其授予許可權,而不是在應用安裝時授予。此方法可以簡化應用安裝過程,因為使用者在安裝或更新應用時不需要授予許可權。它還讓使用者可以對應用的功能進行更多控制;例如,使用者可以選擇為相機應用提供相機訪問許