我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android6.0仿微信权限设置

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android6.0仿微信权限设置

Android 6.0版本对于程序员兄弟来说最不友好的就是权限的问题,动态权限的设置曾经让我很苦恼,目前大部分关于6.0权限设置的框架基本都是一次性访问多个权限(EasyPermissions),这样导致的问题就是如果我们申请了三种权限,而用户只同意了其中一种,下次再申请权限又是一次性申请三种,很不方便对于用户来说很不友好,偶然情况下发现了安卓猴的这篇文章,
http://sunjiajia.com/2016/04/19/android-m-permissions/
在此基础上做了修改,就实现了想要的那种效果(仿照微信获取权限设置,在启动页每次只访问一个权限,用户同意则继续访问下一个权限,如果用户选择拒绝,不管用户选择的是“不再询问”还是“拒绝”都视为拒绝,就弹出提示框提示该权限的必要性,指引用户去打开权限)
下面我们以存储空间、电话、相机权限为例,
图片做的不太好,见谅见谅~~

这里写图片描述

这里写图片描述

添加权限

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

权限处理工具类


package com.fly.permissiondemo;

import android.Manifest;
import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.os.Build;
import android.support.v4.app.ActivityCompat;
import java.util.ArrayList;
import java.util.List;

public class PermissionsUtil {
 // 状态码、标志位
 public static final int REQUEST_STATUS_CODE = 0x001;
 public static final int REQUEST_PERMISSION_SETTING = 0x002;
 //常量字符串数组,将需要申请的权限写进去,同时必须要在Androidmanifest.xml中声明。
 public static String[] PERMISSIONS_GROUP_SORT = {
  Manifest.permission.READ_EXTERNAL_STORAGE,
  Manifest.permission.CALL_PHONE,
  Manifest.permission.CAMERA
 };
 private static PermissionCallbacks callbacks;
 public interface PermissionCallbacks {
 void onPermissionsGranted();//权限都有
 void onPermissionsDenied(int requestCode, List<String> perms);
 }
 public static void checkAndRequestPermissions(final Activity activity, PermissionCallbacks callback) {
 if (Build.VERSION.SDK_INT >= 23) {
  callbacks = callback;
  // 一个list,用来存放没有被授权的权限
  ArrayList<String> denidArray = new ArrayList<>();
  // 遍历PERMISSIONS_GROUP,将没有被授权的权限存放进denidArray
  for (String permission : PERMISSIONS_GROUP_SORT) {
  int grantCode = ActivityCompat.checkSelfPermission(activity, permission);
  if (grantCode == PackageManager.PERMISSION_DENIED) {
   denidArray.add(permission);
  }
  }
  // 如果该字符串数组长度大于0,说明有未被授权的权限
  if (denidArray.size() > 0) {
  //循环处理所有未授权的权限,每次只添加一个权限进行获取
  ArrayList<String> denidArrayNew = new ArrayList<>();
  denidArrayNew.add(denidArray.get(0));
  // 将denidArray转化为字符串数组,方便下面调用requestPermissions来请求授权
  String[] denidPermissions = denidArrayNew.toArray(new String[denidArrayNew.size()]);
  requestPermissions(activity, denidPermissions);
  } else {
  //已授权
  callbacks.onPermissionsGranted();
  }
 }
 }
 
 public static boolean showRationaleUI(Activity activity, String permission) {
 return ActivityCompat.shouldShowRequestPermissionRationale(activity, permission);
 }
 
 public static void requestPermissions(Activity activity, String[] permissions) {
 ActivityCompat.requestPermissions(activity, permissions, REQUEST_STATUS_CODE);
 }
 
 public static boolean isAppFirstRun(Activity activity) {
 SharedPreferences sp = activity.getSharedPreferences("config", Context.MODE_PRIVATE);
 SharedPreferences.Editor editor = sp.edit();
 if (sp.getBoolean("first_run", true)) {
  editor.putBoolean("first_run", false);
  editor.commit();
  return true;
 } else {
  editor.putBoolean("first_run", false);
  editor.commit();
  return false;
 }
 }
}

使用方法:
在启动页AppStart跳转首页的时候,调用


 PermissionsUtil.checkAndRequestPermissions(AppStart.this, new PermissionsUtil.PermissionCallbacks() {
   @Override
   public void onPermissionsGranted() {
   //所有权限都已经获取到跳转
   toMainActivity();
   }
   @Override
   public void onPermissionsDenied(int requestCode, List<String> perms) {
   }
  });

这个是在AppStart中的回调,现在的处理办法是,根据每一次提出的权限申请的回调结果来处理对应权限,并且是每一次处理完都会遍历一次
“PERMISSIONS_GROUP_SORT”,循环处理所有的权限,直到每个权限都获取到,在“onPermissionsGranted()”中进行跳转。这样处理就可以在下次启动时直接询问没有获得的权限。


 @Override
 public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
 super.onRequestPermissionsResult(requestCode, permissions, grantResults);
 if (requestCode == PermissionsUtil.REQUEST_STATUS_CODE) {
  if (permissions[0].equals(Manifest.permission.READ_EXTERNAL_STORAGE)) {//读写权限
  if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {//同意
   PermissionsUtil.checkAndRequestPermissions(this, new PermissionsUtil.PermissionCallbacks() {
   @Override
   public void onPermissionsGranted() {
    toMainActivity();
   }
   @Override
   public void onPermissionsDenied(int requestCode, List<String> perms) {
   }
   });//请求
  } else {//不同意-提示信息
   createLoadedAlertDialog("在设置-应用-"+ getString(R.string.app_name) +"-权限中开启存储空间权限,以正常使用App功能");
  }
  }
  if (permissions[0].equals(Manifest.permission.CALL_PHONE)) {//电话权限
  if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {//同意
   PermissionsUtil.checkAndRequestPermissions(this, new PermissionsUtil.PermissionCallbacks() {
   @Override
   public void onPermissionsGranted() {
    toMainActivity();
   }
   @Override
   public void onPermissionsDenied(int requestCode, List<String> perms) {
   }
   });
  } else {//不同意-提示信息
   createLoadedAlertDialog("在设置-应用-" + getString(R.string.app_name) + "-权限中开启电话权限,以正常使用App功能");
  }
  }
  if (permissions[0].equals(Manifest.permission.CAMERA)) {//电话权限
  if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {//同意
   //所有权限均获取
   toMainActivity();
  } else {//不同意-提示信息
   createLoadedAlertDialog("在设置-应用-"+ getString(R.string.app_name) +"-权限中开启照相机权限,以正常使用App功能");
  }
  }
 }
 }

在设置的权限组里边有几个权限就需要在这个回调中写几个判断来处理对应的友好提示信息,单对单处理,这种方式避免了跟用户不断扯犊子,简单粗暴提示用户获取权限,一旦用户不从,直接跳设置,负责就退出应用。
下面是git地址 https://git.oschina.net/feiyangwei/PermissionDemo.git
这个方案目前还需要完善,如果用户在打开应用的情况下,去设置里边修改权限,我不清楚怎么监听这块权限的修改,微信是直接重新打开应用,这样就会重新获取权限,如果有知道的大神可以讨论一下 。 

您可能感兴趣的文章:Android6.0动态申请权限所遇到的问题小结谈谈Android6.0运行时的权限处理详解Android6.0运行时权限管理一款不错的android6.0、7.0权限管理器推荐android6.0权限动态申请框架permissiondispatcher的方法Android 操作系统获取Root权限 原理详细解析Android获取ROOT权限的实例代码Android权限操作之uses-permission详解Android权限控制之自定义权限Android需要提升权限的操作方法安卓Android6.0权限动态获取操作示例


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android6.0仿微信权限设置

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android6.0仿微信权限设置

Android 6.0版本对于程序员兄弟来说最不友好的就是权限的问题,动态权限的设置曾经让我很苦恼,目前大部分关于6.0权限设置的框架基本都是一次性访问多个权限(EasyPermissions),这样导致的问题就是如果我们申请了三种权限,而
2022-06-06

Android仿微信QQ设置图形头像裁剪功能

最近在做毕业设计,想有一个功能和QQ一样可以裁剪头像并设置圆形头像,额,这是设计狮的一种潮流。 而纵观现在主流的APP,只要有用户系统这个功能,这个需求一般都是在(bu)劫(de)难(bu)逃(xue)! 图片裁剪实现方式有两种,一种是利用
2022-06-06

win7 everyone权限怎么设置?win7 everyone权限设置方法步骤

win7 everyone权限设置教程来咯~如果你不知道win7 everyone权限怎么设置的话可以参考下文哦~另外此方法同样适用于win8、win8.1系统,有需要的朋友请参考下文步骤吧。编程客栈 1、对需要设置权限的分区或者文件夹上单
2023-06-05

win10电脑权限如何设置管理员权限

win10系统中的管理员权限是账户权限中比较高的,能够对系统的很多设置或者程序进行操作,很多网友想到给win10系统设置win10管理员权限,但是不知道该如何设置win10电脑权限。下面小编就教下大家win10系统如何设置管理员权限。具体的
2023-07-15

Android仿微信语音聊天界面设计

有段时间没有看视频了,昨天晚上抽了点空时间,又看了下鸿洋大神的视频教程,又抽时间写了个学习记录。代码和老师讲的基本一样,网上也有很多相同的博客。我只是在AndroidStudio环境下写的。—-主界面代码——public class Mai
2022-06-06

win7怎么设置everyone权限

这篇文章主要讲解了“win7怎么设置everyone权限”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“win7怎么设置everyone权限”吧!设置方法:1、以E盘为例。打开“计算机”,并点
2023-06-28

windows2000下C盘权限设置

1.选取整个硬盘: system:完全控制 administrator:完全控制 (允许将来自父系的可继承性权限传播给对象)&n编程客栈bsp;2 /program files/common files: everyone组:读取及运行 列
2023-05-23

gitee权限设置在哪里

Gitee是一个非常受欢迎的开源代码托管平台,它为开发人员提供了一个平台,在这个平台上,他们可以共享和维护他们的代码库。许多开源社区和个人项目都使用Gitee来管理他们的代码。然而,对于没有使用过Gitee的新用户,如何设置Gitee权限可
2023-10-22

Discuz论坛权限管理:阅读权限设置指南

Discuz论坛权限管理:阅读权限设置指南在Discuz论坛管理中,权限设置是至关重要的一环。其中,阅读权限的设置尤为重要,它决定了不同用户在论坛中能够看到的内容范围。本文将详细介绍Discuz论坛的阅读权限设置,以及如何针对不同的需求进
Discuz论坛权限管理:阅读权限设置指南
2024-03-10

Discuz权限控制:了解如何设置阅读权限

Discuz权限控制:了解如何设置阅读权限,需要具体代码示例在Discuz论坛中,权限控制是非常重要的一项功能,可以帮助管理员精确地控制用户的操作和访问权限,保护论坛的安全和秩序。其中,阅读权限是其中一项必备的权限设置,通过设置不同等级的
Discuz权限控制:了解如何设置阅读权限
2024-03-10

MySQL如何设置用户权限和授权

在MySQL中,可以使用GRANT语句来设置用户权限和授权。以下是一些常见的示例:授权用户访问数据库:GRANT ALL PRIVILEGES ON database_name.* TO 'username'@'
MySQL如何设置用户权限和授权
2024-04-09

WIN7系统提示权限不够如何设置everyone权限

这篇WIN7系统如何设置everyowww.cppcns.comne权限分享给大家,当我们在复制或删除一些文件的时候,会遇到系统提示权限不够或者需要everyone的权限,那么就需要我们设置一下everyone的权限了,不过有很多人不知道该
2023-06-07

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录