1. 程式人生 > >Android 許可權,許可權分組的一些問題

Android 許可權,許可權分組的一些問題

Android許可權,許可權分組官方描述:
permission

<permission android:description="string resource"
            android:icon="drawable resource"
            android:label="string resource"
            android:name="string"
            android:permissionGroup="string"
            android:protectionLevel=["normal"
| "dangerous" | "signature" | "signatureOrSystem"] /> DESCRIPTION: Declares a security permission that can be used to limit access to specific components or features of this or other applications.

宣告一個安全許可權對於 特定的元件 或者 當前或者其他應用程式的特性 的有限的訪問許可權

permission-group

SYNTAX:
<permission-group android:description="string resource"
                  android:icon="drawable resource"
                  android:label="string resource"
                  android:name="string" />
DESCRIPTION:
Declares a name for a logical grouping of related permissions. Individual permission join the
group through the permission Group attribute of the <permission> element. Members of a group are presented together in the user interface. Note that this element does not declare a permission itself, only a category in which permissions can be placed. See the <permission> element for element for information on declaring permissions and assigning them to groups.

宣告一個相關許可權的邏輯分組。單獨的許可權通過許可權定義中的許可權分組屬性,宣告響應的分組。許可權組的成員是展現在同一使用者介面中的。
注意:permission-group並沒有生命自己的任何許可權,只是一個許可權的目錄。檢視permission元素相關的資訊查詢一個許可權所屬的分組。
Android 中許可權的分組情況如下表:
這裡寫圖片描述

!!!!如果獲得Permission Group的許可權,則分組中所有許可權都會獲取到。
WRITE_CONTACTS許可權被授予以後,應用將會獲得READ_CONTACTS和GET_ACCOUNTS的許可權。!!!!

在AndroidManifest.xml中宣告如下:

<uses-permission android:name="android.permission.READ_SMS" />
    <uses-permission android:name="android.permission.WRITE_CONTACTS" />
    <uses-permission android:name="android.permission.READ_CONTACTS" />

由上面的許可權分組可知:
WRITE_CONTACTS許可權和READ_CONTACTS許可權同屬於CONTACTS組,因此,在程式申請許可權的時候。
由於Android6.0中引入的Runtime Permission中,在申請許可權的時候只需要申請這兩者中的一個,就可以獲得統一分組中的其他許可權。
我寫的測試程式碼如下:

public class MainActivity extends AppCompatActivity {

    final private int REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS = 124;

    private Button judgePermission;

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

        judgePermission = (Button)findViewById(R.id.judge_permission);
        judgePermission.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int hasSMSSendPermission = checkSelfPermission(Manifest.permission.WRITE_CONTACTS);
                if(hasSMSSendPermission==PackageManager.PERMISSION_GRANTED) {
                    Toast.makeText(MainActivity.this, "當前應用已經有寫通訊錄的許可權了", Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(MainActivity.this, "當前應用並沒有寫通訊錄的許可權", Toast.LENGTH_SHORT).show();
                }
            }
        });

        int hasSMSPermission = checkSelfPermission(Manifest.permission.READ_SMS);
        int hasContactPermission = checkSelfPermission(Manifest.permission.READ_CONTACTS);
        if(hasSMSPermission!= PackageManager.PERMISSION_GRANTED || hasContactPermission!= PackageManager.PERMISSION_GRANTED) {
            requestPermissions(new String[]{Manifest.permission.READ_SMS, Manifest.permission.READ_CONTACTS}, REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS);
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        switch (requestCode) {
            case REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS:
                Map<String, Integer> perms = new HashMap<String, Integer>();
                // Initial
                perms.put(Manifest.permission.READ_SMS, PackageManager.PERMISSION_GRANTED);
                perms.put(Manifest.permission.READ_CONTACTS, PackageManager.PERMISSION_GRANTED);
                // Fill with results
                for (int i = 0; i < permissions.length; i++)
                    perms.put(permissions[i], grantResults[i]);
                // Check for ACCESS_FINE_LOCATION
                if (perms.get(Manifest.permission.READ_SMS) == PackageManager.PERMISSION_GRANTED
                        && perms.get(Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_GRANTED) {
                    // All Permissions Granted
                    Toast.makeText(MainActivity.this, "All Permission is Allow", Toast.LENGTH_SHORT).show();
                } else {
                    // Permission Denied
                    Toast.makeText(MainActivity.this, "Some Permission is Denied", Toast.LENGTH_SHORT)
                            .show();
                }
                break;
            default:
                super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        }
    }
}