Bluetooth headset's microphone instead android wear's microphone












0















I have a problem with android wear's microphone.



Bluetooth headset works with android wear. My app release VoIP applecation.
When I play voice (from network) in my app with paired bluetooth headset, headset play this voice. But when I try record voice from the microphone.. turns on the microphone of the android wear, not the headset.



How can I implement voice reading from the Bluetooth headset microphone??



Attach Player.class



public class Player {
private static final String TAG = Player.class.getName();
private AudioTrack audioTrack;
private boolean isWorking;

public Player() {
try {
audioTrack = new AudioTrack(
new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_VOICE_COMMUNICATION)
.setContentType(AudioAttributes.CONTENT_TYPE_SPEECH)
.setLegacyStreamType(AudioManager.STREAM_MUSIC)
.build(),

new AudioFormat.Builder()
.setChannelMask(AudioFormat.CHANNEL_OUT_MONO)
.setEncoding(AudioFormat.ENCODING_PCM_16BIT)
.setSampleRate(AudioConsts.SAMPLERATE)
.build(),

AudioConsts.GetPlayerBufferSize(),
AudioTrack.MODE_STREAM,
AudioManager.AUDIO_SESSION_ID_GENERATE);

} catch (Exception e) {
Log.e(TAG, e.toString());
}

}

public void play() {
audioTrack.play();
}

public void stopReading() {
if (!isWorking)
return;

audioTrack.release();
isWorking = false;
}

public void appendForPlayback(byte audioMessage, int size) {
new Executor().doInBackground(audioMessage);
}

private class Executor extends AsyncTask<byte, Void, Void> {
@Override
protected Void doInBackground(byte... bytes) {
if (bytes != null) {
if (bytes.length > 0) {
byte audioMessage = bytes[0];
if (audioMessage.length != 0) {
int written = audioTrack.write(audioMessage, 0, audioMessage.length);
if (written != audioMessage.length) {
Log.d(TAG, "WTF");
}
}
}
}

return null;
}
}}


Attach Recorder.class



public class Recorder {
private static final String TAG = Recorder.class.getName();

private boolean isAlive;
private Thread recordThread;
private IRecorderBytesListener listener;
private AudioRecord audioRecord;

public Recorder() {
isAlive = true;

audioRecord = new AudioRecord.Builder()
.setAudioSource(MediaRecorder.AudioSource.MIC)
.setAudioFormat(new AudioFormat.Builder()
.setSampleRate(AudioConsts.SAMPLERATE)
.setEncoding(AudioConsts.ENCODING_PCM_16BIT)
.build())
.setBufferSizeInBytes(AudioConsts.GetRecorderBufferSize())
.build();

//audioRecord.setPreferredDevice(audioDeviceInfo);

recordThread = new Thread(() -> {
ByteBuffer buffer = ByteBuffer.allocateDirect(AudioConsts.GetRecorderBufferSize());
byte audioMsg = new byte[AudioConsts.FRAME_SIZE * AudioConsts.ENCODING_PCM_16BIT];

while (isAlive) {
if (audioRecord.getRecordingState() == 1) {
try {
Thread.sleep(50);
} catch (Exception e) {
Log.d(TAG, "hz");
}
continue;
}

buffer = (ByteBuffer) buffer.rewind();
int len = audioRecord.read(buffer, AudioConsts.GetRecorderBufferSize());
if (len != AudioConsts.GetRecorderBufferSize())
Log.d(TAG, "WTF LEN");

len -= AudioConsts.OFFSET_AUDIO_RECORDER;

if (len > 0) {
try {
System.arraycopy(buffer.array(), AudioConsts.OFFSET_AUDIO_RECORDER,
audioMsg, 0, len);

if (listener != null)
listener.bytesReceived(audioMsg, len);
} catch (Exception e) {
Log.e(TAG, e.toString());
}
} else {
Log.d(TAG, "WTF");
}
}

audioRecord.stop();
});

recordThread.start();
}

public void startRecording() {
audioRecord.startRecording();
}

public void stopRecording() {
audioRecord.stop();
}

public void setListener(IRecorderBytesListener listener) {
this.listener = listener;
}

public void dispose() {
isAlive = false;
}}


Sorry for my English.










share|improve this question

























  • You may want to check out AudioManager.startBluetoothSco() method. I think this answer also explains the usage of the method pretty well.

    – Jacque
    Nov 16 '18 at 8:08











  • Android wear also does not use headset mic with SCO

    – Vlad Doroshko
    Nov 19 '18 at 8:19
















0















I have a problem with android wear's microphone.



Bluetooth headset works with android wear. My app release VoIP applecation.
When I play voice (from network) in my app with paired bluetooth headset, headset play this voice. But when I try record voice from the microphone.. turns on the microphone of the android wear, not the headset.



How can I implement voice reading from the Bluetooth headset microphone??



Attach Player.class



public class Player {
private static final String TAG = Player.class.getName();
private AudioTrack audioTrack;
private boolean isWorking;

public Player() {
try {
audioTrack = new AudioTrack(
new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_VOICE_COMMUNICATION)
.setContentType(AudioAttributes.CONTENT_TYPE_SPEECH)
.setLegacyStreamType(AudioManager.STREAM_MUSIC)
.build(),

new AudioFormat.Builder()
.setChannelMask(AudioFormat.CHANNEL_OUT_MONO)
.setEncoding(AudioFormat.ENCODING_PCM_16BIT)
.setSampleRate(AudioConsts.SAMPLERATE)
.build(),

AudioConsts.GetPlayerBufferSize(),
AudioTrack.MODE_STREAM,
AudioManager.AUDIO_SESSION_ID_GENERATE);

} catch (Exception e) {
Log.e(TAG, e.toString());
}

}

public void play() {
audioTrack.play();
}

public void stopReading() {
if (!isWorking)
return;

audioTrack.release();
isWorking = false;
}

public void appendForPlayback(byte audioMessage, int size) {
new Executor().doInBackground(audioMessage);
}

private class Executor extends AsyncTask<byte, Void, Void> {
@Override
protected Void doInBackground(byte... bytes) {
if (bytes != null) {
if (bytes.length > 0) {
byte audioMessage = bytes[0];
if (audioMessage.length != 0) {
int written = audioTrack.write(audioMessage, 0, audioMessage.length);
if (written != audioMessage.length) {
Log.d(TAG, "WTF");
}
}
}
}

return null;
}
}}


Attach Recorder.class



public class Recorder {
private static final String TAG = Recorder.class.getName();

private boolean isAlive;
private Thread recordThread;
private IRecorderBytesListener listener;
private AudioRecord audioRecord;

public Recorder() {
isAlive = true;

audioRecord = new AudioRecord.Builder()
.setAudioSource(MediaRecorder.AudioSource.MIC)
.setAudioFormat(new AudioFormat.Builder()
.setSampleRate(AudioConsts.SAMPLERATE)
.setEncoding(AudioConsts.ENCODING_PCM_16BIT)
.build())
.setBufferSizeInBytes(AudioConsts.GetRecorderBufferSize())
.build();

//audioRecord.setPreferredDevice(audioDeviceInfo);

recordThread = new Thread(() -> {
ByteBuffer buffer = ByteBuffer.allocateDirect(AudioConsts.GetRecorderBufferSize());
byte audioMsg = new byte[AudioConsts.FRAME_SIZE * AudioConsts.ENCODING_PCM_16BIT];

while (isAlive) {
if (audioRecord.getRecordingState() == 1) {
try {
Thread.sleep(50);
} catch (Exception e) {
Log.d(TAG, "hz");
}
continue;
}

buffer = (ByteBuffer) buffer.rewind();
int len = audioRecord.read(buffer, AudioConsts.GetRecorderBufferSize());
if (len != AudioConsts.GetRecorderBufferSize())
Log.d(TAG, "WTF LEN");

len -= AudioConsts.OFFSET_AUDIO_RECORDER;

if (len > 0) {
try {
System.arraycopy(buffer.array(), AudioConsts.OFFSET_AUDIO_RECORDER,
audioMsg, 0, len);

if (listener != null)
listener.bytesReceived(audioMsg, len);
} catch (Exception e) {
Log.e(TAG, e.toString());
}
} else {
Log.d(TAG, "WTF");
}
}

audioRecord.stop();
});

recordThread.start();
}

public void startRecording() {
audioRecord.startRecording();
}

public void stopRecording() {
audioRecord.stop();
}

public void setListener(IRecorderBytesListener listener) {
this.listener = listener;
}

public void dispose() {
isAlive = false;
}}


Sorry for my English.










share|improve this question

























  • You may want to check out AudioManager.startBluetoothSco() method. I think this answer also explains the usage of the method pretty well.

    – Jacque
    Nov 16 '18 at 8:08











  • Android wear also does not use headset mic with SCO

    – Vlad Doroshko
    Nov 19 '18 at 8:19














0












0








0








I have a problem with android wear's microphone.



Bluetooth headset works with android wear. My app release VoIP applecation.
When I play voice (from network) in my app with paired bluetooth headset, headset play this voice. But when I try record voice from the microphone.. turns on the microphone of the android wear, not the headset.



How can I implement voice reading from the Bluetooth headset microphone??



Attach Player.class



public class Player {
private static final String TAG = Player.class.getName();
private AudioTrack audioTrack;
private boolean isWorking;

public Player() {
try {
audioTrack = new AudioTrack(
new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_VOICE_COMMUNICATION)
.setContentType(AudioAttributes.CONTENT_TYPE_SPEECH)
.setLegacyStreamType(AudioManager.STREAM_MUSIC)
.build(),

new AudioFormat.Builder()
.setChannelMask(AudioFormat.CHANNEL_OUT_MONO)
.setEncoding(AudioFormat.ENCODING_PCM_16BIT)
.setSampleRate(AudioConsts.SAMPLERATE)
.build(),

AudioConsts.GetPlayerBufferSize(),
AudioTrack.MODE_STREAM,
AudioManager.AUDIO_SESSION_ID_GENERATE);

} catch (Exception e) {
Log.e(TAG, e.toString());
}

}

public void play() {
audioTrack.play();
}

public void stopReading() {
if (!isWorking)
return;

audioTrack.release();
isWorking = false;
}

public void appendForPlayback(byte audioMessage, int size) {
new Executor().doInBackground(audioMessage);
}

private class Executor extends AsyncTask<byte, Void, Void> {
@Override
protected Void doInBackground(byte... bytes) {
if (bytes != null) {
if (bytes.length > 0) {
byte audioMessage = bytes[0];
if (audioMessage.length != 0) {
int written = audioTrack.write(audioMessage, 0, audioMessage.length);
if (written != audioMessage.length) {
Log.d(TAG, "WTF");
}
}
}
}

return null;
}
}}


Attach Recorder.class



public class Recorder {
private static final String TAG = Recorder.class.getName();

private boolean isAlive;
private Thread recordThread;
private IRecorderBytesListener listener;
private AudioRecord audioRecord;

public Recorder() {
isAlive = true;

audioRecord = new AudioRecord.Builder()
.setAudioSource(MediaRecorder.AudioSource.MIC)
.setAudioFormat(new AudioFormat.Builder()
.setSampleRate(AudioConsts.SAMPLERATE)
.setEncoding(AudioConsts.ENCODING_PCM_16BIT)
.build())
.setBufferSizeInBytes(AudioConsts.GetRecorderBufferSize())
.build();

//audioRecord.setPreferredDevice(audioDeviceInfo);

recordThread = new Thread(() -> {
ByteBuffer buffer = ByteBuffer.allocateDirect(AudioConsts.GetRecorderBufferSize());
byte audioMsg = new byte[AudioConsts.FRAME_SIZE * AudioConsts.ENCODING_PCM_16BIT];

while (isAlive) {
if (audioRecord.getRecordingState() == 1) {
try {
Thread.sleep(50);
} catch (Exception e) {
Log.d(TAG, "hz");
}
continue;
}

buffer = (ByteBuffer) buffer.rewind();
int len = audioRecord.read(buffer, AudioConsts.GetRecorderBufferSize());
if (len != AudioConsts.GetRecorderBufferSize())
Log.d(TAG, "WTF LEN");

len -= AudioConsts.OFFSET_AUDIO_RECORDER;

if (len > 0) {
try {
System.arraycopy(buffer.array(), AudioConsts.OFFSET_AUDIO_RECORDER,
audioMsg, 0, len);

if (listener != null)
listener.bytesReceived(audioMsg, len);
} catch (Exception e) {
Log.e(TAG, e.toString());
}
} else {
Log.d(TAG, "WTF");
}
}

audioRecord.stop();
});

recordThread.start();
}

public void startRecording() {
audioRecord.startRecording();
}

public void stopRecording() {
audioRecord.stop();
}

public void setListener(IRecorderBytesListener listener) {
this.listener = listener;
}

public void dispose() {
isAlive = false;
}}


Sorry for my English.










share|improve this question
















I have a problem with android wear's microphone.



Bluetooth headset works with android wear. My app release VoIP applecation.
When I play voice (from network) in my app with paired bluetooth headset, headset play this voice. But when I try record voice from the microphone.. turns on the microphone of the android wear, not the headset.



How can I implement voice reading from the Bluetooth headset microphone??



Attach Player.class



public class Player {
private static final String TAG = Player.class.getName();
private AudioTrack audioTrack;
private boolean isWorking;

public Player() {
try {
audioTrack = new AudioTrack(
new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_VOICE_COMMUNICATION)
.setContentType(AudioAttributes.CONTENT_TYPE_SPEECH)
.setLegacyStreamType(AudioManager.STREAM_MUSIC)
.build(),

new AudioFormat.Builder()
.setChannelMask(AudioFormat.CHANNEL_OUT_MONO)
.setEncoding(AudioFormat.ENCODING_PCM_16BIT)
.setSampleRate(AudioConsts.SAMPLERATE)
.build(),

AudioConsts.GetPlayerBufferSize(),
AudioTrack.MODE_STREAM,
AudioManager.AUDIO_SESSION_ID_GENERATE);

} catch (Exception e) {
Log.e(TAG, e.toString());
}

}

public void play() {
audioTrack.play();
}

public void stopReading() {
if (!isWorking)
return;

audioTrack.release();
isWorking = false;
}

public void appendForPlayback(byte audioMessage, int size) {
new Executor().doInBackground(audioMessage);
}

private class Executor extends AsyncTask<byte, Void, Void> {
@Override
protected Void doInBackground(byte... bytes) {
if (bytes != null) {
if (bytes.length > 0) {
byte audioMessage = bytes[0];
if (audioMessage.length != 0) {
int written = audioTrack.write(audioMessage, 0, audioMessage.length);
if (written != audioMessage.length) {
Log.d(TAG, "WTF");
}
}
}
}

return null;
}
}}


Attach Recorder.class



public class Recorder {
private static final String TAG = Recorder.class.getName();

private boolean isAlive;
private Thread recordThread;
private IRecorderBytesListener listener;
private AudioRecord audioRecord;

public Recorder() {
isAlive = true;

audioRecord = new AudioRecord.Builder()
.setAudioSource(MediaRecorder.AudioSource.MIC)
.setAudioFormat(new AudioFormat.Builder()
.setSampleRate(AudioConsts.SAMPLERATE)
.setEncoding(AudioConsts.ENCODING_PCM_16BIT)
.build())
.setBufferSizeInBytes(AudioConsts.GetRecorderBufferSize())
.build();

//audioRecord.setPreferredDevice(audioDeviceInfo);

recordThread = new Thread(() -> {
ByteBuffer buffer = ByteBuffer.allocateDirect(AudioConsts.GetRecorderBufferSize());
byte audioMsg = new byte[AudioConsts.FRAME_SIZE * AudioConsts.ENCODING_PCM_16BIT];

while (isAlive) {
if (audioRecord.getRecordingState() == 1) {
try {
Thread.sleep(50);
} catch (Exception e) {
Log.d(TAG, "hz");
}
continue;
}

buffer = (ByteBuffer) buffer.rewind();
int len = audioRecord.read(buffer, AudioConsts.GetRecorderBufferSize());
if (len != AudioConsts.GetRecorderBufferSize())
Log.d(TAG, "WTF LEN");

len -= AudioConsts.OFFSET_AUDIO_RECORDER;

if (len > 0) {
try {
System.arraycopy(buffer.array(), AudioConsts.OFFSET_AUDIO_RECORDER,
audioMsg, 0, len);

if (listener != null)
listener.bytesReceived(audioMsg, len);
} catch (Exception e) {
Log.e(TAG, e.toString());
}
} else {
Log.d(TAG, "WTF");
}
}

audioRecord.stop();
});

recordThread.start();
}

public void startRecording() {
audioRecord.startRecording();
}

public void stopRecording() {
audioRecord.stop();
}

public void setListener(IRecorderBytesListener listener) {
this.listener = listener;
}

public void dispose() {
isAlive = false;
}}


Sorry for my English.







android bluetooth wear-os headset






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Nov 15 '18 at 12:34







Vlad Doroshko

















asked Nov 15 '18 at 12:20









Vlad DoroshkoVlad Doroshko

83




83













  • You may want to check out AudioManager.startBluetoothSco() method. I think this answer also explains the usage of the method pretty well.

    – Jacque
    Nov 16 '18 at 8:08











  • Android wear also does not use headset mic with SCO

    – Vlad Doroshko
    Nov 19 '18 at 8:19



















  • You may want to check out AudioManager.startBluetoothSco() method. I think this answer also explains the usage of the method pretty well.

    – Jacque
    Nov 16 '18 at 8:08











  • Android wear also does not use headset mic with SCO

    – Vlad Doroshko
    Nov 19 '18 at 8:19

















You may want to check out AudioManager.startBluetoothSco() method. I think this answer also explains the usage of the method pretty well.

– Jacque
Nov 16 '18 at 8:08





You may want to check out AudioManager.startBluetoothSco() method. I think this answer also explains the usage of the method pretty well.

– Jacque
Nov 16 '18 at 8:08













Android wear also does not use headset mic with SCO

– Vlad Doroshko
Nov 19 '18 at 8:19





Android wear also does not use headset mic with SCO

– Vlad Doroshko
Nov 19 '18 at 8:19












0






active

oldest

votes











Your Answer






StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");

StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});

function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});


}
});














draft saved

draft discarded


















StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53319403%2fbluetooth-headsets-microphone-instead-android-wears-microphone%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown

























0






active

oldest

votes








0






active

oldest

votes









active

oldest

votes






active

oldest

votes
















draft saved

draft discarded




















































Thanks for contributing an answer to Stack Overflow!


  • Please be sure to answer the question. Provide details and share your research!

But avoid



  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.


To learn more, see our tips on writing great answers.




draft saved


draft discarded














StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53319403%2fbluetooth-headsets-microphone-instead-android-wears-microphone%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown





















































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown

































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown







Popular posts from this blog

Florida Star v. B. J. F.

Error while running script in elastic search , gateway timeout

Adding quotations to stringified JSON object values