安卓系统权限分为两类:正常权限和危险权限。正常权限不会给用户隐私带来风险,只需在 AndroidManifest.xml 清单中列出该权限,系统将自动授予该权限。
而危险权限会授予应用访问用户数据,你首先要在清单中列出,然后再在代码中请求用户允许授予该权限。
1、声明权限
首先必须要在 AndroidManifest.xml 文件中列出所需权限,在该文件里的 manifest 标签中添加如同下面格式的权限声明。(文件位置在:Android > app > manifest > AndroidManifest.xml)
2、请求权限
其中的 INTERNET 网络访问权限为正常权限,是不需要额外请求用户授权的,系统将自动允许该权限。而其它危险权限就需要用户明确授予,使用 ActivityCompat.requestPermissions() 方法来请求一个或多个权限。
// 申请单个权限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
<?xml version="1.0" encoding="utf-8"?>
【代码文件】AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
【代码文件】MainActivity.java
// 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 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); } }}
在申请权限时如果用户选择了不再询问或禁止后不再提示选项,那么下一次在应用申请该权限时系统将会自动选择禁止,我将会在下一篇文章中介绍该如何处理它。
如果文章中含有某些错误或其它问题,欢迎在下方评论留言,我会及时修改。