1. 程式人生 > >Android 6.0動態申請許可權(一次申請多個)

Android 6.0動態申請許可權(一次申請多個)

Android一次申請多個動態許可權
昨天做一個錄音功能的程式,發現在開啟Mic的時候發生了程式崩潰,但是錯誤提示裡面居然沒有提示許可權禁止。 
解決的方法有:1.手動去選擇“應用”–>“程式”–>找到那個程式新增許可權,後面程式就可以正常使用了

2.設定動態請求許可權 
第一種方法肯定是不可取的。 
關於動態請求許可權以前也有寫過,現在再寫一個程式碼示例,並且跟大家說說那些許可權是需要動態請求的許可權,這個以前沒說過。

Android在6.0以後就要使用動態許可權了,否者程式可能無法進行某些功能操作。 
Android 6.0對應的Android SDK等級是23.所以一般是先判斷手機的版本是否是6.0以上再進行動態請求許可權。

一個請求錄音許可權和檔案讀寫許可權的例項。

package com.liwenzhi.example.record;

public class MainActivity extends AppCompatActivity {


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

    //這裡我直接在頁面建立的時候請求許可權,其實不太好,這裡只是為了演示
    //一般是在觸發某個事件的時候再請求動態許可權,比如點選按鈕跳轉到一個拍照頁面,如果許可權通過就跳轉,否者吐司說沒有許可權!
        if (Build.VERSION.SDK_INT >= 23) {//6.0才用動態許可權
            initPermission();
        }

    }


    //申請兩個許可權,錄音和檔案讀寫
    //1、首先宣告一個數組permissions,將需要的許可權都放在裡面
    String[] permissions = new String[]{Manifest.permission.RECORD_AUDIO,
            Manifest.permission.READ_EXTERNAL_STORAGE};
    //2、建立一個mPermissionList,逐個判斷哪些許可權未授予,未授予的許可權儲存到mPerrrmissionList中
    List<String> mPermissionList = new ArrayList<>();

    private final int mRequestCode = 100;//許可權請求碼


    //許可權判斷和申請
    private void initPermission() {

        mPermissionList.clear();//清空沒有通過的許可權

        //逐個判斷你要的許可權是否已經通過
        for (int i = 0; i < permissions.length; i++) {
            if (ContextCompat.checkSelfPermission(this, permissions[i]) != PackageManager.PERMISSION_GRANTED) {
                mPermissionList.add(permissions[i]);//新增還未授予的許可權
            }
        }

        //申請許可權
        if (mPermissionList.size() > 0) {//有許可權沒有通過,需要申請
            ActivityCompat.requestPermissions(this, permissions, mRequestCode);
        }else{
    //說明許可權都已經通過,可以做你想做的事情去
    }
    }


    //請求許可權後回撥的方法
    //引數: requestCode  是我們自己定義的許可權請求碼
    //引數: permissions  是我們請求的許可權名稱陣列
    //引數: grantResults 是我們在彈出頁面後是否允許許可權的標識陣列,陣列的長度對應的是許可權名稱陣列的長度,陣列的資料0表示允許許可權,-1表示我們點選了禁止許可權
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
                                           @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        boolean hasPermissionDismiss = false;//有許可權沒有通過
        if (mRequestCode == requestCode) {
            for (int i = 0; i < grantResults.length; i++) {
                if (grantResults[i] == -1) {
                    hasPermissionDismiss = true;
                }
            }
             //如果有許可權沒有被允許
            if (hasPermissionDismiss) {
                showPermissionDialog();//跳轉到系統設定許可權頁面,或者直接關閉頁面,不讓他繼續訪問
            }else{
                //全部許可權通過,可以進行下一步操作。。。

            }
        }

    }


    /**
     * 不再提示許可權時的展示對話方塊
     */
    AlertDialog mPermissionDialog;
    String mPackName = "com.huawei.liwenzhi.weixinasr";

    private void showPermissionDialog() {
        if (mPermissionDialog == null) {
            mPermissionDialog = new AlertDialog.Builder(this)
                    .setMessage("已禁用許可權,請手動授予")
                    .setPositiveButton("設定", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            cancelPermissionDialog();

                            Uri packageURI = Uri.parse("package:" + mPackName);
                            Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, packageURI);
                            startActivity(intent);
                        }
                    })
                    .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            //關閉頁面或者做其他操作
                            cancelPermissionDialog();

                        }
                    })
                    .create();
        }
        mPermissionDialog.show();
    }

    //關閉對話方塊
    private void cancelPermissionDialog() {
        mPermissionDialog.cancel();
    }

}

示例程式碼根據實際情況做簡單修改就可以用在各種動態許可權下。

示例程式碼執行後的介面顯示:
剛顯示介面的時候:
請求第一個許可權: 
 
第二個許可權 


如果有某一個許可權,自己沒有點選允許,而是點選禁止,那麼就會顯示是否設定頁面:


如果點選設定,就會跳轉到手機系統設定許可權介面。

說明:上面的許可權陣列可以請求多個許可權,也可以只請求一個許可權
危險許可權列表
下面一下許可權就是危險許可權,在Android6.0後需要我們去動態申請。

許可權組    許可權
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
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
permission:android.permission.RECEIVE_MMS
permission:android.permission.RECEIVE_SMS
permission:android.permission.SEND_SMS
permission:android.permission.READ_CELL_BROADCASTS
上面示例中的許可權好像跟許可權列表不太一樣? 
其實是一樣的,程式碼中的錄音許可權:Manifest.permission.RECORD_AUDIO得到的就是字串:android.permission.RECORD_AUDIO

java程式碼習慣都是使用類屬性資料,不然要記住這麼多字串是很有難度的,在使用的時候我們用”Manifest.permission.+許可權名稱”就可以得到對應許可權的字串。

相關推薦

Android 6.0動態申請許可權申請

Android一次申請多個動態許可權 昨天做一個錄音功能的程式,發現在開啟Mic的時候發生了程式崩潰,但是錯誤提示裡面居然沒有提示許可權禁止。  解決的方法有:1.手動去選擇“應用”–>“程式”–>找到那個程式新增許可權,後面程式就可以正常使用了 2.設定動態請

解決Android 6.0動態新增許可權問題

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FE

Android 6.0動態獲取許可權開源專案

      Android 6.0 相比之前的Android版本有一個很大的不同點,就是動態獲取許可權,即不僅在Manifest檔案裡設定各種許可權,在使用一些危險許可權時候還得動態的彈出個對話方塊讓客戶去選擇授予這個許可權。     基本內容和程式碼就不重複了,大家可

Android 6.0+ 動態許可權 種清爽的封裝過程以及許可權的處理

Android 6.0 之前我們申請許可權直接在配置檔案中配置一下即可,但是6.0之後,谷歌官方將許可權分為普通許可權和危險許可權。對於危險許可權來說,我們就需要進行動態設定了。本文主要講解為什麼要進行Android 6.0 動態許可權的設定、動態許可權的使用、

Android 6.0動態申請許可權時,許可權框閃一下就消失的問題;

Android 藍芽BLE開發需要位置許可權,不然掃描不到周圍的藍芽資訊; 位置許可權申請: if (Build.VERSION.SDK_INT < 23){return;} //判斷是否有許可權 if (ContextCompat.checkSelfPermis

Android 6.0 動態許可權申請

前言: 從Android 6.0(API 23)開始,對系統許可權做了很大的改變。在之前使用者安裝APP前,只是把APP需要使用的許可權列出來給使用者告知一下,APP安裝後都可以訪問這些許可權。從6.0開始,一些敏感許可權,需要在使用時動態申請,並且使用者可以選擇拒絕授權訪

一行程式碼搞定Android 6.0動態許可權申請

1、前言 從Android 6.0(API 23)開始,對系統許可權做了很大的改變。在之前使用者安裝APP前,只是把APP需要使用的許可權列出來給使用者告知一下,APP安裝後都可以訪問這些許可權。從6.0開始,一些敏感許可權,需要在使用時動態申請,並且使用者可

Android 6.0動態許可權申請

1.Android6.0動態許可權的由來 一直以來,Android的許可權系統都是最大的安全問題之一,因為在進行安裝的時候,所有的許可權都會統一進行請求,你必須允許這些許可權請求才能進行安裝.應用安裝後,就可以在使用者毫不知情的情況下,訪問這些許可權.所以有很

android 6.0 動態申請許可權的基本方法和框架使用】

基本的使用: 先提供一下goog官方的學習文件: int selfPermission = ContextCompat.checkSelfPermission(Main2Activity.this, Manifest.permission.CA

Android 6.0 動態許可權申請簡單簡潔優雅的處理方式

Android M 或以上的裝置,在使用涉及隱私的安全許可權時,需要動態申請,雖然不難,但寫下來程式碼工作量也不少,而且幾乎每個應用都需要用到。所以一直在探索一個要足夠簡單簡潔優雅的處理方式,強迫症的精神指導我要拒絕一切繁瑣。至於完不完美那就仁者見仁了。 一、思路: 如果在

Android 6.0動態許可權及小米MIUI許可權的特殊處理

前言 常規操作許可權的頁面及流程 許可權說明 許可權授取流程 小米許可權特殊處理 各個android作

Android 6.0 動態許可權申請注意事項

<strong><span style="font-size:32px;color:#000099;">許可權區分</span></strong> Android 6.0 為了保護使用者隱私,將一些許可權的申請放在了應用執行的

Android 6.0 動態申請許可權無效問題

Android動態許可權新增的流程一般如下:  1.在AndroidManifest.xml檔案中新增相應的許可權,如下:<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/&g

Android 6.0 動態許可權實戰

關於上一章節提到的 23.06ADT和6.0的SDK 資源,現在馬上貼出來如果連結不存在,或者資源有問題,請在本博留言,勿發私信,謝謝!在本篇開篇前先大致瞭解一下 6.0 動態許可權的大致過程,廢話不多說,linux開啟原始碼,開始探究1.首先,比如我們需要手動授權的時候,怎

Android 6.0 - 動態權限管理的解決方案

long div span 添加 包含 detail 工具類 putextra ref 轉自:http://www.cnblogs.com/dubo-/p/6018262.html Android 6.0 - 動態權限管理的解決方案 轉載請標註 Android 6.

Android 6.0 動態申請 音頻+拍照+相冊 權限

gem relative tca camera iss osi switch manifest break 1.音頻的權限(包括錄音和播放) 1.1.首先要在清單中加上兩個權限 <uses-permission android:name="andr

Android 6.0動態許可權介紹與處理

一、Android 6.0許可權介紹 從 Android 6.0(API 級別 23)開始,使用者開始在應用執行時向其授予許可權,而不是在應用安裝時授予。 Android 6.0系統6.0以前,所有的許可權,訪問網路的許可權,讀取SD卡的許可權,訪問通訊錄,撥

Android 6.0執行時許可權申請和一些坑

1.概述 大家知道在Android6.0(Api23)之前,使用者許可權的申請都是在AndroidManifest.xml 宣告的,而在6.0之後,對某些涉及到使用者隱私的許可權可在執行時根據使用者的需要動態授予。如果你的應用設定targetSdkVersio

Android 6.0: 動態許可權管理的解決方案

歡迎Follow我的GitHub, 關注我的CSDN. Android 6.0版本(Api 23)推出了很多新的特性, 大幅提升了使用者體驗, 同時也為程式設計師帶來新的負擔. 動態許可權管理就是這樣, 一方面讓使用者更加容易的控制自己的隱

Android 6.0動態許可權呼叫相簿相機

1.建立頁面簡單佈局demo.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res