Android Wear录音机停止工作了吗?

Android Wear录音机停止工作了吗?,android,wear-os,android-audiorecord,Android,Wear Os,Android Audiorecord,我有一个AudioRecorder类,它使用AudioRecord来录制音频并将其存储在字节数组中。它一直运行良好,直到最近我的录音无法初始化,我看不出哪里出了问题 我的录音班: public class SoundRecorder { private static final int RECORDER_SAMPLERATE = 8000; private static final int RECORDER_CHANNELS = AudioFormat.CHANNEL_IN_M

我有一个AudioRecorder类,它使用AudioRecord来录制音频并将其存储在字节数组中。它一直运行良好,直到最近我的录音无法初始化,我看不出哪里出了问题

我的录音班:

public class SoundRecorder {

    private static final int RECORDER_SAMPLERATE = 8000;
    private static final int RECORDER_CHANNELS = AudioFormat.CHANNEL_IN_MONO;
    private static final int RECORDER_AUDIO_ENCODING = AudioFormat.ENCODING_PCM_16BIT;
    private AudioRecord recorder = null;
    private Thread recordingThread = null;
    private boolean isRecording = false;
    private int bufferSize = 0;
    private ByteArrayOutputStream bOutputStream;

    int BufferElements2Rec = 1024; // want to play 2048 (2K) since 2 bytes we use only 1024
    int BytesPerElement = 2; // 2 bytes in 16bit format

    SoundRecorder(){
        bufferSize = AudioRecord.getMinBufferSize(RECORDER_SAMPLERATE,
                RECORDER_CHANNELS, RECORDER_AUDIO_ENCODING);
        bOutputStream = null;
    }

    public void startRecording() {

        recorder = new AudioRecord(MediaRecorder.AudioSource.MIC,
                RECORDER_SAMPLERATE, RECORDER_CHANNELS,
                RECORDER_AUDIO_ENCODING, BufferElements2Rec * BytesPerElement);


        if(recorder.getState() == AudioRecord.STATE_INITIALIZED){
            recorder.startRecording();
            isRecording = true;
            recordingThread = new Thread(new Runnable() {
                public void run() {
                    storeAudioData();
                }
            }, "AudioRecorder Thread");
            recordingThread.start();
        }else{
            // Audio recorder failed to initialise
        }

    }

    public byte[] stopRecording() {
        // stops the recording activity
        if (recorder != null) {
            isRecording = false;
            recorder.stop();
            recorder.release();
            recorder = null;
            recordingThread = null;
            byte[] audioBytes = bOutputStream.toByteArray();

            try {
                bOutputStream.reset();
                bOutputStream.close();
                Log.d("RECORDER", "bOutputstream closed");
            } catch (IOException e) {
                Log.d("RECORDER", "Output stream could not be closed or reset");
                e.printStackTrace();
            }
            if(audioBytes != null){
                return audioBytes;
            }else{
                return null;
            }
        } else {
            return null;
        }
    }

    private void storeAudioData() {
        // Store the audio in bytes

        short sData[] = new short[BufferElements2Rec];

        bOutputStream = new ByteArrayOutputStream();

        while (isRecording) {
            // Get the voice output from microphone and store in byte format in byte output stream
            recorder.read(sData, 0, BufferElements2Rec);
            try {
                // Converts short data to byte array
                // Stores in byte array output stream
                byte bData[] = short2byte(sData);
                bOutputStream.write(bData);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    //convert short to byte
    private byte[] short2byte(short[] sData) {
        int shortArrsize = sData.length;
        byte[] bytes = new byte[shortArrsize * 2];
        for (int i = 0; i < shortArrsize; i++) {
            bytes[i * 2] = (byte) (sData[i] & 0x00FF);
            bytes[(i * 2) + 1] = (byte) (sData[i] >> 8);
            sData[i] = 0;
        }
        return bytes;
    }

    public boolean isRecording(){
        return isRecording;
    }
}
公共类录音机{
专用静态最终积分记录仪\u采样器=8000;
专用静态最终整数记录器\u通道=单声道中的AudioFormat.CHANNEL\u;
专用静态最终整数记录器\u音频\u编码=AudioFormat.ENCODING\u PCM\u 16位;
专用录音机=空;
私有线程recordingThread=null;
私有布尔值isRecording=false;
私有int bufferSize=0;
私有ByteArrayOutputStream bOutputStream;
int BufferElements2Rec=1024;//要播放2048(2K),因为我们只使用1024个字节
int bytesperement=2;//16位格式的2个字节
录音机(){
bufferSize=AudioRecord.getMinBufferSize(记录器\u采样器,
录像机信道、录像机音频编码);
bOutputStream=null;
}
公共无效开始记录(){
录音机=新的录音机(MediaRecorder.AudioSource.MIC,
记录仪采样器、记录仪通道、,
记录器\音频\编码,缓冲元素2REC*BytesPerElement);
if(recorder.getState()==AudioRecord.STATE\u已初始化){
记录器。开始记录();
isRecording=true;
recordingThread=新线程(new Runnable()){
公开募捐{
storeAudioData();
}
}“录音机线程”);
recordingThread.start();
}否则{
//录音机初始化失败
}
}
公共字节[]停止录制(){
//停止录制活动
if(记录器!=null){
isRecording=false;
录音机。停止();
记录器。释放();
记录器=空;
recordingThread=null;
byte[]audioBytes=bOutputStream.toByteArray();
试一试{
bootputstream.reset();
bOutputStream.close();
Log.d(“记录器”,“bOutputstream关闭”);
}捕获(IOE异常){
Log.d(“记录器”,“无法关闭或重置输出流”);
e、 printStackTrace();
}
如果(音频字节数!=null){
返回音频字节;
}否则{
返回null;
}
}否则{
返回null;
}
}
私有void存储音频数据(){
//以字节为单位存储音频
短sData[]=新短[BufferElements2Rec];
bOutputStream=newbytearrayoutputstream();
while(isRecording){
//从麦克风获取语音输出,并以字节格式存储在字节输出流中
记录器读取(sData,0,缓冲元件2REC);
试一试{
//将短数据转换为字节数组
//存储在字节数组输出流中
字节bData[]=short2byte(sData);
bOutputStream.write(bData);
}捕获(IOE异常){
e、 printStackTrace();
}
}
}
//将短字符转换为字节
专用字节[]短2字节(短[]sData){
int shortArrsize=sData.length;
字节[]字节=新字节[shortArrsize*2];
对于(int i=0;i>8);
sData[i]=0;
}
返回字节;
}
公共布尔值isRecording(){
返回记录;
}
}

有人能帮我解决这个问题吗?谢谢。

我拔完头发后终于解决了这个问题。在Android wear(moto360)上,设置屏幕中有一个名为“权限”的菜单项。在这里,我将应用程序的权限设置为“麦克风>已启用”。我不知道这个功能是什么时候添加的,但它解决了我的问题