Android 权限相关

分类:Android     发布:2019-12-09     来源:本站     浏览:797 次
在Android 系统6.0版本之前,安装App时会提示用户此App都需要使用哪些权限,但是用户不可以单独对某项权限进行授权或者是拒绝,如果用户安装了该App,就表示用户已经接受了该App对这些权限的使用。从Android系统6.0版本开始,Android使用了新的权限管理机制,将App可以使用的权限分成了两类,一类是普通权限,例如,设置手机振动或者是访问网络等。另一类是危险权限,例如,开启摄像头或者是获取地理位置等。对于普通权限,仍然和以前一样,开发者只需要在AndroidManifest配置文件中添加所需的权限即可,用户只要同意安装就表示已经接受该App使用这些权限。对于危险权限来说,因为涉及到个人的隐私,所以不仅需要在AndroidManifest配置文件中添加权限,还需要在运行时请求用户授权此类权限。

运行App 时权限的申请步骤如下:
(1)判断当前手机系统版本是否大于或等于6.0 版本。可以使用以下代码: 
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            Toast.makeText(this, "大于等于6.0", Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(this, "小于6.0", Toast.LENGTH_SHORT).show();
        }

(2)检查是否授权了某个权限,这里以读取联系人权限为例。可以使用以下代码:
        //Manifest.permission.READ_CONTACTS为查询的读取联系人权限
        if (checkSelfPermission(Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {
            //没有权限,可以在这里申请权限。
        } else {
            //权限已经申请。
        }

(3)申请一组需要的权限可以是1个或者多个以数组的形式添加。可以使用以下代码:
requestPermissions(new String[]{Manifest.permission.READ_CONTACTS} ,1);
(4)用户处理完授权操作后,查看申请结果的回调。可以使用以下代码:
    @Override
    public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
        switch (requestCode) {
            case 1: {
                //判断授权码为1的申请权限数组
                //判断授权结果是否已经授权
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    //用户已同意权限
                } else {
                    //用户已拒绝权限
                }
                return;
            }
        }
    }
以开启定位权限为例:
打开manifests 目录中的AndroidManifest.xml文件,在该文件中的application节点上面添加定位权限的代码。关键代码如下:
 <!--定位权限-->
 <uses-permission android:name=”android.permission.ACCESS_FINE_LOCATION” />
package com.qingshan.control;

import androidx.appcompat.app.AppCompatActivity;

import android.Manifest;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.provider.Settings;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Spinner;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.listview);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            //判断是否没有授权定位权限
            if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                //申请定位权限
                requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 1);
            } else {
                Toast.makeText(this, "定位权限已经授权!", Toast.LENGTH_SHORT).show();
            }
        }

    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
        switch (requestCode) {
            case 1: {
                //判断授权码为1的申请权限数组
                //判断授权结果是否已经授权
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    Toast.makeText(this, "用户已经同意授权定位的权限!", Toast.LENGTH_SHORT).show();
                } else {
                    new AlertDialog.Builder(this)
                            .setTitle("提示信息")
                            .setMessage("当前应用缺少必要权限,该功能暂时无法使用。如若需要,请单击【确定】按钮前往设置中心进行权限授权。")
                            .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                }
                            })
                            .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    //通过Intent跳转设置中心界面
                                    Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                                    intent.setData(Uri.parse("package:" + getPackageName()));
                                    startActivity(intent);
                                }
                            }).show();
                }
            }
        }
    }
}

如果觉得文章对您有帮助,您可以对我进行打赏 ¥0.63 元(金额随机^_^,每次刷新金额不同)。

请使用支付宝扫码支付

留言评论

*称  呼:
*联系方式: 方便与您取得联系,推荐使用邮箱。
*内  容:

已有评论

暂无数据

上一篇:Android 常用组件-Spinner

下一篇:Android 手机获取经纬度功能(包含权限动态获取)