IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android:权限处理 -> 正文阅读

[移动开发]Android:权限处理

1. 权限简介

权限分级别,google 会对权限设置一个标记,如果标记为 dangerous,那么获取这个权限时,会寻求用户是否同意,如果权限相对安全,只要在 manifest 文件中设置之后,会自动添加,不需要获得用户允许。

比如,读取网络图片,需要在 manifest 中添加网络权限,网络权限相对安全,所以添加到 manifest 之后会自动获得授权而不需要用户同意;

但是,最安全的做法还是在使用权限之前判断一下权限是否获取到了,如果没获取到,会崩溃。之所以要判断一下,是因为, google 可能在下一个版本中将你使用的权限从安全标记为了危险,那么原先不需要获取用户允许的权限,现在就需要获取用户允许了,如果你没有判断,那么用户拒绝之后很有可能导致 app 功能无法使用或者崩溃。

2. 在manifest文件中添加权限

首先需要在 manifest 文件中添加有可能需要的权限。

<uses-permission android:name="android.permission.CAMERA"/>

如果不添加,则在调用 RequestPermission 时,是没有反应的。

3. 检查权限

请求权限之前先通过 ActivityCompat 来检查是否已经获取到权限,不然每次都去获取权限会很恶心:

private void handlePermission() {
    // 判断当前是否有权限
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) {
         //已经获取权限则直接通过implicit intent调用相机
        openCamera();
    } else {
        // 未获取权限,则弹窗,告知未获取权限
}

4. 请求权限

请求权限时,因为如果用户拒绝两次(有的版本上是一次),那么再次调用权限请求时,系统就不会弹窗了。或者是,弹窗中会出现“不再提醒”选项,用户勾选之后,再次调用权限请求时,app 什么都不会做。

所以为了避免这种情况,需要一个方法来判断是否用户勾选了“不再提醒”选项,如果未勾选,直接请求权限,弹出系统的提示框,如果勾选了,则弹出自定义的弹窗,提示权限被关闭,并且给与用户一个打开权限的开关来跳转到权限设置界面,上述代码补充完整逻辑如下:

private void handlePermission() {
    // 判断当前是否有权限
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) {
         //已经获取权限则直接通过implicit intent调用相机
        openCamera();
    } else {
        // 未获取权限,则弹窗,告知未获取权限
        if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) {
            // 已勾选不再提醒,调用权限请求方法,app不会有任何操作,需要弹出自定义的弹窗
            popSnackBar();
        } else {
            // 未勾选不再提醒,直接请求权限
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA},1);
        }
    }
}

5. 跳转设置页面

private void popSnackBar() {
    Snackbar.make(parent, "需要相机权限",Snackbar.LENGTH_INDEFINITE)
            .setAction("开启权限", new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    // 进入app设置页面
                    Intent intent  = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                    // 传入具体的app路径
                    intent.setData(Uri.parse("package:" + getPackageName()));
                    // 判断是否有合适的跳转
                    if (intent.resolveActivity(getPackageManager()) != null) {
                        startActivityForResult(intent,SETTING_INTENT_RESULT);
                    }
                }
            })
            .show();

}

6. 获取图片回调

使用 startActivityForResult 传入 reuqestId 之后,可以在回调方法 onActivityResult 中捕获对应的 Intent 获取返回的数据,代码如下:

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    switch (requestCode) {
        case CAMERA_INTENT_RESULT:
            // 获取图片
            if (resultCode == RESULT_OK && data != null) {
                Bundle bundle = data.getExtras();
                if (bundle != null) {
                    // 获取bitmap
                    Bitmap bitmap = (Bitmap) bundle.get("data");
                    // 使用glide设置图片
                    Glide.with(this)
                            .load(bitmap)
                            .into(imageView);
                }
            }
            break;
        case SETTING_INTENT_RESULT:
            Toast.makeText(this, "从设置页面返回了", Toast.LENGTH_SHORT).show();
            break;
        default:
            break;
    }

}
  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-10-15 11:54:32  更:2021-10-15 11:56:32 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 23:03:32-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码