录音权限怎么打开限

平板/笔记本
HiLink生态产品
终端云服务专区
&渐入佳境&
来自:浏览器
更新到4.0_Android6.0_6.6.1
版本(极客版)后微信和QQ不能发送语音,删除重装后还是一样。任何关联录音都不可用
width:100%">
&花粉特种部队&
来自:浏览器
你好,删除重装之后,你可以进入手机管家--权限管理,看看是否允许使用录音权限了
盖章仅为特种队员间跟进识别,不代表结贴,如果有需要,请在我的跟帖点击“回复”我,这样论坛才会提醒我,谢谢!
特种部队并不是华为的工作人员,我们是一群玩机爱好者,来自花粉,服务花粉!
width:100%">
&渐入佳境&
来自:浏览器
距离让我执着 发表于
你好,删除重装之后,你可以进入手机管家--权限管理,看看是否允许使用录音权限了 ...
全部允许还是一样
width:100%">
&花粉特种部队&
来自:浏览器
全部允许还是一样
如果是这样的话,请把你的手机系统版本号和手机联系方式私信我,我反馈看看
盖章仅为特种队员间跟进识别,不代表结贴,如果有需要,请在我的跟帖点击“回复”我,这样论坛才会提醒我,谢谢!
特种部队并不是华为的工作人员,我们是一群玩机爱好者,来自花粉,服务花粉!
width:100%">
&渐入佳境&
来自:浏览器
距离让我执着 发表于
如果是这样的话,请把你的手机系统版本号和手机联系方式私信我,我反馈看看 ...
明天双清再看看,郁闷
%2Fstorage%2Femulated%2F0%2FPictures%2FScreenshots%2FScreenshot_-23-29-17.png (34.84 KB, 下载次数: 0)
23:32 上传
width:100%">
花粉特种部队荣耀勋章
西湖——长桥老铁轨上来一组人像Memory的Melody不负好春光拍拍拍~7X全屏摄春福建南靖珠坑社黄花风铃木
花粉客户端
Make it Possible
Make your device special
华为云服务
Huawei cloud services
音乐播放器
Huawei Music
Huawei Vmall
关注花粉俱乐部
举报邮箱:
|关注花粉俱乐部:
Copyright (C)
华为软件技术有限公司 版权所有 保留一切权利判断Android手机是否有录音权限
判断手机是否有录音权限的工具类,兼容6.0以上以及以下android
package com.qhcloud.home.
import android.content.C
import android.media.AudioF
import android.media.AudioR
import android.media.MediaR
* Function:判断录音权限,兼容android6.0以下以及以上系统
* Created by xuzhuyun on .
public class CheckAudioPermission {
// 音频获取源
public static int audioSource = MediaRecorder.AudioSource.MIC;
// 设置音频采样率,44100是目前的标准,但是某些设备仍然支持2,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 boolean isHasPermission(final Context context){
bufferSizeInBytes = 0;
bufferSizeInBytes = AudioRecord.getMinBufferSize(sampleRateInHz,
channelConfig, audioFormat);
AudioRecord audioRecord =
new AudioRecord(audioSource, sampleRateInHz,
channelConfig, audioFormat, bufferSizeInBytes);
//开始录制音频
// 防止某些手机崩溃,例如联想
audioRecord.startRecording();
}catch (IllegalStateException e){
e.printStackTrace();
* 根据开始录音判断是否有录音权限
if (audioRecord.getRecordingState() != AudioRecord.RECORDSTATE_RECORDING) {
audioRecord.stop();
audioRecord.release();
audioRecord =(一)、Android录音权限被禁解决方案
大家在做Android录音的时候会碰到权限被禁止的情况出现,当用户禁止了录音权限的时候我们为了界面友好会提示用户,但是安卓机型很多,有些机型在录音start的时候如果被禁会报异常,当然这种情况很好解决,但是有些机型会正常执行,在此我们分析一下我所遇到的情况。
被禁情况分析
1,第一种,就是start的时候会报异常,这种我们把它包在try catch中即可捕获到异常。在此不多累述。&2,第二种,就是不报异常,正常执行,这种情况我们没办法去判断系统是否禁止了我们的app的录音权限。
所以我在此分析的是部分机型在被禁止后不报异常,我们可以去检测音频振幅大小,部分机型的音频振幅值在用MediaRecorder时是0,在用AudioRecord时值小于0,所以这种情况我们可以通过其振幅值判断:
(1)AudioRecord判断方法:
int readSize = 0;
/*--实时录音写数据--*/
readSize = audioRecord.read(buffer,0,minBufferSize);
if (readSize & 0) {
//录音出现异常
该方法能检测到大部分机型录音被禁止,或其他异常状况。&
  检测录音程序是否被禁用了,可以使用下面的代码判断int read = audioRecord.read(data, 0, recBufSize);if(AudioRecord.ERROR_INVALID_OPERATION != read){& && &// 做正常的录音处理} else {& &&&//录音可能被禁用了,做出适当的提示}
(2)MediaRecorder判断方法:&
MediaRecorder就不怎么好检测了,因为MediaRecorder在用方法getMaxAmplitude()时取得振幅值是0-32767,也就是即使不禁止录音权限,振幅值依然会有0值出现,所以不能简单地判断振幅值是否为0,我在此的检测方法是根据前1s的录音,取10次振幅值进行判断:&
先声明三个变量:
    private int vocAuthority[] = new int[10];
& &&private int vocNum = 0;
private boolean check =
然后写个方法:
int vocLevel = mRecorder.getMaxAmplitude();
if (check) {
if (vocNum &= 10) {
Set&Integer& set = new HashSet&Integer&();
for (int i = 0; i & vocN i++) {
set.add(vocAuthority[i]);
if (set.size() == 1) {
if (handler != null)
handler.sendEmptyMessage(MSG_ERROR_AUDIO_RECORD);
vocAuthority[vocNum] = vocL
该方法每100ms执行一次,1s十次后判断vocAuthority中的值是否全部一样,也就是说是否全部为零,如果全部一样那么录音肯定有问题。(我试了如果在非常安静的情况下前十次的取值也不是都为零,大家可以试试)&
3,第三种,还有部分机型不仅不报异常,而且在录音时会制造音频振幅的假数据,也就是虽然录音被禁止,系统依然会把音频振幅反馈给你,像华为p7就是这样,这种情况肯定不能再去检测音频振幅了,只能另辟蹊径,通过我的观察发现在用MediaRecorder录音时,如果被禁止那么本地不会出现录音文件,所以我们可以以此为突破口,检测本地是否有生成的录音文件来判断系统是否禁止了我们的录音权限。AudioRecord我没试,大家可以试试。
(二)、Android摄像头权限被禁解决方案
直接上代码吧!!!
package com.wytiger.mytest.
import java.lang.reflect.InvocationTargetEimport java.lang.reflect.M
import android.annotation.TargetAimport android.app.AppOpsMimport android.content.Cimport android.hardware.Cimport android.media.AudioFimport android.media.AudioRimport android.media.MediaRimport android.os.Bimport android.os.Bimport android.util.L
@SuppressWarnings("deprecation")public class PermissionUtil { public static final String TAG = "TAG_PERMISSION";
public static final int STATE_NO_PERMISSION = -1; public static final int STATE_RECORDING = 0; public static final int STATE_SUCCESS = 1;
* 判断是否有录音权限
*/ public static boolean hasRecordPermission() {
boolean hasPermission =
if (getRecordState() == STATE_SUCCESS) {
hasPermission =
hasPermission =
return hasP }
* 判断是否有录音权限
*/ // public static boolean hasRecordPermission2() { // boolean hasPermission = // // // // return hasP // }
* 获取录音状态
*/ public static int getRecordState() {
int minBuffer = AudioRecord.getMinBufferSize(44100, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT);
short[] point = new short[minBuffer];
int readSize = 0;
AudioRecord audioRecord =
audioRecord = new AudioRecord(MediaRecorder.AudioSource.DEFAULT, 44100, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT,
(minBuffer * 100));
// 开始录音
audioRecord.startRecording();// 检测是否可以进入初始化状态
} catch (Exception e) {
Log.e(TAG, "catch, 捕捉到异常, 无录音权限, e = " + e.getMessage());
if (audioRecord != null) {
audioRecord.release();
audioRecord =
Log.i(TAG, "catch, 返回对象非空,释放资源");
Log.i(TAG, "catch, 返回对象非空");
return STATE_NO_PERMISSION;
// 检测是否在录音中
if (audioRecord.getRecordingState() != AudioRecord.RECORDSTATE_RECORDING) {
// 6.0以下机型都会返回此状态,故使用时需要判断bulid版本
if (audioRecord != null) {
audioRecord.stop();
audioRecord.release();
audioRecord =
Log.e(TAG, "无法启动录音, 无法录音");
return STATE_RECORDING;
} else {// 正在录音
readSize = audioRecord.read(point, 0, point.length);
// 检测是否可以获取录音结果
if (readSize &= 0) {
if (audioRecord != null) {
audioRecord.stop();
audioRecord.release();
audioRecord =
Log.e(TAG, "没有获取到录音数据,无录音权限");
return STATE_NO_PERMISSION;
if (audioRecord != null) {
audioRecord.stop();
audioRecord.release();
audioRecord =
Log.i(TAG, "获取到录音数据, 有录音权限");
return STATE_SUCCESS;
* 是否有摄像头权限
*/ @SuppressWarnings("deprecation") public static boolean hasCameraPermission() {
// 无权限可能出现的情况(部分):
// 1, 直接抛异常
// 2, 不抛异常,返回对象为空
// 3, 获取到的数据为空
boolean canUse =
Camera mCamera =
mCamera = Camera.open();
mCamera.setParameters(mCamera.getParameters());
} catch (Exception e) {
Log.e(TAG, "catch, 捕捉到异常, 无摄像头权限");
// 1, 直接抛异常
if (mCamera != null) {// 返回对象非空(魅族)
mCamera.release();
Log.i(TAG, "catch, 对象非空,释放资源");
} else if (mCamera == null) {// 2, 返回对象为空
Log.e(TAG, "catch, 对象为空");
} finally {
if (mCamera != null) {
mCamera.release();
Log.i(TAG, "finally, 对象非空,释放资源");
} else if (mCamera == null) {// 2, 返回对象为空
Log.e(TAG, "finally, 对象为空");
Log.i(TAG, "返回");
return canU }
// op flag public static final int opCameraFlag = 26; public static final int opRecordAudioFlag = 27;
@TargetApi(Build.VERSION_CODES.KITKAT) /**
* 是否有指定权限,在api19以上有效
* @param mContext:上下文
* @param opFlag: 指定操作码,see AppOpsManager define
*/ public boolean hasPermission(Context mContext, int opFlag) {
boolean hasPermission =
if (Build.VERSION.SDK_INT &= 19) {
if (checkOp(mContext, opFlag) == 0) {
hasPermission =
} else if (checkOp(mContext, opFlag) == 1) {
hasPermission =
hasPermission =
Log.e(TAG, "内部出错");
return hasP
Log.e(TAG, "API below 19 cannot invoke!");
@TargetApi(Build.VERSION_CODES.KITKAT) @SuppressWarnings({ "unchecked", "rawtypes" }) /**
* Api19以上有效
* 返回 0 代表有权限,1代表没有权限,-1函数出错啦
* @param context
* @param op
private static int checkOp(Context context, int op) {
if (Build.VERSION.SDK_INT &= 19) {
AppOpsManager manager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
Class clazz = AppOpsManager.
Class[] cArg = new Class[3];
cArg[0] = int.
cArg[1] = int.
cArg[2] = String.
Method checkOpMethod = clazz.getDeclaredMethod("checkOp", cArg);
return (Integer) checkOpMethod.invoke(manager, op, Binder.getCallingUid(), context.getPackageName());
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
return -1; }
阅读(...) 评论()1971人阅读
安卓开发(2)
这段时间做一个项目有即时聊天功能,里面有遇到录音权限的问题,百度了个遍判断权限问题,没有好的解决方案,然而自己代码变通了一下,发现问题其实也还好,先附上录音工具package .
import android.app.D
import android.content.C
import android.os.E
import android.os.H
import android.os.M
import android.util.AttributeS
import android.util.L
import android.view.LayoutI
import android.view.MotionE
import android.view.V
import android.widget.B
import android.widget.ImageV
import android.widget.TextV
import com.app.application.AppC
import com.app.tool.FT
import com.nbappdev.aikaopu_personal.R;
import com.nbappdev.aikaopu_personal.utils.AudioM
* 自定语音按钮
public class AudioRecordButton extends Button implements AudioManager.AudioStageListener{
private Dialog mD
//语音对话框
private ImageView mI
private ImageView mV
private TextView mL
private Context mC
private AudioManager mAudioM
private boolean mReady=
//开始录制
private boolean isRecording =
//是否开始录音
private boolean recordPermissions =
//录音权限
private float mTime = 0;
private static final int MSG_AUDIO_PREPARED = 0X110;
private static final int MSG_VOICE_CHANGE = 0X111;
private static final int MSG_DIALOG_DIMISS = 0X112;
private static final int MSG_VOICE_TIME_OUT = 0X113;
private AudioRecordButtonHandler mHandler = new AudioRecordButtonHandler();
private static final int STATE_NORMAL = 1;
private static final int STATE_RECORDING = 2;
private static final int STATE_WANT_TO_CANCEL = 3;
private int mCurrentState = STATE_NORMAL;
private static final int DISTANCE_Y_CANCEL = 50;
private boolean time_out =
//录制超时
private OnFinishedRecordListener onFinishedRecordL
public void setOnFinishedRecordListener(OnFinishedRecordListener onFinishedRecordListener) {
this.onFinishedRecordListener = onFinishedRecordL
public AudioRecordButton(Context context) {
super(context);
this.mContext =
public AudioRecordButton(final Context context, AttributeSet attrs) {
super(context, attrs);
this.mContext =
if( Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
//判断SD卡是否存在
mAudioManager = AudioManager.getInstance(AppConfig.DIR_AUDIO);
mAudioManager.setOnAudioStageListener(this);
recordPermissions =
FToast.show(mContext,"未发现sd卡,无法使用录音功能");
private class AudioRecordButtonHandler extends Handler{
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_AUDIO_PREPARED:
mTime = 0;
showRecordingDialog();
isRecording =
new Thread(mGetVoiceLevelRunnable).start();
handler = new Handler();
runnable = new Runnable() {
public void run() {
mHandler.sendEmptyMessage(MSG_VOICE_TIME_OUT);
handler.postDelayed(runnable, 61000);
case MSG_VOICE_CHANGE:
updateVoiceLevel(mAudioManager.getVoiceLevel(7));
case MSG_DIALOG_DIMISS:
mAudioManager.cancel();
dimissDialog();
case MSG_VOICE_TIME_OUT:
time_out =
dimissDialog();
mAudioManager.release();
if (onFinishedRecordListener!=null && mReady) {
if (mTime&60){
mTime = 60;
onFinishedRecordListener.onFinishedRecord(mAudioManager.getCurrentFilePath(),(int)mTime);
FToast.show(mContext, "录制时间不能超过60秒");
handler.removeCallbacks(runnable);
* 监听屏幕触摸事件
* @param event
public boolean onTouchEvent(MotionEvent event) {
int action = event.getAction();
int x = (int) event.getX();
int y = (int) event.getY();
switch (action) {
case MotionEvent.ACTION_DOWN:
changeDialogState(STATE_RECORDING);
case MotionEvent.ACTION_MOVE:
if (isRecording) {
if (wantToCancel(x, y)) {
changeDialogState(STATE_WANT_TO_CANCEL);
changeDialogState(STATE_RECORDING);
case MotionEvent.ACTION_UP:
if (time_out){
time_out =
return super.onTouchEvent(event);
if (!mReady) {
return super.onTouchEvent(event);
if (!isRecording || mTime & 0.6f) {
tooShort();
mAudioManager.cancel();
mHandler.sendEmptyMessageDelayed(MSG_DIALOG_DIMISS,0);
}else if (mCurrentState == STATE_RECORDING) {
dimissDialog();
mAudioManager.release();
if (onFinishedRecordListener!=null) {
if (mTime&60){
mTime =60;
onFinishedRecordListener.onFinishedRecord(mAudioManager.getCurrentFilePath(),(int)mTime);
}else if (mCurrentState == STATE_WANT_TO_CANCEL) {
mAudioManager.cancel();
dimissDialog();
return super.onTouchEvent(event);
* 改变对话框状态
* @param state
private void changeDialogState(int state) {
if (mCurrentState != state) {
mCurrentState =
switch (mCurrentState) {
case STATE_NORMAL:
setBackgroundResource(R.drawable.button_recordnormal);
setText("按住 说话");
case STATE_RECORDING:
setBackgroundResource(R.drawable.button_recording);
setText("松开 结束");
if (isRecording) {
recording();
case STATE_WANT_TO_CANCEL:
setBackgroundResource(R.drawable.button_recording);
setText("松开手指,取消发送");
wantToCancel();
private boolean wantToCancel(int x, int y) {
if (x & 0 || x & getWidth()) {
// 判断是否在左边,右边,上边,下边
if (y & -DISTANCE_Y_CANCEL || y & getHeight() + DISTANCE_Y_CANCEL) {
private void reset() {
isRecording =
changeDialogState(STATE_NORMAL);
mTime = 0;
* 开始录音
public void startRecord(){
if (recordPermissions){
mAudioManager.prepareAudio();
public boolean onPreDraw() {
//*****************************************Diaolog语音对话框********************************//
* 显示语音对话框
public void showRecordingDialog() {
mDialog = new Dialog(mContext, R.style.Theme_audioDialog);
LayoutInflater inflater = LayoutInflater.from(mContext);
View view = inflater.inflate(R.layout.voice_dialog, null);
mDialog.setContentView(view);
mIcon = (ImageView) mDialog.findViewById(R.id.dialog_icon);
mVoice = (ImageView) mDialog.findViewById(R.id.dialog_voice);
mLable = (TextView) mDialog.findViewById(R.id.recorder_dialogtext);
mDialog.show();
* 设置正在录音时的dialog界面
public void recording() {
if (mDialog != null && mDialog.isShowing()) {
mIcon.setVisibility(View.VISIBLE);
mVoice.setVisibility(View.VISIBLE);
mLable.setVisibility(View.VISIBLE);
mIcon.setImageResource(R.drawable.recorder);
mLable.setText("手指上滑,取消发送");
* 取消录制
public void wantToCancel() {
if (mDialog != null && mDialog.isShowing()) {
mIcon.setVisibility(View.VISIBLE);
mVoice.setVisibility(View.GONE);
mLable.setVisibility(View.VISIBLE);
mIcon.setImageResource(R.drawable.cancel);
mLable.setText("松开手指,取消发送");
* 录制时间过短
public void tooShort() {
if (mDialog != null && mDialog.isShowing()) {
mIcon.setVisibility(View.VISIBLE);
mVoice.setVisibility(View.GONE);
mLable.setVisibility(View.VISIBLE);
mIcon.setImageResource(R.drawable.voice_to_short);
mLable.setText("录音时间过短");
* 隐藏dialog
public void dimissDialog() {
if (mDialog != null && mDialog.isShowing()) {
mDialog.dismiss();
public void updateVoiceLevel(int level) {
if (mDialog != null && mDialog.isShowing()) {
int resId = mContext.getResources().getIdentifier("v" + level,
"drawable", mContext.getPackageName());
mVoice.setImageResource(resId);
* 开始录制
public void wellPrepared() {
Log.i("触发","准备完成");
mHandler.sendEmptyMessage(MSG_AUDIO_PREPARED);
* 异步获取音量
private Runnable mGetVoiceLevelRunnable = new Runnable() {
public void run() {
while (isRecording) {
Thread.sleep(100);
mTime += 0.1f;
mHandler.sendEmptyMessage(MSG_VOICE_CHANGE);
} catch (InterruptedException e) {
e.printStackTrace();
* 录制完成回调
public interface OnFinishedRecordListener {
void onFinishedRecord(String audioPath,int voice_length);
然后录音管理工具类&pre name="code" class="java"&package .
import android.media.AudioF
import android.media.AudioR
import android.media.MediaR
import android.util.L
import java.io.F
import java.io.IOE
* 语音录制管理类
public class AudioManager {
private MediaRecorder mR
private String mDirS
//文件夹路径
private String mCurrentFilePathS //当前的详细路径
private static AudioManager mI
public AudioStageListener mL
private boolean isP
// 音频获取源
public static int audioSource = MediaRecorder.AudioSource.MIC;
// 设置音频采样率,44100是目前的标准,但是某些设备仍然支持2,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 void setOnAudioStageListener(AudioStageListener listener) {
mListener =
private AudioManager(String dir) {
mDirString=
public static AudioManager getInstance(String dir) {
if (mInstance == null) {
synchronized (AudioManager.class) {
if (mInstance == null) {
mInstance = new AudioManager(dir);
* 准备开始录制
public void prepareAudio() {
isPrepared =
File dir = new File(mDirString);
if (!dir.exists()) {
dir.mkdirs();
String fileNameString = System.currentTimeMillis()+".m4a";
File file = new File(dir, fileNameString);
mCurrentFilePathString = file.getAbsolutePath();
mRecorder = new MediaRecorder();
// 设置输出文件
mRecorder.setOutputFile(file.getAbsolutePath());
// 设置meidaRecorder的音频源是麦克风
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
// 设置文件音频的输出格式为MPEG_4
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
// 设置音频的编码格式为AAC
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
mRecorder.prepare();
mRecorder.start();
isPrepared =
Log.i("调用","开始调用");
if (mListener != null) {
mListener.wellPrepared();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
* 获取声音的涨幅
* @param maxLevel
public int getVoiceLevel(int maxLevel) {
if (isPrepared) {
return maxLevel * mRecorder.getMaxAmplitude() / 32768 + 1;
} catch (Exception e) {
e.printStackTrace();
* 资源释放
public void release() {
if (mRecorder!=null){
mRecorder.stop();
mRecorder.release();
mRecorder =
}catch (Exception e){
e.printStackTrace();
public void cancel() {
release();
if (mCurrentFilePathString != null) {
File file = new File(mCurrentFilePathString);
file.delete();
mCurrentFilePathString =
*判断是否有录音权限
public static boolean isHasPermission(){
bufferSizeInBytes = 0;
bufferSizeInBytes = AudioRecord.getMinBufferSize(sampleRateInHz,
channelConfig, audioFormat);
AudioRecord audioRecord =
new AudioRecord(audioSource, sampleRateInHz,
channelConfig, audioFormat, bufferSizeInBytes);
audioRecord.startRecording();
}catch (IllegalStateException e){
e.printStackTrace();
Log.i("录音权限","录音权限"+audioRecord.getRecordingState());
if (audioRecord.getRecordingState() != AudioRecord.RECORDSTATE_RECORDING) {
audioRecord.stop();
audioRecord.release();
audioRecord =
* 获取当前语音的路径
public String getCurrentFilePath() {
return mCurrentFilePathS
public interface AudioStageListener {
void wellPrepared();
布局文件我就不贴了,开始调用录音之前&pre name="code" class="java"&if (AudioManager.isHasPermission()){
down_talk.startRecord();
//开始录音
}判断一下就行了,第一次弄录音功能,代码都是网上找的,然后自己稍微改一下,这个判断其实你只要静态注册了录音权限的话都会返回true的,&span style="font-family: Arial, Helvetica, sans-"&这里的作用只是真正录音之前先&/span&&span style="font-family:Arial, Helvetica, sans-"&让用户允许录音权限而已,然后执行开始录音,因为第一次肯定会弹起录音权限对话框,所以当你手指离开的时候会调用&/span&&span style="font-family: Arial, Helvetica, sans-"&onTouchEvent的&/span&&span style="font-family: Arial, Helvetica, sans-"&MotionEvent.ACTION_UP事件,这地方&/span&&span style="font-family: Arial, Helvetica, sans-"&我判断了很多因素,基本上只会执行走正确流程的录音方式&/span&&pre name="code" class="java"&
&pre name="code" class="java"&

我要回帖

更多关于 录音权限怎么打开 的文章

 

随机推荐