You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Given that more and more Android phones are used with Bluetooth headphones, we need to support recording audio notes from them in addition to being able to record from the built-in mic. Particularly important when doing audio mapping using bicycle or motocycle.
Here is a first attempt with already works (used it yesterday for long mapping session):
$ git diff
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 053700c..495f557 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -11,7 +11,18 @@
<!-- Foreground services and network permissions -->
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
+
<uses-permission android:name="android.permission.RECORD_AUDIO" />
+ <uses-permission android:name="android.permission.RECORD_AUDIO"/>
+ <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
+ <uses-permission android:name="android.permission.BLUETOOTH"/>
+ <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
+ <!-- on Android 12+ also: -->
+ <uses-permission
+ android:name="android.permission.BLUETOOTH_CONNECT"
+ android:required="false"
+ tools:targetApi="31"/>
+
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
diff --git a/app/src/main/java/net/osmtracker/view/VoiceRecDialog.java b/app/src/main/java/net/osmtracker/view/VoiceRecDialog.java
index 97018ff..153f2a9 100644
--- a/app/src/main/java/net/osmtracker/view/VoiceRecDialog.java
+++ b/app/src/main/java/net/osmtracker/view/VoiceRecDialog.java
@@ -1,10 +1,15 @@
package net.osmtracker.view;
+import android.os.Build;
+import android.os.Build.VERSION_CODES;
import android.app.ProgressDialog;
+import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
+import android.content.IntentFilter;
import android.content.Intent;
import android.content.SharedPreferences;
+import android.media.AudioDeviceInfo;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.MediaRecorder;
@@ -103,6 +108,10 @@ public class VoiceRecDialog extends ProgressDialog implements OnInfoListener{
@Override
public void onClick(DialogInterface dialog, int which) {
mediaRecorder.stop();
+ audioManager.stopBluetoothSco();
+ audioManager.setBluetoothScoOn(false);
+ audioManager.setMode(AudioManager.MODE_NORMAL);
+
VoiceRecDialog.this.dismiss();
}
});
@@ -184,17 +193,36 @@ public class VoiceRecDialog extends ProgressDialog implements OnInfoListener{
mediaRecorder = new MediaRecorder();
try {
+ audioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
+ for (AudioDeviceInfo dev : audioManager.getDevices(AudioManager.GET_DEVICES_INPUTS)) {
+ if (dev.getType() == AudioDeviceInfo.TYPE_BLUETOOTH_SCO) {
+ audioManager.setCommunicationDevice(dev);
+ break;
+ }
+ }
+ }
+ //audioManager.startBluetoothSco();
+ //audioManager.setBluetoothScoOn(true);
+ // Ideally listen for ACTION_SCO_AUDIO_STATE_UPDATED == CONNECTED before proceeding
+
+
// MediaRecorder configuration
- mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
- mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
- mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
+ mediaRecorder.setAudioSource(MediaRecorder.AudioSource.VOICE_COMMUNICATION);
+ mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
+ mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
+ //mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
+ //mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mediaRecorder.setOutputFile(audioFile.getAbsolutePath());
mediaRecorder.setMaxDuration(recordingDuration * 1000);
mediaRecorder.setOnInfoListener(this);
Log.d(TAG, "onStart() starting mediaRecorder...");
mediaRecorder.prepare();
- mediaRecorder.start();
+ context.registerReceiver(scoReceiver,
+ new IntentFilter(AudioManager.ACTION_SCO_AUDIO_STATE_UPDATED));
+ audioManager.startBluetoothSco();
+ //mediaRecorder.start();
if (mediaPlayerStart != null) {
// short "beep-beep" to notify that recording started
@@ -230,6 +258,19 @@ public class VoiceRecDialog extends ProgressDialog implements OnInfoListener{
super.onStart();
}
+
+ // BroadcastReceiver to know when SCO is actually up
+ private final BroadcastReceiver scoReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context ctx, Intent intent) {
+ int state = intent.getIntExtra(
+ AudioManager.EXTRA_SCO_AUDIO_STATE, AudioManager.SCO_AUDIO_STATE_ERROR);
+ if (state == AudioManager.SCO_AUDIO_STATE_CONNECTED) {
+ mediaRecorder.start();
+ context.unregisterReceiver(this);
+ }
+ }
+ };
@Override
public void onInfo(MediaRecorder mr, int what, int extra) {
@@ -338,6 +379,9 @@ public class VoiceRecDialog extends ProgressDialog implements OnInfoListener{
if (mp != null) {
try {
mp.stop();
+ audioManager.stopBluetoothSco();
+ audioManager.setBluetoothScoOn(false);
+ audioManager.setMode(AudioManager.MODE_NORMAL);
} catch (Exception e) {
Log.w(TAG, "Failed to stop media player",e);
} finally {
@@ -356,6 +400,9 @@ public class VoiceRecDialog extends ProgressDialog implements OnInfoListener{
try {
if (stopIt) {
mr.stop();
+ audioManager.stopBluetoothSco();
+ audioManager.setBluetoothScoOn(false);
+ audioManager.setMode(AudioManager.MODE_NORMAL);
}
} catch (Exception e) {
Log.w(TAG, "Failed to stop media recorder",e);
It will require cleanup and improvements before it can be committed as a PR. At least:
making Bluetooth audio settings option
playback (beeps) should go to Bluetooth, too - currently not sure if it works or not (haven't heard it but maybe I had muted phone)
test if MPEG4/AAC is really needed or if the default one can be used
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
-
Given that more and more Android phones are used with Bluetooth headphones, we need to support recording audio notes from them in addition to being able to record from the built-in mic. Particularly important when doing audio mapping using bicycle or motocycle.
Here is a first attempt with already works (used it yesterday for long mapping session):
It will require cleanup and improvements before it can be committed as a PR. At least:
Beta Was this translation helpful? Give feedback.
All reactions