Android存储、摄像头、录音权限检查,适配小米、vivo 、oppo、锤子、魅族、联想等机型和6.0以下系统
Android 6.0以上检测权限用ActivityCompat.checkSelfPermission(context,permissionCode)或ContextCompat.checkSelfPermission(context,permissionCode)
private static boolean hasPermission(Context context, String permissionCode) {MyLog.e("permission", "permissionCode:" + permissionCode);try {MyLog.e("permission", "checkSelfPermission:" + (ActivityCompat.checkSelfPermission(context, permissionCode) == PackageManager.PERMISSION_GRANTED));return ActivityCompat.checkSelfPermission(context, permissionCode) == PackageManager.PERMISSION_GRANTED;} catch (Exception e) {e.printStackTrace();return false;}}
但是部分手机机型无论权限是否开启都会返回PackageManager.PERMISSION_GRANTED,对这些机型要进行特殊处理,同样的方法也适用于6.0以下可以更改权限的机型
经检测有以下机型会始终返回PackageManager.PERMISSION_GRANTED,联想(lenovo),红米(xiaomi)、魅族(meizu)、锤子(smartisan)、vivo(vivo)、oppo(oppo)
1.判断手机系统版本是否为6.0以下,生产厂商是不是这几家
private static boolean isSpecialDevice() {MyLog.e("permission", "Build.BRAND:" + Build.BRAND);return Build.VERSION.SDK_INT < Build.VERSION_CODES.M || Build.BRAND.toLowerCase().equals("smartisan")|| Build.BRAND.toLowerCase().equals("xiaomi") || Build.BRAND.toLowerCase().equals("oppo") || Build.BRAND.toLowerCase().equals("vivo")|| Build.BRAND.toLowerCase().equals("lenovo") || Build.BRAND.toLowerCase().equals("meizu");}
2.对于符合1情况的手机特殊处理
(1)摄像头权限判断,通过打开相机的方式判断有无拍照权限,记得最终要释放资源
public static boolean checkCameraPermission(Context context) {try {if (isSpecialDevice()) {//通过尝试打开相机的方式判断有无拍照权限(在6.0以下使用拥有root权限的管理软件可以管理权限)boolean isCanUse = true;Camera mCamera = null;try {mCamera = Camera.open();Camera.Parameters mParameters = mCamera.getParameters();mCamera.setParameters(mParameters);} catch (Exception e) {isCanUse = false;} finally {if (mCamera != null) {try {mCamera.release();} catch (Exception e) {e.printStackTrace();isCanUse = false;} finally {return isCanUse;}} else {return false;}}} else {return hasPermission(context, Manifest.permission.CAMERA);}} catch (Exception e) {e.printStackTrace();return false;}}
(2)录音权限判断,通过能否开始录音判断有无录音权限,也是注意最终释放资源
public static boolean checkAudioPermission(Context context) {try {if (isSpecialDevice()) {// 音频获取源int audioSource = MediaRecorder.AudioSource.MIC;// 设置音频采样率,44100是目前的标准,但是某些设备仍然支持22050,16000,11025int sampleRateInHz = 44100;// 设置音频的录制的声道CHANNEL_IN_STEREO为双声道,CHANNEL_CONFIGURATION_MONO为单声道int channelConfig = AudioFormat.CHANNEL_IN_STEREO;// 音频数据格式:PCM 16位每个样本。保证设备支持。PCM 8位每个样本。不一定能得到设备支持。int audioFormat = AudioFormat.ENCODING_PCM_16BIT;// 缓冲区字节大小int bufferSizeInBytes;boolean flag;bufferSizeInBytes = AudioRecord.getMinBufferSize(sampleRateInHz, channelConfig, audioFormat);AudioRecord audioRecord = new AudioRecord(audioSource, sampleRateInHz, channelConfig, audioFormat, bufferSizeInBytes);//开始录制音频try {// 防止某些手机崩溃,例如联想audioRecord.startRecording();} catch (IllegalStateException e) {e.printStackTrace();} finally {/*** 根据开始录音判断是否有录音权限*/if (audioRecord.getRecordingState() != AudioRecord.RECORDSTATE_RECORDING)flag = false;elseflag = true;audioRecord.stop();audioRecord.release();return flag;}} else {return hasPermission(context, Manifest.permission.RECORD_AUDIO);}} catch (Exception e) {e.printStackTrace();return false;}}
(3)存储权限判断,通过新建文件或者文件夹后判断新建文件或文件夹是否存在来判断,最后是否需要删除自行判定
public static boolean checkStoragePermission(Context context) {try {if (isSpecialDevice()) {String absolute_dir;absolute_dir = Environment.getExternalStorageDirectory().toString() + "/temp/";File f = new File(absolute_dir);if (!f.exists()) f.mkdirs();if (f.exists()) return true;else return false;} else {return hasPermission(context, Manifest.permission.READ_EXTERNAL_STORAGE);}} catch (Exception e) {e.printStackTrace();return false;}}
用这种方法常用手机基本都能覆盖到,有问题留言讨论哈
Android存储、摄像头、录音权限检查,适配小米、vivo 、oppo、锤子、魅族、联想等机型和6.0以下系统相关推荐
- Android P SELinux (三) 权限检查原理与调试
Android P SELinux (一) 基础概念 Android P SELinux (二) 开机初始化与策略文件编译过程 Android P SELinux (三) 权限检查原理与调试 Andr ...
- Android之如何分析手机系统相册图片和视频删除后保存的位置然后恢复文件,目前已经适配小米、OPPO、VIVO、一加、努比亚、魅族等手机。
1 需求 需要获取各种型号手机系统相册图片和视频删除后保存的位置 2 分析 1)我们可以通过在sdcard目录下进行相关查找文件夹关键字,对 "cycle"或者"tras ...
- android极光推送 小米,android 接极光推送厂商通道,华为 小米 VIVO OPPO
我首先接入极光推送,然后才来接厂商通道, 需要先接极光推送的看我另外一边帖子, 1 在根目录的build.gradle buildscript{ repositories{ google() jc ...
- android喜马拉雅播放器,喜马拉雅车载播放器(随车听)-喜马拉雅FM车机版v2.0.0 安卓版-腾牛安卓网...
喜马拉雅FM车机版,听音乐.听相声.听小品.听有声小说.听脱口秀...凡是能听的,都能在这里找到,伴侣着你的开车行程,带给你耳朵更多能力. 喜马拉雅FM车机版版本说明: 喜马拉雅FM推出车机版! 3亿 ...
- [Android多媒体二]调用系统录音机录音并存储到指定位置,适配安卓 7.0
接上一篇文章,[Android多媒体一]调用系统相机拍照并存储到指定位置,适配安卓 7.0 本文讲述如何调用系统录音机,完成录音后,对录音进行指定位置的保存. 一.开始编写 首先,还是理清一下思路,在 ...
- 申请动态权限(文件存储,录音,录像和相机)
1.首先在要申请权限的界面定义全局变量的权限数组和请求状态码: //读写权限private static String[] PERMISSIONS_STORAGE = {Manifest.permis ...
- mi5s plus android 8.0,小米回应5s/5s Plus迟迟没更新安卓8.0:加速适配
原标题:小米回应5s/5s Plus迟迟没更新安卓8.0:加速适配 小米回应5s/5s Plus迟迟没更新安卓8.0:加速适配 近日,小编从微博.小米社区及其他网络论坛了解到,因为小米5s和小米5s ...
- Android调用摄像头--农民伯伯原文
Android开发指南(33) -- Multimedia and Camera - Camera 前言 本章内容为Android开发者指南的 Framework Topics/Multimedia ...
- Android MediaProjection截屏录屏-适配AndroidQ以上版本
工作中遇到截屏需求,首先想到的肯定是截图所在区域的控件,通过Canvas类将View绘制成一个Bitmap,之后是要显示还是保存都可以了.但是事实上还是有一些问题存在,已知有两个问题:①不能截取到状态 ...
最新文章
- 全面探索 FreeMarker 模版引擎的扩展性
- python 用if判断一个数是不是整数_Python基础教程07-函数和模块的使用
- const 一级指针的启示
- C#.NET根据数据库中0,1返回对应代表含义“男”,“女”等问题
- 使用pyinstaller打包python程序时问题记录
- 【Kafka】docker下kafka报错 IOException: Connection to xxx:19093 (id: 1002 rack: null) failed
- 【网络原理】数据链路层
- 机器学习:混淆矩阵、准确率、错误率、灵敏度、特异度、精准率、召回率、F-Measure、ROC曲线 PR曲线
- 风变编程python小课课件_待风变编程的 Python 网课是什么? Python 网课怎么
- c1xx : warning C4199: C++/CLI、C++/CX 或 OpenMP 不支持两阶段名称查找;请使用 /Zc:twoPhase-
- Window10 和 Ubuntu20.04 双系统安装
- 星加坡php开发_新加坡樟宜机场新地标-星耀樟宜 | 贝诺Benoy
- android xlog崩溃日志,Android第三方log库:xlog使用记录
- python添加文字水印中间旋转45度,Python添加pdf水印
- SVM 之 松弛变量
- 向 Oracle 数据库添加 ST_Geometry 类型
- DDD为什么能火起来?DDD 与微服务到底是啥关系!
- 高超音速技术行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
- 无效回表谁的锅?存储引擎:这事儿不赖我
- Python 函数传参详解