开发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

相关文章

Nginx 配置跨域的实现及常见问题解决

《Nginx配置跨域的实现及常见问题解决》本文主要介绍了Nginx配置跨域的实现及常见问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来... 目录1. 跨域1.1 同源策略1.2 跨域资源共享(CORS)2. Nginx 配置跨域的场景2.1

qt5cored.dll报错怎么解决? 电脑qt5cored.dll文件丢失修复技巧

《qt5cored.dll报错怎么解决?电脑qt5cored.dll文件丢失修复技巧》在进行软件安装或运行程序时,有时会遇到由于找不到qt5core.dll,无法继续执行代码,这个问题可能是由于该文... 遇到qt5cored.dll文件错误时,可能会导致基于 Qt 开发的应用程序无法正常运行或启动。这种错

Python实例题之pygame开发打飞机游戏实例代码

《Python实例题之pygame开发打飞机游戏实例代码》对于python的学习者,能够写出一个飞机大战的程序代码,是不是感觉到非常的开心,:本文主要介绍Python实例题之pygame开发打飞机... 目录题目pygame-aircraft-game使用 Pygame 开发的打飞机游戏脚本代码解释初始化部

使用Python开发一个现代化屏幕取色器

《使用Python开发一个现代化屏幕取色器》在UI设计、网页开发等场景中,颜色拾取是高频需求,:本文主要介绍如何使用Python开发一个现代化屏幕取色器,有需要的小伙伴可以参考一下... 目录一、项目概述二、核心功能解析2.1 实时颜色追踪2.2 智能颜色显示三、效果展示四、实现步骤详解4.1 环境配置4.

SpringBoot排查和解决JSON解析错误(400 Bad Request)的方法

《SpringBoot排查和解决JSON解析错误(400BadRequest)的方法》在开发SpringBootRESTfulAPI时,客户端与服务端的数据交互通常使用JSON格式,然而,JSON... 目录问题背景1. 问题描述2. 错误分析解决方案1. 手动重新输入jsON2. 使用工具清理JSON3.

MySQL 设置AUTO_INCREMENT 无效的问题解决

《MySQL设置AUTO_INCREMENT无效的问题解决》本文主要介绍了MySQL设置AUTO_INCREMENT无效的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录快速设置mysql的auto_increment参数一、修改 AUTO_INCREMENT 的值。

关于跨域无效的问题及解决(java后端方案)

《关于跨域无效的问题及解决(java后端方案)》:本文主要介绍关于跨域无效的问题及解决(java后端方案),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录通用后端跨域方法1、@CrossOrigin 注解2、springboot2.0 实现WebMvcConfig

Go语言中泄漏缓冲区的问题解决

《Go语言中泄漏缓冲区的问题解决》缓冲区是一种常见的数据结构,常被用于在不同的并发单元之间传递数据,然而,若缓冲区使用不当,就可能引发泄漏缓冲区问题,本文就来介绍一下问题的解决,感兴趣的可以了解一下... 目录引言泄漏缓冲区的基本概念代码示例:泄漏缓冲区的产生项目场景:Web 服务器中的请求缓冲场景描述代码

Python使用smtplib库开发一个邮件自动发送工具

《Python使用smtplib库开发一个邮件自动发送工具》在现代软件开发中,自动化邮件发送是一个非常实用的功能,无论是系统通知、营销邮件、还是日常工作报告,Python的smtplib库都能帮助我们... 目录代码实现与知识点解析1. 导入必要的库2. 配置邮件服务器参数3. 创建邮件发送类4. 实现邮件

解决JSONField、JsonProperty不生效的问题

《解决JSONField、JsonProperty不生效的问题》:本文主要介绍解决JSONField、JsonProperty不生效的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录jsONField、JsonProperty不生效javascript问题排查总结JSONField