首頁>技術>

安卓系統許可權分為兩類:正常許可權和危險許可權。正常許可權不會給使用者隱私帶來風險,只需在 AndroidManifest.xml 清單中列出該許可權,系統將自動授予該許可權。

而危險許可權會授予應用訪問使用者資料,你首先要在清單中列出,然後再在程式碼中請求使用者允許授予該許可權。

1、宣告許可權

首先必須要在 AndroidManifest.xml 檔案中列出所需許可權,在該檔案裡的 manifest 標籤中新增如同下面格式的許可權宣告。(檔案位置在:Android > app > manifest > AndroidManifest.xml)

// 申請單個許可權ActivityCompat.requestPermissions(this, new String[]{    Manifest.permission.READ_PHONE_STATE}, 1);
3、檢查許可權授予狀態

在請求使用者授予許可權之前使用 ContextCompat.checkSelfPermission() 方法檢查某個許可權的授予狀態,它將返回常量值。你還可以使用 List 介面來整合未授予的許可權以便待會集中申請。

// 無許可權:PackageManager.PERMISSION_DENIED

// 有許可權:PackageManager.PERMISSION_GRANTED

// 檢查許可權是否已經授予int PermissionState = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE);if(PermissionState == PackageManager.PERMISSION_GRANTED){    Toast.makeText(this, "已授權!", Toast.LENGTH_LONG).show();}else if(PermissionState == PackageManager.PERMISSION_DENIED){    Toast.makeText(this, "未授權!", Toast.LENGTH_LONG).show();}
4、完整程式碼示例

【程式碼檔案】activity_main.xml

// MainActivity.javapackage com.android.myapplication;import androidx.appcompat.app.AlertDialog;import androidx.appcompat.app.AppCompatActivity;import androidx.core.app.ActivityCompat;import androidx.core.content.ContextCompat;import android.Manifest;import android.content.DialogInterface;import android.content.pm.PackageManager;import android.os.Bundle;import android.view.View;import android.widget.Toast;import java.util.ArrayList;import java.util.List;public class MainActivity extends AppCompatActivity {    String[] Permissions = new String[]{            Manifest.permission.READ_PHONE_STATE,            Manifest.permission.WRITE_EXTERNAL_STORAGE,            Manifest.permission.ACCESS_COARSE_LOCATION    };    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);    }    // 請求許可權    public void requestPermissions(View view){        AlertDialog alertDialog = new AlertDialog.Builder(this)                .setTitle("申請許可權")                .setMessage("請選擇需要申請的許可權個數")                .setNegativeButton("單個", new DialogInterface.OnClickListener() {                    @Override                    public void onClick(DialogInterface dialogInterface, int i) {                        RequestPermission_1();                    }                })                .setPositiveButton("多個", new DialogInterface.OnClickListener() {                    @Override                    public void onClick(DialogInterface dialogInterface, int i) {                        RequestPermission_2();                    }                })                .create();        alertDialog.show();    }    // 請求單個許可權    public void RequestPermission_1(){        ActivityCompat.requestPermissions(this, new String[]{                Manifest.permission.READ_PHONE_STATE        }, 1);    }    // 請求多個許可權    public void RequestPermission_2(){        List<String> PermissionList = new ArrayList<>(); // 使用 List 來儲存需要授權的許可權列表        for (String permission : Permissions) {            if (ContextCompat.checkSelfPermission(this, permission) == PackageManager.PERMISSION_DENIED) {                PermissionList.add(permission);            }        }        if(PermissionList.isEmpty()){            Toast.makeText(MainActivity.this, "所有許可權均已授權", Toast.LENGTH_LONG).show();        }else{            String[] permissions = PermissionList.toArray(new String[0]);            ActivityCompat.requestPermissions(this, permissions, 1);        }    }}

在申請許可權時如果使用者選擇了不再詢問或禁止後不再提示選項,那麼下一次在應用申請該許可權時系統將會自動選擇禁止,我將會在下一篇文章中介紹該如何處理它。

17
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 2020 年 JavaScript 狀態調研報告小結