Android6.0 运行时权限

Android 6.0运行时动态权限详解与实战 Android 6.0(API 级别 23)引入了运行时权限模型,标志着Android应用安全机制的重大变革。在此之前,应用在安装时需声明所有权限,用户只能选择接受全部或放弃安装,缺乏对敏感权限的细粒度控制。自Android 6.0起,系统将危险权限划归为运行时权限,要求应用在实际使用前动态申请,显著提升了用户隐私保护能力。本章将深入剖析动态权限的背景动因、设计目标及其在整个Android权限体系中的定位,帮助读者建立完整的认知框架,为后续技术实践打下坚实基础。 阅读详情

#android 6.0运行时权限 Android 中的权限在6.0(API23)之前一直是在安装应用的时候一次性授予的,要不不安装此软件,要么接受此软件申请的所有权限。6.0之后,Google更改了权限的授予方式,用户在安装时可以选择授予或者不授予应用申请的权限,到需要使用此权限的时候再去向用户申请。 ##权限的两种类型

  • ###普通权限

    普通权限指的是那些不涉及用户隐私的一些权限,比如连接网络,读取网络状态,比如去系统相册选择图片,再比如。
    如果应用声明其需要正常权限,系统会自动向应用授予该权限,而不需要应用去向用户实时申请,同时,用户也无法取消授予这些权限。
    下面的这些权限是被称为普通权限(PROTECTION_NORMAL)的

    • ACCESS_LOCATION_EXTRA_COMMANDS
    • ACCESS_NETWORK_STATE
    • ACCESS_NOTIFICATION_POLICY
    • ACCESS_WIFI_STATE
    • BLUETOOTH
    • BLUETOOTH_ADMIN
    • BROADCAST_STICKY
    • CHANGE_NETWORK_STATE
    • CHANGE_WIFI_\MULTICAST_STATE
    • CHANGE_WIFI_STATE
    • DISABLE_KEYGUARD
    • EXPAND_STATUS_BAR
    • GET_PACKAGE_SIZE
    • INSTALL_SHORTCUT
    • INTERNET
    • KILL_BACKGROUND_PROCESSES
    • MODIFY_AUDIO_SETTINGS
    • NFC
    • READ_SYNC_SETTINGS
    • READ_SYNC_STATS
    • RECEIVE_BOOT_COMPLETED
    • REORDER_TASKS
    • REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
    • REQUEST_INSTALL_PACKAGES
    • SET_ALARM
    • SET_TIME_ZONE
    • SET_WALLPAPER
    • SET_WALLPAPER_HINTS
    • TRANSMIT_IR
    • UNINSTALL_SHORTCUT
    • USE_FINGERPRINT
    • VIBRATE
    • WAKE_LOCK
    • WRITE_SYNC_SETTINGS
  • ###危险权限

    危险权限涵盖应用需要涉及用户隐私信息的数据或资源,或者可能对用户存储的数据或其他应用的操作产生影响的区域。例如,能够读取用户的联系人属于危险权限,拨打电话属于危险权限,获取定位信息属于危险权限...如果应用声明其需要危险权限,则用户必须明确向应用授予该权限。这就需要动态向用户申请,也就是我们说的运行时权限申请。
    这里还有一件事情要说明,就是权限组的概念。 ####权限组
    如果一个应用既需要写文件也需要读取文件, 既需要读取联系人也需要添加联系人, 既需要粗略定位也需要精确定位。 想象一下,如果不停地向用户去申请这些权限,用户是否会很反感。 所以,为了提供更好的用户体验,谷歌爸爸创造了一个权限组的概念!
    权限组(这里只说危险权限,其实任何权限都可以属于一个权限组): 1. 任何一个危险权限都应该属于一个权限组, 2. 一旦应用申请的某个危险权限被用户授予, 3. 那么该权限组内的其他危险权限也被授予。 事实上,在你申请打电话权限的时候,系统弹框也是在询问用户是否授予该应用电话权限。电话权限的权限组报错打电话权限。 ####9大权限组

    • CALENDAR
    • CAMERA
    • CONTACTS
    • LOCATION
    • MICROPHONE
    • PHONE
    • SENSORS
    • SMS
    • STORAGE

权限组包含的权限 ##接下来我们来说说怎么申请运行时权限 ###1. 先说说几个系统api

  1. checkSelfPermission

    检查是否授予了某一项权限,
    如果权限已经授予,返回0,否则返回-1 Determine whether you have been granted a particular permission.

  2. shouldShowRequestPermissionRationale

    当你没有某个权限的时候,你最好显示一个UI组件,告诉用户这个应用为什么需要这个权限,告诉用户如果授予该权限会有带来什么好处,
    如果您的权限请求已经被拒绝过一次,返回true,否则返回false
    Gets whether you should show UI with rationale for requesting a permission. You should do this only if you do not have the permission and the context in which the permission is requested does not clearly communicate to the user what would be the benefit from granting this permission.

  3. requestPermissions

    当检查到用户没有授予某项你需要的危险权限的时候,向用户申请该权限 Requests permissions to be granted to this application. These permissions must be requested in your manifest

  4. onRequestPermissionsResult

    这是 requestPermissions 方法的回调,每次调用requestPermissions都会有一次回调
    Callback for the result from requesting permissions. This method is invoked for every call on requestPermissions(String[], int).

###2. 再说说怎么用 这里面有一个坑很多文章都没有讲明白,我也是在项目中遇到了才把这个问题给搞清楚了的。大多数文章的示例都是以Activity为背景讲的,像我这种刚接触运行时权限的菜鸟而言,当然就是copy下别人的用法喽,一不小心就掉进了坑里。
这个坑就是onRequestPermissionsResult方法根本没被调用。帅哥们看这里! ####敲黑板划重点: 上面我们说的四个系统api中的后面三个方法其实是有两套的,Activity使用一套, Fragment要使用另外一套!在Activity中使用ActivityCompat.requestPermissions,在Fragment中使用requestPermissions

###3. Talk is simple , show u the code! 我们来看示例代码:
####看看Fragment怎么用
1.检查权限

if (ContextCompat.checkSelfPermission(mContext, Manifest.permission.CALL_PHONE)
     	 == PackageManager.PERMISSION_GRANTED) {
    //已经授权,
}else{
	//没有权限
}

2.显示原因

if(shouldShowRequestPermissionRationale(Manifest.permission.CALL_PHONE){
	//如果需要显示请求权限的原因 在这里写        
} else {
	//请求权限                  
}

3.请求权限

requestPermissions(new String[]{Manifest.permission.CALL_PHONE},1);

4.处理回调

@Override
public void onRequestPermissionsResult(int requestCode,String permissions[], int[] grantResults) {
	super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}

一个完整的Fragment:

package com.example.francis.demo.simpletest;

import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.content.ContextCompat;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.example.francis.demo.R;

public class RuntimePermissionFragment extends Fragment {
    private final int REQUEST_CODE_CALL_PHONE = 1;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        super.onCreateView(inflater, container, savedInstanceState);
        View view = inflater.inflate(R.layout.fragment_runtime_permission, container, false);
        view.findViewById(R.id.call_button).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.CALL_PHONE) == PackageManager.PERMISSION_GRANTED) {
                    //打电话逻辑在哪里写
                } else {
                    if (shouldShowRequestPermissionRationale(Manifest.permission.CALL_PHONE)) {
                        //展示你给用户的解释,这不是必须的,如果你觉得不需要或者你不想解释,那就不要解释了 
                    } else {
                        requestPermissions(new String[]{Manifest.permission.CALL_PHONE}, REQUEST_CODE_CALL_PHONE);
                    }
                }
            }
        });
        return view;
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == REQUEST_CODE_CALL_PHONE) {
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                //打电话权限被授予
                //打电话逻辑写这里
            } else {
                //用户拒绝了你的打电话权限
            }
        }
    }
}

####看看Activity怎么用
1.检查权限

if (ContextCompat.checkSelfPermission(mContext, Manifest.permission.CALL_PHONE)
     	 == PackageManager.PERMISSION_GRANTED) {
    //已经授权,
}else{
	//没有权限
}

2.显示原因

if(ActivityCompat.shouldShowRequestPermissionRationale(Manifest.permission.CALL_PHONE){
	//如果需要显示请求权限的原因 在这里写        
} else {
	//请求权限                  
}

3.请求权限

ActivityCompat.requestPermissions(new String[]{Manifest.permission.CALL_PHONE},1);

4.处理回调

@Override
public void onRequestPermissionsResult(int requestCode,String permissions[], int[] grantResults) {
	super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}

一个简单Activity示例

package com.example.francis.demo.simpletest;

import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;

import com.example.francis.demo.R;

public class RuntimePermissionActivity extends AppCompatActivity {
    private final int REQUEST_CODE_CALL_PHONE = 1;

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

        findViewById(R.id.call_button).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (ContextCompat.checkSelfPermission(RuntimePermissionActivity.this, Manifest.permission.CALL_PHONE) == PackageManager.PERMISSION_GRANTED) {
                    //打电话逻辑在哪里写
                } else {
                    if (ActivityCompat.shouldShowRequestPermissionRationale(RuntimePermissionActivity.this,Manifest.permission.CALL_PHONE)) {
                        //展示你给用户的解释,这不是必须的,如果你觉得不需要或者你不想解释,那就不要解释了
                    } else {
                        //请求权限
                        ActivityCompat.requestPermissions(RuntimePermissionActivity.this,new String[]{Manifest.permission.CALL_PHONE}, REQUEST_CODE_CALL_PHONE);
                    }
                }
            }
        });
    }
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == REQUEST_CODE_CALL_PHONE) {
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                //打电话权限被授予
                //打电话逻辑写这里
            } else {
                //用户拒绝了你的打电话权限
            }
        }
    }
}

##小结 到了这里,运行时权限的申请流程和细节大家应该已经非常清楚了,接下来你需要做的就是自己写写看,看看源码介绍。虽然也有很多别人写好的很多库可以直接来调用,但是万变不离其宗,知道本质再去使用第三方库吧。
对了,别忘了在清单文件中声明这些危险权限哦?...

Kali Linux渗透测试:蚁剑(AntSword)三种安装方法与避坑指南 WebShell管理是渗透测试与网络安全攻防演练中的关键技术环节,它允许安全人员在获得初步访问权限后,对目标系统进行文件管理、命令执行和数据库操作等深度控制。其核心原理是通过在Web服务器上植入特定脚本,建立一条隐蔽的远程管理通道。在实战中,一个高效、稳定的WebShell管理工具能极大提升后渗透阶段的工作效率与成功率。蚁剑(AntSword)作为一款功能强大的国产开源工具,凭借其插件化架构和图形化界面,成为众多安全研究人员的首选。本文将聚焦于如何在渗透测试专用操作系统Kali Linux上部署蚁剑,详细对 阅读详情

相关推荐

倍福TwinCAT3 OPC UA配置全流程:从安装到无密码访问(附常见问题解决)

本文提供了倍福TwinCAT3 OPC UA配置的完整实战指南,重点讲解如何实现无密码游客访问。从软件安装、授权配置、服务器初始化到深度排错,详细解析了配置流程中的关键步骤与常见陷阱,帮助工程师高效打通PLC与上位系统的数据通讯通道。

vulkan6gpu的博客 472

Android6.0动态申请权限的两种办法

Android 6.0 动态申请权限的两种办法最近在写项目中被安卓6.0动态申请权限所困惑,有一些自己纠结的问题,今天闲着没事就想着写篇博客来分享自己遇到的问题和解决办法。 一开始我在网上找到的申请权限的代码是ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.READ_CONTACTS);(在an

bilionera的博客 4747

十二、基于FPGA实现slave SelectMAP配置逻辑

slave SelectMAP配置

weixin_41838250的博客 8754

requestPermissions和checkSelfPermission源码解析

Android在6.0之前采用的是静态权限,什么是静态权限呢?就是你安装的时候会询问你是否允许App内的所有权限,只要有一个拒绝,那么这个App你就无法安装了;6.0开始,采用动态权限管理,也就是说你的App可以先安装,具体使用什么权限的时候再去请求就好了,默认权限是全部禁止的所以我学Android时候的老师最喜欢把 compileSdkVersion 从23写成22,就是觉得动态申请权限过于麻烦,

梁超杰 1万+

RS485 MODBUS转PROFINET网关案例丨汇川变频器接入到1200 PROFINET

本案例介绍的是用北京小疆智控(北京)技术有限公司生产的GW-PN5003型MODBUS RTU转PROFINET网关将汇川变频器接入西门子PLC1200 PROFINET网络的使用方法。

bjxjzk的博客 1880

html reference apk,Application

booleanVariation ofabstractbooleanConnect to an application service, creating it if needed.abstractintDetermine whether the calling process of an IPC or you have beengranted a particular permission.ab...

weixin_39880621的博客 204

2026年美赛数学建模竞赛 MCM B题:使用太空电梯系统建立月球殖民地 问题一 月球殖民地材料运输的三种场景建模 详细解题思路和代码

如果运输系统不能完美工作(例如,系绳摆动、火箭失败、电梯故障等),你的解决方案在多大程度上会发生变化?技术可行性:三种方案在技术上都是可行的,但挑战不同 经济性:混合方案在长期视角下最具成本效益 时间效率:并行运输可以显著缩短总建设时间环境影响:太空电梯的环境优势明显,混合方案可平衡需求风险分散:混合方案提供了天然的风险分散机制

YOLO 615

android 6.0权限管理新策略,Android6.0 权限管理学习

一、前言Android M 开始,App不会在安装的时候授予权限,而是在运行时一个一个的询问用户授予权限。1. 运行时权限仅当我们设置targetSdkVersion >=23才起作用,当然还要是M系统的手机。app在6.0之前的设备依然使用旧的权限系统。2. 如果app的targetSdkVersion 注意,此时用户依然可以取消已经同意的授权!用户取消授权时,android 6.0系统...

weixin_39816362的博客 195

OpenClaw-遇到的问题- FailoverError: Model context window too small (4096 tokens). Minimum is 16000

摘要:OpenClaw配置文件中deepseek-reasoner模型的上下文窗口被默认设置为4096 tokens(实际支持128K),导致系统报错"Model context window too small"。解决方案是删除配置文件中的contextWindow和maxTokens字段,让系统自动获取模型真实能力,并重启OpenClaw服务。配置文件通常位于用户目录下的.openclaw/openclaw.json中。

直到世界的尽头 4163

pytest学习和使用19-pytest断言失败后,怎样保持后续的断言继续执行?(pytest-assume)

【代码】pytest学习和使用19-pytes断言失败后,怎样保持后续的断言继续执行?

虫无涯的博客 1390

android studio umeng,Android Studio集成友盟SDK出现的问题解决及原因分析

在集成友盟SDK后,之前调试开发者都正常,但在导出release APK时再次出现以下问题:Error:Execution failed for task ':app:packageRelease'.> Unable to compute hash of X:\coding\MyAPP\app\build\intermediates\classes-proguard\release\clas...

weixin_31937319的博客 517

【声呐技术】基于人工智能的拖曳阵声呐声学数据处理系统 SEA公司AI辅助拖曳阵系统

KraitSense是SEA公司开发的紧凑型被动拖曳阵声呐系统,核心传感器为KraitArray细线拖曳阵列。该系统专为小型舰艇、无人水面艇(USV)和无人潜航器(UUV)设计,通过人工智能与机器学习技术实现水下声学数据的自动化采集、处理与分类。系统与Mind Foundry公司开发的软件平台深度集成,形成端到端的智能反潜战(ASW)解决方案。

u012133341的博客 957

Android 6.0 运行时权限处理完全解析

转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/50709663; 本文出自:【张鸿洋的博客】 一、概述 随着Android 6.0发布以及普及,我们开发者所要应对的主要就是新版本SDK带来的一些变化,首先关注的就是权限机制的变化。对于6.0的几个主要的变化,查看查看官网的这篇文章http://develope

Hongyang 29万+

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Android 6.0+ 运行时权限探索

引言:去年Android 6.0发布后,其新引入的(Requesting Permissions at Run Time)运行时权限就备受开发者关注,随着今年国内手机厂商对6.0系统的普及,觉得大家有必要了解下这个新特性,因为在TargetSDK23+进行开发不注意这些会造成APP运行在6.0+手机上崩溃,这篇博文将对这个新特性进行探索。 在之前的SDK开发中,如果需要用到一些权限例如打电话,发

李济洲的博客 1万+

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

安卓6.0运行java代码_Android 6.0 运行时权限处理

运行时权限介绍Android 6.0在我们原有的AndroidManifest.xml声明权限的基础上,又新增了运行时权限动态检测,以下权限都需要在运行时判断:身体传感器日历摄像头通讯录地理位置麦克风电话短信存储空间运行时权限处理Android6.0系统默认为targetSdkVersion小于23的应用默认授予了所申请的所有权限,所以如果你以前的APP设置的targetSdkVersion低于2...

weixin_32563347的博客 112

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

安卓项目实战之Android 6.0运行时权限请求框架PermissionsDispatcher的使用

PermissionsDispatcher是一个用注解方式来处理Android6.0运行时权限的库,旨在高效处理权限问题。

智玲君 1544

Android6.0运行时权限

一、运行时权限所谓运行时权限,指的是在Android6.0及以上版本中,在app运行时才请求相关权限,从而让每项权限都在用户知情的情况下被授权(当然用户可以拒绝)。而不同于Android6.0之前在安装app时告知用户获取全部权限。 关于权限,分为正常权限(一般和设备相关)、危险权限(用户数据相关)和特殊权限。具体可见https://developer.android.com/guide/topi

如故 3889

Android6.0运行时权限解决方案

Android中单点登录的一种解决方案前提:服务端用户系统已集成token监听被踢下线的方式 任意请求返回token失效 在任意一个http请求中后台返回特定的code:与用户相关的http请求往往需要带上token,当token过期或者对应的账户在另一处登录时,后台返回预先预定好的code,Android端在网络层对code进行判断(可在网络层基类model统一处理) 第三方api的全局监听器 如

时间会走,可我不会 1901

Android 运行时权限申请之电话权限(兼容6.0以上)

Android 运行时权限申请之电话权限(兼容6.0以上) 运行时权限的申请一般是危险权限的申请,在android 6.0以后,所有的危险权限都需要用户手动的确认是否开启。下面图片是所有的危险权限。不必牢记,需要用的时候直接查询即可。本文来看电话权限的申请。 1.首先在AndroidManifest.xml中申明权限 <!--拨打电话权限--> <uses-permission...

u014714188的博客 8018

Android 6 0 运行时权限处理

Android 6 0 运行时权限处理

gfdhjf的博客 270

Android 6.0及以上版本的运行时权限介绍

运行时权限介绍 Android 6.0在我们原有的AndroidManifest.xml声明权限的基础上, 又新增了运行时权限动态检测,以下权限都需要在运行时判断: 身体传感器 日历 摄像头 通讯录 地理位置 麦克风 电话 短信 存储空间 运行时权限处理 Android6.0系统默认为targetSdkVersion小于2

sinat_29096599的博客 1903

Android6.0运行时权限处理

Android6.0运行时权限概述今天在开发中遇到读取app缓存文件的时候,在6.0系统上直接空异常,查看了manifest配置,其中也加入了相关的权限,于是想到Android 6.0的新特性。对于6.0的几个主要的变化,查看查看官网的这篇文章http://developer.android.com/intl/zh-cn/about/versions/marshmallow/android-6.0-

Wman 2318

android 6.0 运行时权限框架

android 6.0 有些危险权限需要运行时手动获取才能继续执行应用,否则将出来很多崩溃问题android提供了API可以在运行时获取权限,但是要用到权限的页面比较多,这样就要在每个页面写着几个方法来判断权限,其实可以用封装好的权限框架来解决这个问题。网上有很多权限框架比如(PermissionGen)(MPermissions)这些框架都封装的很好,这里我为大家介绍的这个框架(EasyPermission)这款框架只有一个类,同样解决了以上问题,代码量很少,很容易读懂学习。在此分享出来供大家学习。

sinat_23134455的专栏 5536

Android 6.0运行时权限详解

1.介绍Runtime Permissions官方说明Android 6.0之前,权限在应用安装过程中只询问一次,以列表的形式展现给用户,然而大多数用户并不会注意到这些,直接就下一步了,应用安装成功后就会被赋予清单文件中的所有权限,应用就可以在用户不知情的情况下进行非法操作(比如偷偷的上传用户数据)。Android 6.0版本中运行时权限的出现解决的这一问题,一些高危权限会在应用的运行过程中动态申请

YangLe 7661

Android 6.0的运行时权限 批量申请

Android 6.0,代号棉花糖,自发布伊始,其主要的特征运行时权限就很受关注。因为这一特征不仅改善了用户对于应用的使用体验,还使得应用开发者在实践开发中需要做出改变。 没有深入了解运行时权限的开发者通常会有很多疑问,比如什么是运行时权限,哪些是运行时的权限,我的应用是不是会在6.0系统上各种崩溃呢,如何才能支持运行时权限机制呢。本文讲尝试回答这一些问题,希望读者阅读完成之后,都能找到较为

cheating_man的博客 3649
上一篇: 一个Android开发者的知识体系
下一篇: BottomNavigationView底部导航栏的一点东西
ApiPlayer
博客等级 码龄12年 34粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值