转载请注明出处 http://blog.csdn.net/pyfysf/article/details/78204395

Android 6.0(API 级别 23)开始,在应用运行时向其授予权限,而不是在应用安装时授予。这样可以让用户对应用的功能进行更多控制;

系统权限分为两类:正常权限和危险权限:


正常权限不会直接给用户隐私权带来风险。如果你的应用在其清单中列出了正常权限,系统将自动授予该权限。


危险权限会授予应用访问用户隐私数据的权限。如果你列出了危险权限,则用户必须明确批准您的应用使用这些权限。


注:从 Android 6.0(API 级别 23)开始,用户可以随时从任意应用调用权限,即使应用面向较低的 API 级别也可以调用。无论您的应用面向哪个 API 级别,您都应对应用进行测试,以验证它在缺少需要的权限时行为是否正常。

  • 正常权限
NFC
READ_SYNC_SETTINGS
READ_SYNC_STATS
RECEIVE_BOOT_COMPLETED
REORDER_TASKS
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
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
  • 危险权限
group:android.permission-group.CONTACTS
permission:android.permission.WRITE_CONTACTS
permission:android.permission.GET_ACCOUNTS
permission:android.permission.READ_CONTACTS group:android.permission-group.PHONE
permission:android.permission.READ_CALL_LOG
permission:android.permission.READ_PHONE_STATE
permission:android.permission.CALL_PHONE
permission:android.permission.WRITE_CALL_LOG
permission:android.permission.USE_SIP
permission:android.permission.PROCESS_OUTGOING_CALLS
permission:com.android.voicemail.permission.ADD_VOICEMAIL group:android.permission-group.CALENDAR
permission:android.permission.READ_CALENDAR
permission:android.permission.WRITE_CALENDAR group:android.permission-group.CAMERA
permission:android.permission.CAMERA group:android.permission-group.SENSORS
permission:android.permission.BODY_SENSORS group:android.permission-group.LOCATION
permission:android.permission.ACCESS_FINE_LOCATION
permission:android.permission.ACCESS_COARSE_LOCATION group:android.permission-group.STORAGE
permission:android.permission.READ_EXTERNAL_STORAGE
permission:android.permission.WRITE_EXTERNAL_STORAGE group:android.permission-group.MICROPHONE
permission:android.permission.RECORD_AUDIO group:android.permission-group.SMS
permission:android.permission.READ_SMS
permission:android.permission.RECEIVE_WAP_PUSH
permission:android.permission.RECEIVE_MMS
permission:android.permission.RECEIVE_SMS
permission:android.permission.SEND_SMS
permission:android.permission.READ_CELL_BROADCASTS

因此,如果API 23及以上时,我们申请危险权限时,除了在清单文件配置,还要在代码中进行动态申请

我们可以自己去写代码进行权限代码申请,这种方法可以参考这样一篇博客

Android6.0及以上版本申请权限讲解

利用easypermissions进行权限申请

首先在app项目下的build.gradle中添加

android {
....
} repositories {
maven {
url "http://maven.aliyun.com/nexus/content/repositories/releases"
}
} dependencies {
....
compile 'pub.devrel:easypermissions:1.0.1'
}

这里以照相机权限和位置权限作为例子来讲解;

首先在清单文件(AndroidManifest.xml)中声明这两个属性


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

然后在Activity中重写:


@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults); // Forward results to EasyPermissions
EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
}

然后我们就可以直接在Activity中书写请求权限的代码了

//请求码
@AfterPermissionGranted(RC_CAMERA_AND_LOCATION) private void methodRequiresTwoPermission() {
String[] perms = {Manifest.permission.CAMERA,
Manifest.permission.ACCESS_FINE_LOCATION};
if (EasyPermissions.hasPermissions(this, perms)) {
// Already have permission, do the thing
// ... Toast.makeText(this, "已经授权", Toast.LENGTH_SHORT).show();
//表明已经授权,可以进行用户授予权限的操作 } else {
// Do not have permissions, request them now //弹出一个对话框进行提示用户
EasyPermissions.requestPermissions(this, "应用时需要照相机权限",
RC_CAMERA_AND_LOCATION, perms); }
}

第一次打开app之后,拒绝权限。第二次进入app就会弹出这个对话框

在oncreate方法中调用这个方法就可以了。

完整的MainActivity


public class MainActivity extends AppCompatActivity { private static final int RC_CAMERA_AND_LOCATION = 100; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); methodRequiresTwoPermission();
} @Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults); // Forward results to EasyPermissions
EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
} @AfterPermissionGranted(RC_CAMERA_AND_LOCATION)
private void methodRequiresTwoPermission() {
String[] perms = {Manifest.permission.CAMERA,
Manifest.permission.ACCESS_FINE_LOCATION};
if (EasyPermissions.hasPermissions(this, perms)) {
// Already have permission, do the thing
// ... Toast.makeText(this, "已经授权", Toast.LENGTH_SHORT).show(); } else {
// Do not have permissions, request them now EasyPermissions.requestPermissions(this, "应用时需要照相机权限",
RC_CAMERA_AND_LOCATION, perms); }
} }

easypermissions的github地址,更多详细代码点击这里

easypermissions的基本使用的更多相关文章

  1. android 权限库EasyPermissions

    文章链接:https://mp.weixin.qq.com/s/H63Sn03xV0JoINXB4SWWKA 众所周知,在android 6.0之后,如果应用程序需要危险权限,则用户必须明确向应用授予 ...

  2. EasyPermissions的流程

    在app的build.gradle文件的dependencies中,添加依赖: implementation 'pub.devrel:easypermissions:1.3.0' import and ...

  3. Android6.0------权限申请~easypermissions

    前面写了Android6.0权限介绍和权限单个,多个申请,用的是纯Java代码,本文主要说的是借助第三方库来实现权限申请. 借助第三方库 easypermissions来申请6.0权限,Google官 ...

  4. 运行时权限请求框架easypermissions

    前言 之前使用过AndPermission权限申请库,当开发者执行有权限的代码发生异常时,AndPermission会抓到异常并回调到失败中,这里要注意的是会抓到任何异常,不仅仅是没有权限时的异常. ...

  5. Android开源项目-Easypermissions

    Easypermissions简化了Android M的运行时权限的申请.结果处理.判断等步骤. 1 相关文档 官方文档: https://github.com/googlesamples/easyp ...

  6. Android框架式编程之EasyPermissions

    EasyPermission库是一个谷歌官方提供的简化基本的系统权限逻辑的库,可用于在Android M或者更高版本上. 官方项目地址:https://github.com/googlesamples ...

  7. easypermissions拒绝权限后闪退。 java.lang.NoSuchMethodError: No virtual method isStateSaved()Z in class Landroid/support/v4/app/FragmentManager

    Process: com.tazan.cd.streetlight, PID: 18825 java.lang.NoSuchMethodError: No virtual method isState ...

  8. 【Android开发】EasyPermissions 请求权限

    安卓6.0以后,开发应用的时候,仅在AndroidManifest.xml中申请权限已经不可以了,需要在代码中动态申请. 现在看一个google推出的机制:EasyPermissions 引入步骤: ...

  9. 一行代码解决Android M新的运行时权限问题

    Android M运行时权限是个啥东西 啥是运行时权限呢?Android M对权限管理系统进行了改版,之前我们的App需要权限,只需在manifest中申明即可,用户安装后,一切申明的权限都可来去自如 ...

随机推荐

  1. Nginx 部署 Ant Design pro

    利用Ant Design pro开发的项目,如何用Nginx部署呢? 第一步:把项目打包,打包命令如下: npm run build 运行完毕会在项目目录下生成dist文件夹. 第二步:想要测试打包好 ...

  2. 用汇编语言给XP记事本添加“自动保存”功能 good

    [文章标题]: 用汇编语言给XP记事本添加“自动保存”功能 [文章作者]: newjueqi [作者邮箱]:zengjiansheng1@126.com [作者QQ]:190678908 [使用工具] ...

  3. C++ 王者归来:对编程语言的需求总结为四个:效率,灵活,抽象,生产率(C++玩的是前三个,Java和C#玩的是后两个)

    Why C++ ? 王者归来(转载) 因为又有人邀请我去Quora的C2C网站去回答问题去了,这回是 关于 @laiyonghao 的这篇有点争议的博文<2012 不宜进入的三个技术点>A ...

  4. vs2010添加TSTCON( ActiveX Control Test Container )工具

    vs2010中的TSTCON( ActiveX Control Test Container )工具非自动安装,而是作为一个例程提供.所以应找到该例程,并编译: 如vs2010安装在默认路径则 1, ...

  5. HTTP请求GET和POST的区别

    HTTP请求GET和POST的区别: 1.GET提交,请求的数据会附在URL之后(就是把数据放置在HTTP协议头<request-line>中), 以?分割URL和传输数据,多个参数用&a ...

  6. DHCP服务部署流程

    为某一局域网部署DHCP [root@dhcp ~]# yum install -y dhcp[root@dhcp ~]# rpm -ql dhcp/usr/sbin/dhcpd:dhcp服务进程 / ...

  7. Netty源码分析--创建Channel(三)

    恩~,没错,其实这一篇才是真正的开始分析源码,你打我呀~. 先看一下我Netty的启动类 private void start() throws Exception { EventLoopGroup ...

  8. JS工具整理

    1.获取今日日期:摘抄地址:https://www.cnblogs.com/carekee/articles/1678041.html getTodayFmt('yyyy-MM-dd') getTod ...

  9. 使用回调的方式实现中间件-laravel

    $app = function ($request) { echo $request . "\n"; return "项目运行中....."; }; // 现在 ...

  10. MySQL优化(一)

    MySQL数据库优化一之引索详解 对于网站优化最注重的就是数据库的优化,而在数据库优化中首先考虑到的应该是数据库索引是否建立于是否建立的正确. 1.对于刚刚接触数据库的程序员,对于引索不是很理解.下面 ...