關於Android 6.x 及以上許可權管理,閃退
阿新 • • 發佈:2019-02-02
原因1. 沒有授權檢查;
原因2. 許可權檢查與宣告不匹配
例如:
近期,維護一個接手的App,由於歷史原因,沒有許可權管理,直接導致在高版本的Android上閃退。
直接匯入了以前專案使用的以下程式碼
public static String[] check(@NonNull Context context, @NonNull String[] permissions ) { // android 5 --> 21 // android 5.1 --> 22 if( Build.VERSION.SDK_INT < Build.VERSION_CODES.M ) //if( Build.VERSION.SDK_INT <= Build.VERSION_CODES.LOLLIPOP ) { return null ; } if( null == permissions ) { permissions = PERMISSIONS ; } List<String> ungranted_permissions = new ArrayList<String>(); int hasPermission = 0 ; for( int idx = 0 ; idx < permissions.length ; idx++ ) { //PermissionChecker.checkSelfPermission(this, permission.WRITE_CONTACTS) //hasPermission = ContextCompat.checkSelfPermission(getApplication(), permission.WRITE_EXTERNAL_STORAGE); hasPermission = ContextCompat.checkSelfPermission( context, permissions[idx] ) ; if (PackageManager.PERMISSION_GRANTED != hasPermission) { //startGetImageThread(); ungranted_permissions.add( permissions[idx] ) ; } } if( 0 == ungranted_permissions.size() ) { //TODO: continue for start return null ; } //pop dialog to usr for assign permission else { //ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE}, CODE_REQ_MULTIPLE_PERMISSION); permissions = new String[ungranted_permissions.size()] ; ungranted_permissions.toArray( permissions ) ; Log.i( "PermissionUtil", "req permissions = "+ permissions ); return permissions ; } }
和
@Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { switch (requestCode) { case PermissionUtil.CODE_REQ_MULTIPLE_PERMISSION: for(int idx=0; idx<permissions.length ;idx++) { Log.i(TAG, "permissions = " + permissions[idx] + ", grantResults = " + grantResults[idx]); } // If request is cancelled, the result arrays are empty. if ( grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED ) { // permission was granted, yay! Do the contacts-related task you need to do. //doCreate } else { // permission denied, boo! Disable the // functionality that depends on this permission. Log.i(TAG, "Permissions NOT Granted, Finish App!" ); Toast.makeText( this, "Permissions NOT Granted, Finish App!", Toast.LENGTH_SHORT).show(); finish(); } return; } // other 'case' lines to check for other // permissions this app might request super.onRequestPermissionsResult(requestCode, permissions, grantResults); }
發現,在授權後,依然是閃退,抓LOG看,顯示沒有被授權,明明剛進行過授權啊,後來檢查才發現:
在新增許可權的時候,授權列表中的專案,同時也需要在manifest檔案中新增許可權宣告, 僅僅進行授權檢查是不可用的。
以此判斷,雖然高版本android增加了動態授權,但是原來的宣告授權方式依然其作用,系統顯然是檢查了兩處都已經授權才允許通行。