Android6.0動態許可權申請

來源:互聯網
上載者:User

標籤:slist   multicast   smi   internet   等於   知識   ram   wap   request   

goggle在Android6.0要求部分許可權需要動態申請,直接下載AndroidManifest.xml中無效

 

  • 6.0許可權的基本知識,以下是需要單獨申請的許可權,共分為9組,
  • 每組只要有一個許可權申請成功了,就預設整組許可權都可以使用了。
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
  • 以下是普通許可權,只需要在AndroidManifest.xml中申請即可
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

 

  1. 將targetSdkVersion設定為23,注意,如果你將targetSdkVersion設定為>=23,則必須按照AndroidGoogle的要求,動態申請許可權,如果你暫時不打算支援動態許可權申請,則targetSdkVersion最大隻能設定為22
  2.  在AndroidManifest.xml中申請你需要的許可權,包括普通許可權和需要申請的特殊許可權。

 

開始申請許可權,此處分為3部。

  • (1)檢查是否由此許可權checkSelfPermission(),如果已經開啟,則直接做你想做的。

  • (2)如果未開啟,則判斷是否需要向使用者解釋為何申請許可權shouldShowRequestPermissionRationale。

  • (3)如果需要(即返回true),則可以彈出對話方塊提示使用者申請許可權原因,使用者確認後申請許可權requestPermissions(),如果不需要(即返回false),則直接申請許可權requestPermissions()。
    (這裡是一部門代碼,底部有比較完善的代碼,整個demo可以在github中下載)。
/**         * Requests permission.         *         * @param activity         * @param requestCode request code, e.g. if you need request CAMERA permission,parameters is PermissionUtils.CODE_CAMERA         */        public static void requestPermission(final Activity activity, final int requestCode, PermissionGrant permissionGrant) {            if (activity == null) {                return;            }            Log.i(TAG, "requestPermission requestCode:" + requestCode);            if (requestCode < 0 || requestCode >= requestPermissions.length) {                Log.w(TAG, "requestPermission illegal requestCode:" + requestCode);                return;            }            final String requestPermission = requestPermissions[requestCode];            //如果是6.0以下的手機,ActivityCompat.checkSelfPermission()會始終等於PERMISSION_GRANTED,        // 但是,如果使用者關閉了你申請的許可權(如,在安裝的時候,將一些許可權關閉了),ActivityCompat.checkSelfPermission()則可能會導致程式崩潰(java.lang.RuntimeException: Unknown exception code: 1 msg null),        // 你可以使用try{}catch(){},處理異常,也可以判斷系統版本,低於23就不申請許可權,直接做你想做的。permissionGrant.onPermissionGranted(requestCode);//        if (Build.VERSION.SDK_INT < 23) {//            permissionGrant.onPermissionGranted(requestCode);//            return;//        }            int checkSelfPermission;            try {                checkSelfPermission = ActivityCompat.checkSelfPermission(activity, requestPermission);            } catch (RuntimeException e) {                Toast.makeText(activity, "please open this permission", Toast.LENGTH_SHORT)                        .show();                Log.e(TAG, "RuntimeException:" + e.getMessage());                return;            }            if (checkSelfPermission != PackageManager.PERMISSION_GRANTED) {                Log.i(TAG, "ActivityCompat.checkSelfPermission != PackageManager.PERMISSION_GRANTED");                if (ActivityCompat.shouldShowRequestPermissionRationale(activity, requestPermission)) {                    Log.i(TAG, "requestPermission shouldShowRequestPermissionRationale");                    shouldShowRationale(activity, requestCode, requestPermission);                } else {                    Log.d(TAG, "requestCameraPermission else");                    ActivityCompat.requestPermissions(activity, new String[]{requestPermission}, requestCode);                }            } else {                Log.d(TAG, "ActivityCompat.checkSelfPermission ==== PackageManager.PERMISSION_GRANTED");                Toast.makeText(activity, "opened:" + requestPermissions[requestCode], Toast.LENGTH_SHORT).show();//得到許可權的時候,就可以在回調裡面做你想做的事情了                permissionGrant.onPermissionGranted(requestCode);            }        }

 

一次申請多個許可權

其實和申請一個許可權是一樣的,只是requestPermissions(final @NonNull Activity activity,
final @NonNull String[] permissions, final int requestCode),裡面的permissions給的參數多些而已。


 /**     * 一次申請多個許可權     */    public static void requestMultiPermissions(final Activity activity, PermissionGrant grant) {        final List<String> permissionsList = getNoGrantedPermission(activity, false);        final List<String> shouldRationalePermissionsList = getNoGrantedPermission(activity, true);        //TODO checkSelfPermission        if (permissionsList == null || shouldRationalePermissionsList == null) {            return;        }        Log.d(TAG, "requestMultiPermissions permissionsList:" + permissionsList.size() + ",shouldRationalePermissionsList:" + shouldRationalePermissionsList.size());        if (permissionsList.size() > 0) {            ActivityCompat.requestPermissions(activity, permissionsList.toArray(new String[permissionsList.size()]),                    CODE_MULTI_PERMISSION);            Log.d(TAG, "showMessageOKCancel requestPermissions");        } else if (shouldRationalePermissionsList.size() > 0) {            showMessageOKCancel(activity, "should open those permission",                    new DialogInterface.OnClickListener() {                        @Override                        public void onClick(DialogInterface dialog, int which) {                            ActivityCompat.requestPermissions(activity, shouldRationalePermissionsList.toArray(new String[shouldRationalePermissionsList.size()]),                                    CODE_MULTI_PERMISSION);                            Log.d(TAG, "showMessageOKCancel requestPermissions");                        }                    });        } else {            grant.onPermissionGranted(CODE_MULTI_PERMISSION);        }    }

 

 

 

Android6.0動態許可權申請

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.