怎么知道我的应用程序的AudioRecord权限不允许或不 [英] how to know my app's AudioRecord permission is disallowed or not

查看:1119
本文介绍了怎么知道我的应用程序的AudioRecord权限不允许或不的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的应用程序的记录音频许可被user.The问题不允许一些Android操作系统的设备`audio_recorder.getRecordingState()`总是返回`AudioRecord.RECORDSTATE_RECORDING`.It不是一个正确的结果。

我怎么能知道记录音频许可可用?

 公共final类MtAudioRecord {私有静态最后弦乐TAG =audioRecord;
私有静态MtAudioRecord例如= NULL;
公共静态INT SAMPLE_RATE = 44100; //默认44100
公共静态最终诠释CHANNEL_CONFIG = AudioFormat.CHANNEL_IN_MONO;
公共静态最终诠释AUDIO_FORMAT = AudioFormat.ENCODING_PCM_16BIT;
公共静态最终诠释AUDIO_SOURCE = MediaRecorder.AudioSource.MIC;私人AudioRecord mAudioRecord;
私人最终诠释minBufferSize;
私人布尔isRecording = TRUE;
私有静态短[] audioData = NULL;公共静态最终MtAudioRecord的getInstance(){
    如果(空==实例){
        例如=新MtAudioRecord();
    }
    返回实例;
}公共MtAudioRecord(){
    minBufferSize = AudioRecord.getMinBufferSize(SAMPLE_RATE,CHANNEL_CONFIG,AUDIO_FORMAT);
    如果(minBufferSize == AudioRecord.ERROR_BAD_VALUE){
    }否则如果(minBufferSize == AudioRecord.ERROR){
    }其他{
        mAudioRecord =
            新AudioRecord(AudioSource.MIC,SAMPLE_RATE,AudioFormat.CHANNEL_IN_MONO,
                AudioFormat.ENCODING_PCM_16BIT,minBufferSize);
    }
    audioData =新的短[minBufferSize]
}公共同步启动无效(){    新主题(新的Runnable接口(){        @覆盖
        公共无效的run(){
            如果(NULL!= mAudioRecord){
                如果(mAudioRecord.getRecordingState()!= AudioRecord.STATE_INITIALIZED){
                    Log.e(TAG,麦克风未初始化成功);
                    返回;
                }
                mAudioRecord.startRecording();
                Log.e(TAG,录音状态=+ mAudioRecord.getRecordingState());
                如果(mAudioRecord.getRecordingState()!= AudioRecord.RECORDSTATE_RECORDING){
                    Log.e(TAG,麦克风是在使用中,不能被访问);
                    返回;
                }
                isRecording = TRUE;
                而(isRecording&安培;&放大器;空= mAudioRecord!){
                    如果(空== audioData){
                        audioData =新的短[minBufferSize]
                    }
                    最终诠释read_distance = mAudioRecord.read(audioData,0,minBufferSize);
                    如果(read_distance == || AudioRecord.ERROR_INVALID_OPERATION == read_distance || AudioRecord.ERROR == read_distance AudioRecord.ERROR_BAD_VALUE){
                        isRecording = FALSE;
                        打破;
                    }
                }
                如果(mAudioRecord!= NULL){
                    mAudioRecord.stop();
                    mAudioRecord.release();
                    mAudioRecord = NULL;
                }
            }
        }
    })。开始();
}公共同步无效停止(){
    isRecording = FALSE;
}

}

 <使用许可权的android:NAME =android.permission.RECORD_AUDIO/>


解决方案

我认为你应该使用 AudioManager 来代替。这可以帮助你检查是否麦克风被用户静音。你可能搜索的方法是 isMicrophoneMute()返回boolean值。

下面是链接在Android开发者网站上的AudioManager。 Android的音频管理器

和功能说明是

和你敬酒不正确,它应该是:

  Toast.makeText(ApplicationContext对象()的麦克风
                                   已禁用,Toast.LENGTH_SHORT).show();

更新:
   您可以使用 Context.checkCallingOrSelfPermission(字符串许可);

许可是描述你所需要的权限字符串: android.permission.RECORD_AUDIO

它应该返回其PERMISSION_GRANTED或整数结果PERMISSION_DENIED

在这里看到Android开发者网站上的介绍:<一href=\"http://developer.android.com/reference/android/content/Context.html#checkCallingOrSelfPermission(java.lang.String)\"相对=nofollow>许可检查

例如:

 公共布尔checkRecordingPermission()
{
    字符串权限=android.permission.RECORD_AUDIO;
    INT结果=的getContext()checkCallingOrSelfPermission(许可)。
    返回(结果== PackageManager.PERMISSION_GRANTED);
}

My app's record audio permission was disallowed by user.The problem is some android os devices `audio_recorder.getRecordingState()` always returns `AudioRecord.RECORDSTATE_RECORDING`.It's not a right result.

How can I know the record audio permission is available ?

public final class MtAudioRecord {

private static final String TAG = "audioRecord";
private static MtAudioRecord instance = null;
public static int SAMPLE_RATE = 44100;// default 44100
public static final int CHANNEL_CONFIG = AudioFormat.CHANNEL_IN_MONO;
public static final int AUDIO_FORMAT = AudioFormat.ENCODING_PCM_16BIT;
public static final int AUDIO_SOURCE = MediaRecorder.AudioSource.MIC;

private AudioRecord mAudioRecord;
private final int minBufferSize;
private boolean isRecording = true;
private static short[] audioData = null;

public static final MtAudioRecord getInstance() {
    if (null == instance) {
        instance = new MtAudioRecord();
    }
    return instance;
}

public MtAudioRecord() {
    minBufferSize = AudioRecord.getMinBufferSize(SAMPLE_RATE, CHANNEL_CONFIG, AUDIO_FORMAT);
    if (minBufferSize == AudioRecord.ERROR_BAD_VALUE) {
    } else if (minBufferSize == AudioRecord.ERROR) {
    } else {
        mAudioRecord =
            new AudioRecord(AudioSource.MIC, SAMPLE_RATE, AudioFormat.CHANNEL_IN_MONO,
                AudioFormat.ENCODING_PCM_16BIT, minBufferSize);
    }
    audioData = new short[minBufferSize];
}

public synchronized void start() {

    new Thread(new Runnable() {

        @Override
        public void run() {
            if(null != mAudioRecord){
                if (mAudioRecord.getRecordingState() != AudioRecord.STATE_INITIALIZED) {
                    Log.e(TAG, "Mic didn't successfully initialized");
                    return;
                }
                mAudioRecord.startRecording();
                Log.e(TAG, "recording state = " + mAudioRecord.getRecordingState());
                if (mAudioRecord.getRecordingState() != AudioRecord.RECORDSTATE_RECORDING) {
                    Log.e(TAG, "Mic is in use and can't be accessed");
                    return;
                }
                isRecording = true;
                while (isRecording && null != mAudioRecord) {
                    if (null == audioData) {
                        audioData = new short[minBufferSize];
                    }
                    final int read_distance = mAudioRecord.read(audioData, 0, minBufferSize);
                    if (read_distance == AudioRecord.ERROR_INVALID_OPERATION || read_distance == AudioRecord.ERROR || read_distance == AudioRecord.ERROR_BAD_VALUE) {
                        isRecording = false;
                        break;
                    }
                }
                if (mAudioRecord != null) {
                    mAudioRecord.stop();
                    mAudioRecord.release();
                    mAudioRecord = null;
                }
            }
        }
    }).start();
}

public synchronized void stop() {
    isRecording = false;
}

}

<uses-permission android:name="android.permission.RECORD_AUDIO"/>

解决方案

I think you should use the AudioManager instead. This helps you to check if the microphone was muted by the user. The method you're probably search is isMicrophoneMute() which returns boolean.

Here is the link for the AudioManager in android developer site. Android Audio Manager

and the function description is here

and your toast is incorrect, it should be :

Toast.makeText(applicationContext(),"The microphone is 
                                   disabled",Toast.LENGTH_SHORT).show();

Update: you can use Context.checkCallingOrSelfPermission(String permission);

permission is the string that describes the permission you need: android.permission.RECORD_AUDIO

it should return integer result which is PERMISSION_GRANTED or PERMISSION_DENIED

look here for the description in android developers site : check permission

for example :

public boolean checkRecordingPermission()
{
    String permission = "android.permission.RECORD_AUDIO";
    int result  = getContext().checkCallingOrSelfPermission(permission);
    return (result == PackageManager.PERMISSION_GRANTED);
}

这篇关于怎么知道我的应用程序的AudioRecord权限不允许或不的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆