android 清单文件写权限为什么不申请_Android请求权限

安卓系统权限分为两类:正常权限和危险权限。正常权限不会给用户隐私带来风险,只需在 AndroidManifest.xml 清单中列出该权限,系统将自动授予该权限。

而危险权限会授予应用访问用户数据,你首先要在清单中列出,然后再在代码中请求用户允许授予该权限。

5fe265cf4bb16ebe94f10b7e46e7ff38.png

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);        }    }}

在申请权限时如果用户选择了不再询问或禁止后不再提示选项,那么下一次在应用申请该权限时系统将会自动选择禁止,我将会在下一篇文章中介绍该如何处理它。


如果文章中含有某些错误或其它问题,欢迎在下方评论留言,我会及时修改。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值