Android 許可權,許可權分組的一些問題
阿新 • • 發佈:2019-01-04
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);
}
}
}