標籤:uri context vat request action data net 運行時 tool
一、說明
Android 6.0開始,Google將許可權分為兩類,一類是Normal Permission, 這類許可權一般不涉及使用者隱私,是不需要使用者進行授權的,比如手機震動、訪問網路等;另一類是Dangerous Permission,一般是涉及到使用者隱私的,需要使用者進行授權,比如讀取sdcard、訪問通訊錄等。
二、危險許可權列表
下表列出了Android所有的危險許可權,剩餘的許可權就都是普通許可權
需注意表中每個危險許可權都屬於一個許可權組,我們在運行時許可權處理時使用許可權名,使用者一旦同意授權了,那麼該許可權組中其他許可權也將同時被授權
三、在程式運行時申請許可權
以撥打到電話為例
介面很簡單,就一個按鈕,點擊後撥打10086.
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<Button
android:id="@+id/Make_Call"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Make_Call" />
</android.support.constraint.ConstraintLayout>
代碼:
package com.czlt.test.contentprovidertest;
import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private Button makeCall;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
makeCall = findViewById(R.id.Make_Call);
makeCall.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//判斷使用者是否已經給程式授權。第一個參數:context 第二個參數:具體許可權名。
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE)
!= PackageManager.PERMISSION_GRANTED) {
//未授權,調用 ActivityCompat.requestPermissions() 方法,向使用者申請授權
//參數:1.Activity執行個體,2.申請的許可權名數組,3.請求碼,只要是唯一值即可
ActivityCompat.requestPermissions(MainActivity.this,
new String[]{Manifest.permission.CALL_PHONE},
1);
} else {
//已授權,直接撥打到電話
call();
}
}
});
}
/**
- 撥打到電話
*/
private void call() {
try {
Intent intent = new Intent(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:10086"));
startActivity(intent);
} catch (SecurityException e) {
e.printStackTrace();
}
}
/**
- 申請授權結果
- @param requestCode 請求碼,對應 ActivityCompat.requestPermissions() 中的請求碼
- @param permissions 許可權列表
- @param grantResults 請求結果
*/
@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 the permission",Toast.LENGTH_SHORT).show();
}
break;
default:
break;
}
}
}
當然,設定檔AndroidManifest.xml 中,也要加上許可權
Android 運行時許可權(危險許可權)