开发app在android6.0运行直接退出解决(二)

2024-09-06 15:58

本文主要是介绍开发app在android6.0运行直接退出解决(二),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

上篇文章:http://blog.csdn.net/u013408979/article/details/52289534
只简单的解决能在android6.0运行,但没有根本的解决问题。
下面介绍解决方法:

参考
http://xdeveloper.cn/gai-jin-ban-android6-0quan-xian-gua-pei-bi-ni-xiang-de-huan-yao-jian-dan/

权限的适配主要就是两步,一是请求权限,二是系统应答,主要在这两个地方进行封装。主要使用第三方库PermissionsDispatcher

(1)项目build.gradle 中添加
classpath ‘com.neenbedankt.gradle.plugins:android-apt:1.8’
(2)app的 build.gradle 中添加
apply plugin:’android-apt’
apt ‘com.github.hotchemi:permissionsdispatcher-processor:2.1.3’

1.定义PermissionHandler用于权限回调,权限通过、权限拒绝、权限不再询问三种情况

public abstract class PermissionHandle{//权限通过public abstract void onGranted();//权限拒绝public abstract void onDenied();//权限不在询问public boolean onNeverAsk(){return false;}}

2、请求权限

private PermissionHandle mHandle;/*** 请求权限* @param permissions 权限列表* @param handle 回调*/protected void requestPermission(String[] permissions,PermissionHandle handle){if (PermissionUtil.hasSelfPermissions(this,permissions)){handle.onGranted();}else{mHandle=handle;ActivityCompat.requestPermissions(this,permissions,001);}}

注:PermissionUtil是PermissionsDispatcher中使用的工具类

public final class PermissionUtil {private static SimpleArrayMap<String,Integer> MIN_SDK_PERMISSIONS;static {MIN_SDK_PERMISSIONS=new SimpleArrayMap<>(8);MIN_SDK_PERMISSIONS.put("com.android.voicemail.permission.ADD_VOICEMAIL",14);MIN_SDK_PERMISSIONS.put("android.permission.BODY_SENSORS",20);MIN_SDK_PERMISSIONS.put("android.permission.READ_CALL_LOG",16);MIN_SDK_PERMISSIONS.put("android.permission.READ_EXTERNAL_STORAGE",16);MIN_SDK_PERMISSIONS.put("android.permission.USE_SIP",9);MIN_SDK_PERMISSIONS.put("android.permission.WRITE_CALL_LOG",16);MIN_SDK_PERMISSIONS.put("android.permission.SYSTEM_ALERT_WINDOW", 23);MIN_SDK_PERMISSIONS.put("android.permission.WRITE_SETTINGS", 23);}private static volatile int targetSdkVersion=-1;public PermissionUtil() {}//检查所有的权限是否被授权public static boolean verifyPermissions(int... grantResults){if (grantResults.length==0){return false;}for (int result : grantResults) {if (result!= PackageManager.PERMISSION_GRANTED){return false;}}return true;}//如果活动或片段可以访问所有给定的权限,则返回truepublic static boolean hasSelfPermissions(Context context,String... permissions){for (String permission : permissions) {if (permissionExists(permission)&&hasSelfPermissions(context,permission)){return false;}}return true;}//如果在这个SDK版本存在的权限,则返回trueprivate static boolean permissionExists(String permission) {Integer minVersion = MIN_SDK_PERMISSIONS.get(permission);return minVersion == null || Build.VERSION.SDK_INT >= minVersion;}//确定上下文访问给定的权限。private static boolean hasSelfPermission(Context context, String permission) {try {return PermissionChecker.checkSelfPermission(context, permission) == PackageManager.PERMISSION_GRANTED;} catch (RuntimeException t) {return false;}}//检查需要给予的权限,显示理由public static boolean shouldShowRequestPermissionRationale(Activity activity, String... permissions) {for (String permission : permissions) {if (ActivityCompat.shouldShowRequestPermissionRationale(activity, permission)) {return true;}}return false;}//获取sdk 版本@TargetApi(Build.VERSION_CODES.DONUT)public static int getTargetSdkVersion(Context context) {try {if (targetSdkVersion != -1) {return targetSdkVersion;}PackageInfo packageInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);targetSdkVersion = packageInfo.applicationInfo.targetSdkVersion;} catch (PackageManager.NameNotFoundException ignored) {}return targetSdkVersion;}
}

3.权限结果处理

 /*** 权限请求结果* @param requestCode* @param permissions* @param grantResults*/@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);if (mHandle==null){return;}if (PermissionUtil.shouldShowRequestPermissionRationale(this,permissions)){if (!mHandle.onNeverAsk()){Toast.makeText(this, "权限已被拒绝,请在设置-应用-权限中打开", Toast.LENGTH_SHORT).show();}}else{mHandle.onDenied();}}

4、调用

public class PermissionActivity extends XPermissionActivity implements View.OnClickListener {private Context mContext;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_permission);mContext=PermissionActivity.this;findViewById(R.id.btn_camera).setOnClickListener(this);findViewById(R.id.btn_call).setOnClickListener(this);}@Overridepublic void onClick(View v) {switch (v.getId()){case R.id.btn_camera:requestPermission(new String[]{Manifest.permission.CAMERA}, new PermissionHandle() {@Overridepublic void onGranted() {Intent intent = new Intent(); //调用照相机intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);startActivity(intent);}@Overridepublic void onDenied() {Toast.makeText(PermissionActivity.this, "拒绝", Toast.LENGTH_SHORT).show();}});break;case R.id.btn_call:requestPermission(new String[]{Manifest.permission.CALL_PHONE}, new PermissionHandle() {@Overridepublic void onGranted() {/*Intent i=new Intent(Intent.ACTION_CALL,Uri.parse("tel:10086"));startActivity(i);*/Uri uri = Uri.parse("tel:10086");Intent intent = new Intent(Intent.ACTION_DIAL, uri);startActivity(intent);}@Overridepublic void onDenied() {Toast.makeText(PermissionActivity.this, "拒绝", Toast.LENGTH_SHORT).show();}@Overridepublic boolean onNeverAsk() {new AlertDialog.Builder(mContext).setTitle("权限申请").setMessage("在设置-应用-权限中开始电话权限,以保证功能的正常使用").setPositiveButton("去开启",new DialogInterface.OnClickListener(){@Overridepublic void onClick(DialogInterface dialog, int which) {Intent i=new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);Uri uri=Uri.fromParts("package",getPackageName(),null);i.setData(uri);startActivity(i);dialog.dismiss();}}).setNegativeButton("取消",null).setCancelable(false).show();return true;}});break;}}
}

这篇关于开发app在android6.0运行直接退出解决(二)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1142458

相关文章

解决pandas无法读取csv文件数据的问题

《解决pandas无法读取csv文件数据的问题》本文讲述作者用Pandas读取CSV文件时因参数设置不当导致数据错位,通过调整delimiter和on_bad_lines参数最终解决问题,并强调正确参... 目录一、前言二、问题复现1. 问题2. 通过 on_bad_lines=‘warn’ 跳过异常数据3

解决RocketMQ的幂等性问题

《解决RocketMQ的幂等性问题》重复消费因调用链路长、消息发送超时或消费者故障导致,通过生产者消息查询、Redis缓存及消费者唯一主键可以确保幂等性,避免重复处理,本文主要介绍了解决RocketM... 目录造成重复消费的原因解决方法生产者端消费者端代码实现造成重复消费的原因当系统的调用链路比较长的时

深度解析Nginx日志分析与499状态码问题解决

《深度解析Nginx日志分析与499状态码问题解决》在Web服务器运维和性能优化过程中,Nginx日志是排查问题的重要依据,本文将围绕Nginx日志分析、499状态码的成因、排查方法及解决方案展开讨论... 目录前言1. Nginx日志基础1.1 Nginx日志存放位置1.2 Nginx日志格式2. 499

SpringBoot监控API请求耗时的6中解决解决方案

《SpringBoot监控API请求耗时的6中解决解决方案》本文介绍SpringBoot中记录API请求耗时的6种方案,包括手动埋点、AOP切面、拦截器、Filter、事件监听、Micrometer+... 目录1. 简介2.实战案例2.1 手动记录2.2 自定义AOP记录2.3 拦截器技术2.4 使用Fi

kkFileView启动报错:报错2003端口占用的问题及解决

《kkFileView启动报错:报错2003端口占用的问题及解决》kkFileView启动报错因office组件2003端口未关闭,解决:查杀占用端口的进程,终止Java进程,使用shutdown.s... 目录原因解决总结kkFileViewjavascript启动报错启动office组件失败,请检查of

PyQt5 GUI 开发的基础知识

《PyQt5GUI开发的基础知识》Qt是一个跨平台的C++图形用户界面开发框架,支持GUI和非GUI程序开发,本文介绍了使用PyQt5进行界面开发的基础知识,包括创建简单窗口、常用控件、窗口属性设... 目录简介第一个PyQt程序最常用的三个功能模块控件QPushButton(按钮)控件QLable(纯文本

SQL Server安装时候没有中文选项的解决方法

《SQLServer安装时候没有中文选项的解决方法》用户安装SQLServer时界面全英文,无中文选项,通过修改安装设置中的国家或地区为中文中国,重启安装程序后界面恢复中文,解决了问题,对SQLSe... 你是不是在安装SQL Server时候发现安装界面和别人不同,并且无论如何都没有中文选项?这个问题也

Go语言并发之通知退出机制的实现

《Go语言并发之通知退出机制的实现》本文主要介绍了Go语言并发之通知退出机制的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1、通知退出机制1.1 进程/main函数退出1.2 通过channel退出1.3 通过cont

MySQL多实例管理如何在一台主机上运行多个mysql

《MySQL多实例管理如何在一台主机上运行多个mysql》文章详解了在Linux主机上通过二进制方式安装MySQL多实例的步骤,涵盖端口配置、数据目录准备、初始化与启动流程,以及排错方法,适用于构建读... 目录一、什么是mysql多实例二、二进制方式安装MySQL1.获取二进制代码包2.安装基础依赖3.清

java内存泄漏排查过程及解决

《java内存泄漏排查过程及解决》公司某服务内存持续增长,疑似内存泄漏,未触发OOM,排查方法包括检查JVM配置、分析GC执行状态、导出堆内存快照并用IDEAProfiler工具定位大对象及代码... 目录内存泄漏内存问题排查1.查看JVM内存配置2.分析gc是否正常执行3.导出 dump 各种工具分析4.