Android6.0系统以下的麦克风权限处理
来源:互联网 发布:樱井知香影音先锋 编辑:程序博客网 时间:2024/05/21 14:02
基本上只在Android6.0版本去处理相关的权限。但是,以此,如果6.0以下,5.0或4.0呢,本来只需要在manifest中授权即可的,但是需求是有的手机非要把权限禁止了,然后还让你提示未授权,可以因为6.0以下机型的不同,判断获取的接口不一定好使怎么办。在这儿我只有语音的处理方法。
顺便拿出6.0系统处理权限代码:直接就可以使用。
1,首先在BaseActivity中添加如下代码;
/** * 授权运行 * @param permissions 需要权限 * @param listener 权限监听 */ public void requestRunPermission(String[] permissions, PermissionListener listener){ mListener = listener; List<String> permissionLists = new ArrayList<>(); for(String permission : permissions){ if(ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED){ permissionLists.add(permission); } } if(!permissionLists.isEmpty()){ ActivityCompat.requestPermissions(this, permissionLists.toArray(new String[permissionLists.size()]), PERMISSION_REQUESTCODE); }else{ //表示全都授权了 mListener.onGranted(); } } /** * 申请授权处理结果 */ @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); switch (requestCode){ case PERMISSION_REQUESTCODE: try { if(grantResults.length > 0){ //存放没授权的权限 List<String> deniedPermissions = new ArrayList<>(); for(int i = 0; i < grantResults.length; i++){ int grantResult = grantResults[i]; String permission = permissions[i]; if(grantResult != PackageManager.PERMISSION_GRANTED){ deniedPermissions.add(permission); } } if(deniedPermissions.isEmpty()){ //说明都授权了 mListener.onGranted(); }else{ mListener.onDenied(deniedPermissions); } } } catch (Exception e) { e.printStackTrace(); } break; default: break; } }2,然后在继承BaseActivity的XXActivity中使用如下方法:(这儿只添加了麦克风权限,可以添加多个权限)
requestRunPermission(new String[]{Manifest.permission.RECORD_AUDIO}, new PermissionListener() { @Override public void onGranted() { //表示所有权限都授权了,这块添加已经获取权限后要执行的方法 } @Override public void onDenied(List<String> deniedPermission) { for (String permission : deniedPermission) { if (permission.equals("android.permission.RECORD_AUDIO")) { Toast.makeText(ChatActivity.this, "被拒绝的权限:麦克风权限,如果拒绝将无法正常使用聊天功能", Toast.LENGTH_SHORT).show(); } } //当拒绝了授权后,为提升用户体验,可以以弹窗的方式引导用户到设置中去进行设置 userRefusePermissionsDialog(); } });
/** * 用户拒绝了权限申请提醒 */ private void userRefusePermissionsDialog() { //当拒绝了授权后,为提升用户体验,可以以弹窗的方式引导用户到设置中去进行设置 new AlertDialog.Builder(ChatActivity.this) .setMessage("需要开启权限才能使用此功能,否则无法正常使用") .setPositiveButton("设置", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { //引导用户到设置中去进行设置 Intent intent = new Intent(); intent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS"); intent.setData(Uri.fromParts("package", getPackageName(), null)); startActivity(intent); } }) .setNegativeButton("取消", null) .create() .show(); }通过这两步基本就已经完成了6.0权限的管理和处理,很简单吧。
下面说一下6.0以下语音权限处理方法:个人想法,但是试验是成功的
这个方法就是再语音录好之后,路径是有的,但是文件是空的,只要判断文件大小就知道录音是否成功,
private RecorderUtil recorder = new RecorderUtil();
//特殊处理,如果api小于23,低于安卓6.0即判断是否第一次点击,解决预录bug if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { String path = recorder.getFilePath();//recoder是录音工具实例 File file = new File(path); try { FileInputStream inputStream = new FileInputStream(file); long i = inputStream.getChannel().size(); if (i == 0) { //当拒绝了授权后,为提升用户体验,可以以弹窗的方式引导用户到设置中去进行设置 refuseVoicePermissionsDialog(); }else { //表示所有权限都授权了,这块添加已经获取权限后要执行的方法 } } catch (Exception e) { e.printStackTrace();} }
/** * 用户拒绝了权限申请提醒 */ private void refuseVoicePermissionsDialog() { //当拒绝了授权后,为提升用户体验,可以以弹窗的方式引导用户到设置中去进行设置 new AlertDialog.Builder(ChatActivity.this) .setMessage("录音权限被禁止,需要开启权限才能使用此功能,请在授权管理或应用程序管理打开,否则无法正常使用") .setPositiveButton("设置", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { //引导用户到设置中去进行设置 Intent intent = new Intent(); intent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS"); intent.setData(Uri.fromParts("package", getPackageName(), null)); startActivity(intent); } }) .setNegativeButton("取消", null) .create() .show(); }
录音工具类也一并贴出来吧;
package com.maobang.imsdk.util.media;import android.media.MediaRecorder;import android.util.Log;import com.maobang.imsdk.util.storage.FileUtil;import java.io.File;import java.io.IOException;import java.io.RandomAccessFile;/** * 录音工具 */public class RecorderUtil { private static final String TAG = "RecorderUtil"; private String mFileName = null; private MediaRecorder mRecorder = null; private long startTime; private long timeInterval; private boolean isRecording; public RecorderUtil(){ mFileName = FileUtil.getCacheFilePath("tempAudio"); } /** * 开始录音 */ public void startRecording() { if (mFileName == null) return; if (isRecording){ mRecorder.release(); mRecorder = null; } //由于权限原因,需要加入异常处理 try { mRecorder = new MediaRecorder(); mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); mRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); mRecorder.setOutputFile(mFileName); mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); startTime = System.currentTimeMillis(); try { mRecorder.prepare(); mRecorder.start(); isRecording = true; } catch (Exception e){ Log.e(TAG, "prepare() failed"); } }catch(RuntimeException e){ //出现异常,starttime置0 startTime = 0; //做出处理,让语音不发送 Log.e(TAG, "由于权限原因音频录制初始化失败 failed"); }finally { } } /** * 停止录音 */ public void stopRecording() { if (mFileName == null) return; long stopTime = System.currentTimeMillis(); if(startTime == 0){ //如果开始录制的时间为0 ,说明录制出现问题,最常见的是由于权限引起的问题 startTime = stopTime; } timeInterval = stopTime - startTime; try{ if (timeInterval>1000){ mRecorder.stop(); } mRecorder.release(); mRecorder = null; isRecording =false; }catch (Exception e){ Log.e(TAG, "release() failed"); } } /** * 取消语音 */ public synchronized void cancelRecording() { if (mRecorder != null) { try { mRecorder.release(); mRecorder = null; } catch (Exception e) { e.printStackTrace(); } File file = new File(mFileName); file.deleteOnExit(); } isRecording =false; } /** * 获取录音文件 */ public byte[] getDate() { if (mFileName == null) return null; try{ return readFile(new File(mFileName)); }catch (IOException e){ Log.e(TAG, "read file error" + e); return null; } } /** * 获取录音文件地址 */ public String getFilePath(){ return mFileName; } /** * 获取录音时长,单位秒 */ public long getTimeInterval() { return timeInterval/1000; } /** * 将文件转化为byte[] * * @param file 输入文件 */ private static byte[] readFile(File file) throws IOException { // Open file RandomAccessFile f = new RandomAccessFile(file, "r"); try { // Get and check length long longlength = f.length(); int length = (int) longlength; if (length != longlength) throw new IOException("File size >= 2 GB"); // Read file and return data byte[] data = new byte[length]; f.readFully(data); return data; } finally { f.close(); } }}
这个就是我对6.0以下,语音权限被禁止后,怎么判断权限是被禁止的,然后给出提示。就是判断录音文件大小是否为0.
1 0
- Android6.0系统以下的麦克风权限处理
- Android6.0以下系统判断相机权限
- Android6.0以下系统判断相机权限
- Android6.0权限的处理
- 关于android6.0权限适配6.0系统以下的问题总结(二维码扫描)
- 国内第三方Rom在Android6.0以下系统的权限适配
- Android6.0的权限系统
- Android6.0 权限处理
- Android6.0权限处理
- Android6.0 权限处理
- targetSdkVersion 23以下添加Android6.0权限
- Android6.0系统权限
- Android6.0权限系统
- Android6.0系统权限
- Android6.0中对权限的处理
- android6.0版本的权限申请处理
- android6.0以及以上的权限处理
- Android6.0运行时权限的处理
- 模仿微信界面tabhost底部导航——使用继承ActivityGroup方式
- JVM 结构小结
- javax.net.ssl.SSLPeerUnverifiedException: No peer certificate
- Hibernate学习笔记2--持久化对象的状态
- ORACLE SQL性能优化
- Android6.0系统以下的麦克风权限处理
- android使用implements ActionBar.TabListener的方式创建导航
- .Net CLR 内存模型小结
- Android程序运行报错"Process xxxx has died"原因查找
- Oracle SQL语句之操作符优化--优化技术分析
- ASP.NET Identity 使用简介
- android之带右侧字母(拼音)索引的列表
- 关于unity3d破解问题
- Android消息传递之Handler消息机制