安卓Permission权限请求

 AndroidPermission,权限自动请求示例(所需权限被关闭时,会自动请求)

权限请求源码:(将应用的Activity设为PermissionActivity的子类,即可自动请求所需权限)

package com.sc.demo;import android.os.Bundle;import com.sc.permission.PermissionActivity;
import com.sci.androidpermission.R;/**  * 权限请求示例*/
public class MainActivity extends PermissionActivity
{	protected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);this.setContentView(R.layout.activity_main);}
}
package com.sc.permission;import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.Toast;import com.sc.permission.PermissionTool.PermissionCallBack;/** * https://blog.csdn.net/scimence/article/details/85989997* 继承PermissionActivity可自动进行权限申请,* * AndroidBuild Target 设置为6.0,* <uses-sdk android:targetSdkVersion="23" /> * * ----- 2019-1-7 上午9:08:39 scimence  */
public class PermissionActivity extends Activity
{/** 自动解析并请求AndroidManifest.xml中设置的所有权限 */protected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);PermissionTool.Request(this);//		PermissionTool.Request(this, new PermissionCallBack()
//		{
//			@Override
//			public void Success()
//			{
//				// 在权限请求完成后,才可执行的逻辑
//				Toast.makeText(PermissionActivity.this, "PermissionCallBack -> Success", Toast.LENGTH_SHORT).show();
//			}
//		});}/** 处理权限请求结果,若未授权,则继续请求 */public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults){super.onRequestPermissionsResult(requestCode, permissions, grantResults);PermissionTool.onRequestPermissionsResult(this, requestCode, permissions, grantResults);}/** Activity执行结果 */protected void onActivityResult(int requestCode, int resultCode, Intent data){super.onActivityResult(requestCode, resultCode, data);PermissionTool.onActivityResult(this, requestCode, resultCode, data);}
}

package com.sc.permission;import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PermissionInfo;
import android.net.Uri;
import android.os.Build;
import android.os.Handler;
import android.os.Looper;
import android.os.Process;
import android.util.Log;/** * https://blog.csdn.net/scimence/article/details/85989997 * permissionTool.java: 安卓权限请求 <uses-sdk android:targetSdkVersion="23" /> * * 用法1: * 1、请求权限 			PermissionTool.Request(activity); * 2、处理权限请求结果 		PermissionTool.onRequestPermissionsResult(activity, requestCode, permissions, grantResults); * 3、系统设置权限执行回调 	PermissionTool.onActivityResult(this, requestCode, resultCode, data); * * 简易用法:继承PermissionActivity * * ----- 2019-1-7 上午9:08:39 scimence */
public class PermissionTool
{/** 请求权限 */public static void Request(Activity activity){String[] permissions = getPermissions(activity);	// 获取应用的所有权限requestPermissionProcess(activity, permissions);	// 执行权限请求逻辑}/** 获取AndroidManifest.xml中所有permission信息, 返回信息如{"android.permission.INTERNET", "android.permission.READ_PHONE_STATE"} */public static String[] getPermissions(Activity activity){String[] permissions = new String[] {};try{PackageManager packageManager = activity.getPackageManager();String packageName = activity.getPackageName();PackageInfo packageInfo = packageManager.getPackageInfo(packageName, PackageManager.GET_PERMISSIONS);permissions = packageInfo.requestedPermissions;}catch (Exception e){	}return permissions;}/** 请求所需权限 如: String[] permissions = { Manifest.permission.READ_PHONE_STATE, Manifest.permission.READ_EXTERNAL_STORAGE }; */public static void requestPermissionProcess(final Activity activity, final String... permissions){new Handler(Looper.getMainLooper()).post(new Runnable(){@Overridepublic void run(){// 版本判断。当手机系统大于 23 时,才有必要去判断权限是否获取int sdkVersion = activity.getApplicationInfo().targetSdkVersion;if (Build.VERSION.SDK_INT >= 23 && sdkVersion >= 23){// 检查该权限是否已经获取ArrayList<String> list = new ArrayList<String>();for (String permission : permissions){try{// int ret = ContextCompat.checkSelfPermission(activity.getApplicationContext(), permission);int ret = activity.checkPermission(permission, Process.myPid(), Process.myUid());// 权限是否已经 授权 GRANTED---授权 DINIED---拒绝if (ret != PackageManager.PERMISSION_GRANTED && !list.contains(permission)) list.add(permission);}catch (Exception ex){Log.e("permissionTool", "是否已授权,无法判断权限:" + permission);}}// 请求没有的权限if (list.size() > 0){String[] permission = list.toArray(new String[list.size()]);activity.requestPermissions(permission, PermissionRquestCode);	// 从权限请求返回}else{Log.e("permissionTool", "应用所需权限,均已授权。" );CallBak();}}else{CallBak();}}});}/** Android 6.0以上版本需要请求的权限信息(targetSdkVision >= 23) */private static String[] SettingPermission = new String[] { "android.permission.SEND_SMS", "android.permission.RECEIVE_SMS", "android.permission.READ_SMS","android.permission.RECEIVE_WAP_PUSH", "android.permission.RECEIVE_MMS", "android.permission.READ_EXTERNAL_STORAGE","android.permission.WRITE_EXTERNAL_STORAGE", "android.permission.READ_CONTACTS", "android.permission.WRITE_CONTACTS","android.permission.GET_ACCOUNTS", "android.permission.READ_PHONE_STATE", "android.permission.CALL_PHONE", "android.permission.READ_CALL_LOG","android.permission.WRITE_CALL_LOG", "android.permission.ADD_VOICEMAIL", "android.permission.USE_SIP", "android.permission.PROCESS_OUTGOING_CALLS","android.permission.READ_CALENDAR", "android.permission.WRITE_CALENDAR", "android.permission.CAMERA", "android.permission.ACCESS_FINE_LOCATION","android.permission.ACCESS_COARSE_LOCATION", "android.permission.BODY_SENSORS", "android.permission.RECORD_AUDIO" };private static List<String> permissinList = Arrays.asList(SettingPermission);final static int PermissionRquestCode = 6554;/** 处理权限请求结果逻辑,再次调用请求、或提示跳转设置界面 */public static void onRequestPermissionsResult(Activity activity, int requestCode, String[] permissions, int[] grantResults){if (requestCode == PermissionRquestCode){ArrayList<String> needPermissions = new ArrayList<String>();	// 应用未授权的权限ArrayList<String> noaskPermissions = new ArrayList<String>();	// 用户默认拒绝的权限for (int i = 0; i < permissions.length; i++){String permission = permissions[i];if (grantResults[i] != PackageManager.PERMISSION_GRANTED){try{// 用户点了默认拒绝权限申请,这时候就得打开自定义dialog,让用户去设置里面开启权限if (!activity.shouldShowRequestPermissionRationale(permission)){Log.i("permissionTool", "permissinList Size:" + permissinList.size());if (permissinList.contains(permission)){noaskPermissions.add(permission);}else{Log.i("permissionTool", "自动允许或拒绝权限:" + permission);}}else{// 记录需要请求的权限信息needPermissions.add(permission);}}catch (Exception ex){Log.e("permissionTool", "自动允许或拒绝权限,无法判断权限:" + permission);}}}if (needPermissions.size() > 0){requestPermissionProcess(activity, needPermissions.toArray(new String[needPermissions.size()]));	// 请求未授予的权限}else if (noaskPermissions.size() > 0){PermissionSetting(activity, noaskPermissions.get(0));	// 对话框提示跳转设置界面,添加权限}else{CallBak();}}}/** 在手机设置中打开的应用权限 */private static void PermissionSetting(final Activity activity, final String permission){if (permission.trim().equals("")) return;// 获取权限对应的标题和详细说明信息String permissionLabel = "";String permissionDescription = "";try{PackageManager packageManager = activity.getPackageManager();// Tools.showText("permission -> " + permission);PermissionInfo permissionInfo = packageManager.getPermissionInfo(permission, 0);// PermissionGroupInfo permissionGroupInfo = packageManager.getPermissionGroupInfo(permissionInfo.group, 0);// Tools.showText("permission组 -> " + permissionGroupInfo.loadLabel(packageManager).toString());permissionLabel = permissionInfo.loadLabel(packageManager).toString();// Tools.showText("permission名称 -> " + permissionLabel);permissionDescription = permissionInfo.loadDescription(packageManager).toString();// Tools.showText("permission描述 -> " + permissionDescription);}catch (Exception ex){return;}// 自定义Dialog弹窗,显示权限请求permissionLabel = "应用需要权限:" + permissionLabel + "\r\n" + permission;AlertDialog.Builder builder = new AlertDialog.Builder(activity);builder.setCancelable(false);builder.setTitle(permissionLabel);builder.setMessage(permissionDescription);builder.setPositiveButton("去添加 权限", new DialogInterface.OnClickListener(){@Overridepublic void onClick(DialogInterface dialog, int which){dialog.dismiss();// 打开应用对应的权限设置界面String action = android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS;Intent intent = new Intent(action);Uri uri = Uri.fromParts("package", activity.getPackageName(), null);intent.setData(uri);activity.startActivityForResult(intent, PermissionResultCode);	// 从应用设置界面返回时执行OnActivityResult}});builder.setNegativeButton("拒绝则 退出", new DialogInterface.OnClickListener(){@Overridepublic void onClick(DialogInterface dialog, int which){dialog.dismiss();// 若拒绝了所需的权限请求,则退出应用activity.finish();System.exit(0);}});builder.show();}final static int PermissionResultCode = 6555;/** Activity执行结果,回调函数 */public static void onActivityResult(final Activity activity, int requestCode, int resultCode, Intent data){// Toast.makeText(activity, "onActivityResult设置权限!", Toast.LENGTH_SHORT).show();if (requestCode == PermissionResultCode)	// 从应用权限设置界面返回{// Toast.makeText(activity, "onActivityResult -> " + resultCode, Toast.LENGTH_SHORT).show();PermissionTool.Request(activity);		// 再次进行权限请求(若存在未获取到的权限,则会自动申请)}}// private static boolean isCallBack = false;/** 执行权限请求回调逻辑 */private static void CallBak(){// 	if(!isCallBack)// 	{// 		isCallBack = true;if (CallInstance != null) CallInstance.Success();// 	}}// ----------/** 权限请求回调 */public static abstract class PermissionCallBack{/** 权限请求成功 */public abstract void Success();}private static PermissionCallBack CallInstance = null;/** 请求权限, 请求成功后执行回调逻辑 */public static void Request(Activity activity, PermissionCallBack Call){CallInstance = Call;String[] permissions = getPermissions(activity);	// 获取应用的所有权限new Handler(Looper.getMainLooper()).postDelayed(new Runnable(){@Overridepublic void run(){CallBak();}}, 30 * 1000);	// 30秒后自动执行回调逻辑。确保回调会被调用。requestPermissionProcess(activity, permissions);	// 执行权限请求逻辑}
}

 

AndroidPermission示例源码下载

Android6.0模拟器

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/45302.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android请求应用权限

文章目录 前言参考一、请求应用权限基本原则二、请求权限的流程&#xff08;官网摘抄&#xff09;三、请求权限编码1.允许系统管理权限请求代码2.自行管理权限请求代码 总结 前言 学习Android为什么需要动态申请危险权限 学会Android应用危险权限申请的方式 参考 Android官方…

Android提示用户获取相应手机权限

一&#xff0c;简介 Android 6.0 为了保护用户隐私&#xff0c;将一些权限的申请放在了应用运行的时候去申请&#xff0c; 比如以往的开发中&#xff0c;开发人员只需要将需要的权限在清单文件中配置即可&#xff0c;安装后用户可以在设置中的应用信息中看到&#xff1a;XX应用…

安卓手机权限总结安卓权限列表

1.android.permission.WRITE_USER_DICTIONARY允许应用程序向用户词典中写入新词 2.android.permission.WRITE_SYNC_SETTINGS写入Google在线同步设置 3.android.permission.WRITE_SOCIAL_STREAM读取用户的社交信息流 4.android.permission.WRITE_SMS允许程序写短信 5.androi…

手机特殊访问权限设置

前言 在使用手机过程中&#xff0c;权限设置比较重要&#xff0c;有一些特殊访问权限入口较为隐秘&#xff0c;例如电池优化权限&#xff0c;下面以华为鸿蒙系统为例&#xff0c;介绍如何设置特殊访问权限。 步骤 打开系统设置&#xff0c;进入应用和服务&#xff0c;进入权…

推荐几个优质的公众号!

点击上方“Python大本营”&#xff0c;选择“置顶公众号”Python大本营 IT人的职业提升平台技术之路就是漫长的打怪升级&#xff0c;不断学习前人的踩坑经验才能提升自己&#xff0c;切忌闭门造车。所谓独乐乐不如众乐乐&#xff0c;强烈推荐以下公众号&#xff0c;让你的生活…

微信公众号每日推送给女朋友的程序

微信公众日常推送保姆教程&#xff08;node版&#xff09; 1.先安装node环境(https://nodejs.org/en/) 安装过程就是&#xff1a;双击直接安装&#xff0c;不建议更改默认安装位置&#xff08;C:\&#xff09;&#xff0c;中途也保持默认设置&#xff0c;一路 “Next” 即可。…

推荐几个优质 IT 公众号

为大家推荐几个优质公众号&#xff1a; 学习需要技能&#xff0c;更需要有好的领路人&#xff0c;关注几个优质公众号&#xff0c;帮助你在学习中科学有效的成长。 以下是特地给大家挑选了几个大佬的优质号&#xff0c;强烈推荐关注。 人工智能爱好者社区 专注人工智能、机器学…

推荐9个最顶级的IT公众号

固步自封只会让自己落后于他人 如今&#xff0c;网络已将人与人之间的距离拉近 我们应开拓自己的眼界&#xff0c;结识更多的大能来丰富自己的知识 以下是8个技术公众号&#xff0c;每日共享最新的技术资讯。 快收下这波安利吧&#xff01; stormzhang stormzhang&#xff0c;大…

为大家推荐几个不错的公众号!

分享编程技能、互联网技术、生活感悟、打造干货分享平台&#xff0c;将总结的技术、心得、经验(数据结构与算法、源码分析)分享给大家&#xff0c;这里不只限于技术&#xff01;还有职场心得、生活感悟、以及面经。 工作、生活节奏超快的今天&#xff0c;想要不断提升自我&…

大模型技术发展概述 -(二)

文本内容参考论文《A Survey of Large Language Models》 论文标题&#xff1a;A Survey of Large Language Models 论文链接&#xff1a;https://arxiv.org/pdf/2303.18223v10.pdf 大模型技术发展概述 -&#xff08;二&#xff09; 4. LLM预训练4.1 数据收集4.1.1 数据源4.1.2…

chatgpt赋能python:Python区域截图教程

Python区域截图教程 截图是我们常用的操作之一。有时候&#xff0c;我们只需要截取屏幕上的某个区域&#xff0c;而不是整个屏幕。这时&#xff0c;Python的区域截图功能可以派上用场。本文将为大家详细讲解Python如何实现区域截图。 Python区域截图&#xff1a;第三方库介绍…

chatgpt赋能python:Python实现滚动截屏

Python 实现滚动截屏 现代的网页通常都会使用滚动条来展示更多的信息&#xff0c;但是传统的截图工具并不能完整地截取整个网页内容&#xff0c;因此需要使用更加智能的截屏工具。本文将介绍使用 Python 实现滚动截屏的方法。 使用 Python 的优势 Python 是一门高效的编程语…

真机telnet登录eNSP防火墙USG6000V

这次说说真机telnet防火墙USG6000V的配置方法&#xff0c;拓扑如下 cloud1配置省略。 首先呢是配置一下端口的ip、安全区域等等 接下来就是配置telnet了&#xff08;见下图&#xff09; 开启USG6000V的telnet服务 测试一下 输入用户名和密码就成功登录了 抓个包看看 可以看到…

【学习笔记】unity脚本学习(四)【inputManager、键盘输入、鼠标输入、Raycast】

目录 输入inputManagerHorizontal虚拟轴的各个属性含义&#xff08;摘选自ChatGpt&#xff0c;部分回答不准确&#xff09;键值的含义键名称命名约定&#xff1a; 键盘输入静态函数GetKeyGetButtonKeyCodeGetButton/Down/upGetAxisGetAxisRaw 返回由 axisName 标识的虚拟轴的值…

【Unity3D】用InputField做一个简易UI,为GameObject的高度y赋值

目录 一些废话之前卡过的bugInputField更新了类名&#xff0c;引用后无法拖拽单独对GameObject的Transform.position中的某一坐标赋值float.Parse()&#xff0c;格式报错FormatException点击按钮&#xff0c;值只改变了一瞬间又回到原来状态 完整代码后记 一些废话 我是一只总…

【Unity入门】3.3D物体

【Unity入门】3D物体 大家好&#xff0c;我是Lampard~~ 欢迎来到Unity入门系列博客&#xff0c;所学知识来自B站阿发老师~感谢 &#xff08;一&#xff09;物体移动旋转缩放 &#xff08;1&#xff09;物体移动 在上一篇文章【Unity入门】场景视图操作我们学会了在场景中创建3…

UnityWeb端和Js互调(MQTT通讯篇)

TOC关于Unity与Js互调&#xff08;MQTT通讯篇&#xff09;踩了很多坑接下来总结一下 总体思路 工程项目当时是PC端项目转成Web端项目。PC端采用的通讯方式是MQTT通讯订阅端&#xff0c;而如果发布成Web端的话不能直接进行MQTT通讯&#xff0c;就想了个办法通过Unity与JS互调的…

Unity Houdini插件编写data Table传递数据给Houdini

上次说到Unity Houdini插件将Tag设为group&#xff0c;里面用到了自定义输入接口。然后那个Houdini教程又给我出难题了&#xff0c;unreal 可以用一种叫data Table的数据结构来完成向Houdini结构化数据的传递&#xff08;链接&#xff09;&#xff0c;我没找到Unity类似的功能&…

【Unity】动态生成圆环体Mesh

代码由ChatGPT生成&#xff0c;后经人工调整。 /// <summary> /// 创建一个3维圆环体Mesh。 /// </summary> /// <param name"outerRadius">外半径。</param> /// <param name"innerRadius">内半径。</param> /// <…

关于vsCode中文插件突然无效的解决办法

今天今天github上下载了一个devtools 用vsCode打开,发现中文插件无效了 解决办法: 按ctrlshiftp 输入Configure Display Language 在弹出的语言中&#xff0c;选中zh-cn 然后重启vsCode