安卓系統許可權分為兩類:正常許可權和危險許可權。正常許可權不會給使用者隱私帶來風險,只需在 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); } }}
在申請許可權時如果使用者選擇了不再詢問或禁止後不再提示選項,那麼下一次在應用申請該許可權時系統將會自動選擇禁止,我將會在下一篇文章中介紹該如何處理它。