注意:本篇文章是本人閱讀相關(guān)文章所寫(xiě)下的總結(jié)睦尽,方便以后查閱荆隘,所有內(nèi)容非原創(chuàng),侵權(quán)刪捺宗。
本篇文章內(nèi)容來(lái)自于
1.Android第一行代碼 郭霖
目錄
1.權(quán)限分類(lèi)(普通權(quán)限+危險(xiǎn)權(quán)限)
2.申請(qǐng)單個(gè)權(quán)限 第一行代碼248
3.申請(qǐng)多個(gè)權(quán)限 第一行代碼388
1.權(quán)限分類(lèi)
1??低于6.0系統(tǒng)的設(shè)備<use-permission> 安裝時(shí)給權(quán)限申請(qǐng)?zhí)嵝押崤梗铱梢栽谠O(shè)置中進(jìn)行管理尚粘。如果不同意某項(xiàng)則這個(gè)軟件不能使用。
2??6.0系統(tǒng)加入運(yùn)行時(shí)權(quán)限 用戶(hù)不需要在安裝時(shí)一次性申請(qǐng)所有權(quán)限蝇庭,可以在軟件使用過(guò)程中對(duì)某一項(xiàng)申請(qǐng)進(jìn)行授權(quán) 拒絕后只是不能用這個(gè)功能醉鳖,其他功能依舊可以使用
但并不是所有權(quán)限都需要運(yùn)行時(shí)申請(qǐng),對(duì)于用戶(hù)來(lái)說(shuō)哮内,不停授權(quán)也很麻煩盗棵。
Android將所有權(quán)限分為:
普通權(quán)限 系統(tǒng)自動(dòng)授權(quán)(只需要在清單文件中<use-permission> )
危險(xiǎn)權(quán)限 必須用戶(hù)手動(dòng)授權(quán) 威脅安全(需要?jiǎng)討B(tài)申請(qǐng))
Android中有上百種權(quán)限,如何區(qū)分哪些是普通哪些是危險(xiǎn)北发。危險(xiǎn)權(quán)限一共有9組24個(gè)纹因,其他的都是普通權(quán)限。
所有權(quán)限列表查看Android權(quán)限列表(轉(zhuǎn))
Android危險(xiǎn)權(quán)限:
編號(hào) | 權(quán)限組 | 權(quán)限 |
---|---|---|
0 | CALENDAR | READ_CALENDAR WRITE_CALENDAR |
1 | CAMERA | CAMERA |
2 | CONTACTS | READ_CONTACTS WRITE_CONTACTS GET_ACCOUNTS |
3 | LOCATION | ACCESS_FINE_LOCATION ACCESS_COARSE_LOCATION |
4 | MICROPHONE | RECORD_AUDIO |
5 | PHONE | READ_PHONE_STATE CALL_PHONE READ_CALL_LOG WRITE_CALL_LOG ADD_VOICEMAIL USE_SIP PROCESS_OUTGOING_CALLS |
6 | SENSORS | BODY_SENSORS |
7 | SMS | SEND_SMS RECEIVE_SMS READ_SMS RECEIVE_WAP_PUSH RECEIVE_MMS |
8 | STORAGE | READ_EXTERNAL_STORAGE WRITE_EXTERNAL_STORAGE |
注意:表格中的每個(gè)危險(xiǎn)權(quán)限都屬于一個(gè)權(quán)限組琳拨,我們?cè)谶M(jìn)行運(yùn)行時(shí)權(quán)限處理時(shí)使用的是權(quán)限名瞭恰,但是用戶(hù)一旦同意授權(quán)了,那么該權(quán)限所對(duì)應(yīng)的權(quán)限組中的其他權(quán)限也會(huì)同時(shí)被授權(quán)狱庇。
2.申請(qǐng)單個(gè)權(quán)限
例子:點(diǎn)擊按鈕進(jìn)行撥號(hào)惊畏,需要危險(xiǎn)權(quán)限中的CALL_PHONE權(quán)限
第一步:在清單文件中聲明權(quán)限
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.apple.encryptiondemo">
<uses-permission android:name="android.permission.CALL_PHONE" />
...
第二步:在代碼中進(jìn)行動(dòng)態(tài)申請(qǐng)權(quán)限
public class MainActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btn_call = findViewById(R.id.btn_call);
btn_call.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//==第一步:判斷用戶(hù)是否已經(jīng)授權(quán)
//ContextCompat.checkSelfPermission() 參數(shù)一:context 參數(shù)二:具體的權(quán)限名
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
//沒(méi)有授權(quán)恶耽,則申請(qǐng)授權(quán)
//ActivityCompat.requestPermissions() 參數(shù)一:context 參數(shù)二:申請(qǐng)的權(quán)限名數(shù)組 參數(shù)三:請(qǐng)求碼,要求唯一值
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CALL_PHONE}, 1);
} else {
call();
}
}
});
}
@SuppressLint("MissingPermission")
private void call() {
Intent intent = new Intent(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:10086"));
startActivity(intent);
}
//==第二步:調(diào)用requestPermissions申請(qǐng)權(quán)限颜启,不管是否同意都會(huì)回調(diào)onRequestPermissionsResult
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode) {
case 1:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
call();
} else {
Toast.makeText(MainActivity.this, "you denied", Toast.LENGTH_SHORT).show();
}
break;
}
}
}
3.申請(qǐng)多個(gè)權(quán)限
第一步:在清單文件中聲明權(quán)限
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.apple.encryptiondemo">
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
第二步:在代碼中進(jìn)行動(dòng)態(tài)申請(qǐng)權(quán)限
public class MainActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btn_call = findViewById(R.id.btn_call);
btn_call.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//第一步:看權(quán)限是否已經(jīng)被申請(qǐng)偷俭,沒(méi)有則申請(qǐng)權(quán)限
List<String> permissionList = new ArrayList<>();
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
permissionList.add(Manifest.permission.CALL_PHONE);
}
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
permissionList.add(Manifest.permission.READ_PHONE_STATE);
}
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
permissionList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
}
if (!permissionList.isEmpty()) {
String[] permissions = permissionList.toArray(new String[permissionList.size()]);
ActivityCompat.requestPermissions(MainActivity.this, permissions, 1);
} else {
call();
}
}
});
}
@SuppressLint("MissingPermission")
private void call() {
Intent intent = new Intent(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:10086"));
startActivity(intent);
}
//第二步:調(diào)用requestPermissions申請(qǐng)權(quán)限,不管是否同意都會(huì)回調(diào)onRequestPermissionsResult
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode) {
case 1:
if (grantResults.length > 0) {
for (int result : grantResults) {
if (result != PackageManager.PERMISSION_GRANTED) {
Toast.makeText(MainActivity.this, "you denied some", Toast.LENGTH_SHORT).show();
finish();
return;
}
}
call();
}else{
Toast.makeText(MainActivity.this, "發(fā)生未知錯(cuò)誤", Toast.LENGTH_SHORT).show();
finish();
}
break;
}
}
}