Android如何判断手机是否有录音权限的工具类

作用

判断手机是否有录音权限的工具类,兼容6.0以上以及以下android系统

测试环境

这篇文章是评论中的网友提出质疑后,经过重写修改与重写测试后编写的,我的调试环境是小米note3,Android7.1的系统。

记得在清单文件中配置对应的权限。

思路

检测是否有权限

-->有权限--执行相关操作

-->无权限-- 判断系统版本

--大于等于6.0 --动态申请权限

-->对申请结果的回调处理
--允许
--拒绝

代码

工具类CheckAudioPermission.java

package com.example.a002034.testaudioperrmission;

import android.content.Context;
import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder;

/**
 * Function:判断录音权限,兼容android6.0以下以及以上系统
 *
 * @author xuzhuyun
 * @date 2018/5/10
 */

public class CheckAudioPermission {
  /**
   * 音频获取源
   */
  public static int audioSource = MediaRecorder.AudioSource.MIC;
  /**
   * 设置音频采样率,44100是目前的标准,但是某些设备仍然支持22050,16000,11025
   */
  public static int sampleRateInHz = 44100;

  /**
   * 设置音频的录制的声道CHANNEL_IN_STEREO为双声道,CHANNEL_CONFIGURATION_MONO为单声道
   */
  public static int channelConfig = AudioFormat.CHANNEL_IN_STEREO;
  /**
   * 音频数据格式:PCM 16位每个样本。保证设备支持。PCM 8位每个样本。不一定能得到设备支持。
   */
  public static int audioFormat = AudioFormat.ENCODING_PCM_16BIT;
  /**
   * 缓冲区字节大小
   */
  public static int bufferSizeInBytes = 0;

  public static AudioRecord audioRecord;

  /**
   * 判断是是否有录音权限.
   */
  public static boolean isHasPermission(final Context context) {
    bufferSizeInBytes = 0;
    bufferSizeInBytes = AudioRecord.getMinBufferSize(sampleRateInHz,
        channelConfig, audioFormat);
    if (audioRecord == null) {
      audioRecord = new AudioRecord(audioSource, sampleRateInHz, channelConfig, audioFormat, bufferSizeInBytes);

    }
    //开始录制音频
    try {
      // 防止某些手机崩溃,例如联想
      audioRecord.startRecording();
    } catch (IllegalStateException e) {
      e.printStackTrace();
    }

    /**
     * 根据开始录音判断是否有录音权限s
     */
    if (audioRecord.getRecordingState() != AudioRecord.RECORDSTATE_RECORDING) {
      return false;
    }
    audioRecord.stop();
    //释放资源
    audioRecord.release();
    audioRecord = null;

    return true;
  }

}

测试类MainActivity

package com.example.a002034.testaudioperrmission;

import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Build;
import android.support.annotation.NonNull;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

/**
 * desc:测试录音权限.
 * steps:
 * 检测是否有权限--有--执行相关操作
 * --无权限--
 * <p>
 * --判断系统版本
 * --小于6.0 直接获取
 * --大于6.0 动态申请权限
 * --对申请结果的处理回调
 * <p>
 * --允许
 * <p>
 * --拒绝
 * <p>
 * test:
 * test1 build.gradle minsdk <23  真机android7.1 清单文件中配置了录音权限
 * test2 build.gradle minsdk >=23  真机android7.1 清单文件中配置了录音权限
 *
 * @author xuzhuyun
 * @date 2018/5/10
 */
public class MainActivity extends AppCompatActivity {
  private static final String TAG = "MainActivity";

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    //检测是否有录音权限
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO)
        != PackageManager.PERMISSION_GRANTED) {
      Log.i(TAG, "默认无录音权限");
      if (Build.VERSION.SDK_INT >= 23) {
        Log.i(TAG, "系统版本不低于android6.0 ,需要动态申请权限");
        requestPermissions(new String[]{Manifest.permission.RECORD_AUDIO}, 1001);
      }
    } else {
      Log.i(TAG, "默认有录音权限");
    }
  }

  @Override
  public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
                      @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == 1001) {
      //方式一校验
      boolean isHasAudioPermission = CheckAudioPermission.isHasPermission(this);
      Log.i(TAG, "申请权限完毕,当前录音权限:" + isHasAudioPermission);
      //方式二校验
      int result = 0;
      for (int i = 0; i < grantResults.length; i++) {
        if (grantResults[i] == PackageManager.PERMISSION_GRANTED) {
          result++;
        }
      }
      if (result != permissions.length) {
        //没有权限
        Log.i(TAG, "onRequestPermissionsResult: 申请权限完毕,当前录音权限:false");
        return;
      }
      //有权限
      Log.i(TAG, "onRequestPermissionsResult: 申请后,是否有权限:true");
    }
  }

}

源码下载:Android如何判断手机是否有录音

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 浅析Android位置权限以及数组寻找索引的坑

    一.Android 危险权限,来自官方文档的坑 Android开发者都知道,Android 6.0 之前,权限申请只需要在 AndroidManifest.xml 文件中声明就可以.Android 6.0 开始,权限申请发生了变化,危险权限需要在应用中动态申请,之前写过一篇 Android 动态申请危险权限的笔记,详情参考: Android 6.0 动态申请危险权限. 先截个图,看看Android官方的说明: 再看危险权限的分组情况: 意思是,对危险权限进行了分组,同一组中,只要有有一个权限被授

  • Android权限HaloPermission详细使用

    1. 常规使用 请求一个权限,然后接收结果回调 HoloPermission.with(this,Manifest.permission.WRITE_EXTERNAL_STORAGE) .setListener(object: PermissionListener{ override fun onPermissionDenied(permissions: List<String>) { {your code for deny} } override fun onPermissionGrand(

  • Android基于注解的6.0权限动态请求框架详解

    前言 安卓6.0之后,一些敏感权限需要进行动态请求,虽说编写请求授权代码并不难,但是每次一需要权限就需要在视图中添加一段代码,严重影响代码美观,同时也增加了一点点工作量. 于是,小盆友闲暇之余基于AOP封装了一个基于注解的权限请求框架.如果有幸加入您的项目,使用过程中有问题或是有哪些不便,请留言区或github上与我交流,共同进步.如果喜欢这个框架请给个star和❤️. github地址:https://github.com/zincPower/JPermission 先上图,看看效果...第一

  • Android编程实现应用获取包名、版本号、权限等信息的方法

    本文实例讲述了Android编程实现应用获取包名.版本号.权限等信息的方法.分享给大家供大家参考,具体如下: /** * 获取当前应用程序的包名 * @param context 上下文对象 * @return 返回包名 */ public static String getAppProcessName(Context context) { //当前应用pid int pid = android.os.Process.myPid(); //任务管理类 ActivityManager manage

  • 详解Android运行时权限及APP适配方法

    Android 6.0起,Android加强了权限管理,引入运行时权限概念.对于: 1. Android 5.1(API 22)及以前版本,应用权限必须声明在AndroidManifest.xml中,应用在安装时,Android会列出其所需的所有权限供用户确认安装. 2. Android 6.0(API 23)及以后版本,应用权限必须声明在AndroidManifest.xml中,但权限分为普通权限(Normal Permissions)和危险权限(Dangerous Permissions),

  • Android MIUI通知类短信权限的坑

    MIUI的坑爹设计还真不少.比如说,MIUI手机不插SIM卡就不能USB调试安装应用,好,插,结果又让你先登录小米账号(无话可说).MIUI权限申请也是坑! 就拿READ_SMS这个权限来说,按照安卓规范来动态申请,它不弹窗让用户允许,然后回调却是成功的,到设置里一看,该权限还是询问状态.这什么逻辑啊! 然后想实现自动填短信验证码,不好意识,我MIUI自定义了一个通知类短信权限(Service_SMS),你不知道怎么申请,也不知道怎么在manifest注册.所以你没有权,也限监听不到的.我也不知

  • 详解Android自定义权限使用总结

    1.如何声明自定义权限 在Manifest文件中使用Permission标签定义自己的权限: <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.bright.permission"> <permission

  • Android 采用AOP方式封装6.0权限管理的方法

    [一]背景 6.0运行时申请权限已经是一个老生常谈的内容了,最近项目TargetSDKVersion升到23以上,所以我们也需要做权限管理,我想到的需求是这样的: 1.支持单个权限.多个权限申请 2.运行时申请 3.无侵入式申请,无需关注权限申请的逻辑 4.除了Activity.Fragment之外,还需要支持Service中申请 5.对国产手机做兼容处理 第一.二点,Google都有对应的API: 第三点可以通过自定义注解+AOP切面方式来解决.为什么采用AOP方式呢?首先看AOP定义: 面向

  • 详解Android 全局弹出对话框SYSTEM_ALERT_WINDOW权限

    项目中为了实现账号多设备登录的监听 一个账号在别的设备登录时在该设备上需要弹出对话框提示 故而用到全局对话框 方案一. 1.在开发中有时会用到全局弹出对话框但必须在manifest中申请权限: <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> 2.创建Dialog AlertDialog.Builder builder=new AlertDialog.Builder(this)

  • 安卓Android6.0权限动态获取操作示例

    本文实例讲述了安卓Android6.0权限动态获取操作.分享给大家供大家参考,具体如下: 众所周知 , 安卓6.0现在运用的越来越广泛 , 因为相对于之前的几个版本 , 对于用户权限这个概念确实不是很重视 , 而6.0 之后 , 为了提升用户的操作安全性 ,  运行时权限诞生了, 就是在用户运行软件的时候动态获取所需要的权限 , 下面跟大家分享一个我的代码案例 : import android.Manifest; import android.app.AlertDialog; import an

随机推荐