1. 程式人生 > >關於Android 6.x 及以上許可權管理,閃退

關於Android 6.x 及以上許可權管理,閃退

原因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增加了動態授權,但是原來的宣告授權方式依然其作用,系統顯然是檢查了兩處都已經授權才允許通行。