2016-03-17 2 views
0

У меня есть класс звукозаписывающего устройства, который использует AudioRecord для записи звука и сохранения его в массиве байтов. Он работал нормально до недавнего времени, когда мой AudioRecord не смог инициализировать, и я не вижу, где я ошибаюсь.Android Wear 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; 
    } 
} 

Может кто-нибудь помочь мне с этим? Благодарю.

ответ

0

Я, наконец, решил эту проблему после вытягивания волос. В Android wear (moto360) на экране настроек отображается пункт меню «Разрешения». Здесь я установил разрешение моего приложения на «микрофон» включен ». Я понятия не имею, когда эта функция была добавлена, но она решила мою проблему.

Смежные вопросы