Android Wear录音机停止工作了吗?
我有一个AudioRecorder类,它使用AudioRecord来录制音频并将其存储在字节数组中。它一直运行良好,直到最近我的录音无法初始化,我看不出哪里出了问题 我的录音班: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
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)上,设置屏幕中有一个名为“权限”的菜单项。在这里,我将应用程序的权限设置为“麦克风>已启用”。我不知道这个功能是什么时候添加的,但它解决了我的问题