More bluetooth related fixes and improvements
This commit is contained in:
@@ -13,6 +13,7 @@ import android.content.IntentFilter
|
|||||||
import android.content.pm.PackageManager
|
import android.content.pm.PackageManager
|
||||||
import android.database.ContentObserver
|
import android.database.ContentObserver
|
||||||
import android.media.*
|
import android.media.*
|
||||||
|
import android.media.AudioManager.MODE_IN_COMMUNICATION
|
||||||
import android.media.AudioManager.MODE_NORMAL
|
import android.media.AudioManager.MODE_NORMAL
|
||||||
import android.media.AudioManager.RINGER_MODE_SILENT
|
import android.media.AudioManager.RINGER_MODE_SILENT
|
||||||
import android.net.*
|
import android.net.*
|
||||||
@@ -46,7 +47,6 @@ import java.util.*
|
|||||||
import kotlin.concurrent.schedule
|
import kotlin.concurrent.schedule
|
||||||
import kotlin.math.roundToInt
|
import kotlin.math.roundToInt
|
||||||
|
|
||||||
|
|
||||||
class BaresipService: Service() {
|
class BaresipService: Service() {
|
||||||
|
|
||||||
internal lateinit var intent: Intent
|
internal lateinit var intent: Intent
|
||||||
@@ -246,24 +246,14 @@ class BaresipService: Service() {
|
|||||||
when (state) {
|
when (state) {
|
||||||
BluetoothHeadset.STATE_CONNECTED -> {
|
BluetoothHeadset.STATE_CONNECTED -> {
|
||||||
Log.d(TAG, "Bluetooth headset is connected")
|
Log.d(TAG, "Bluetooth headset is connected")
|
||||||
if (audioFocusRequest != null) {
|
if (audioFocusRequest != null)
|
||||||
//Handler(Looper.getMainLooper()).postDelayed({
|
startBluetoothSco(am, 1000L, 3)
|
||||||
//am.startBluetoothSco()
|
|
||||||
startBluetoothSco(am, 1000L)
|
|
||||||
|
|
||||||
//}, 1000)
|
|
||||||
}
|
|
||||||
//Timer("Sco", false).schedule(1000) {
|
|
||||||
// startBluetoothSco(am)
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
BluetoothHeadset.STATE_DISCONNECTED -> {
|
BluetoothHeadset.STATE_DISCONNECTED -> {
|
||||||
Log.d(TAG, "Bluetooth headset is disconnected")
|
Log.d(TAG, "Bluetooth headset is disconnected")
|
||||||
if (isBluetoothScoOn(am)) {
|
if (audioFocusRequest != null)
|
||||||
Log.d(TAG, "Stopping Bluetooth SCO")
|
|
||||||
stopBluetoothSco(am)
|
stopBluetoothSco(am)
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -276,9 +266,6 @@ class BaresipService: Service() {
|
|||||||
}
|
}
|
||||||
BluetoothHeadset.STATE_AUDIO_DISCONNECTED -> {
|
BluetoothHeadset.STATE_AUDIO_DISCONNECTED -> {
|
||||||
Log.d(TAG, "Bluetooth headset audio is disconnected")
|
Log.d(TAG, "Bluetooth headset audio is disconnected")
|
||||||
if (isBluetoothScoOn(am)) {
|
|
||||||
stopBluetoothSco(am)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -778,7 +765,9 @@ class BaresipService: Service() {
|
|||||||
}
|
}
|
||||||
"call established" -> {
|
"call established" -> {
|
||||||
nm.cancel(CALL_NOTIFICATION_ID)
|
nm.cancel(CALL_NOTIFICATION_ID)
|
||||||
Log.d(TAG, "AoR $aor call $callp established")
|
Log.d(TAG, "AoR $aor call $callp established in mode ${am.mode}")
|
||||||
|
if (am.mode != MODE_IN_COMMUNICATION)
|
||||||
|
am.mode = MODE_IN_COMMUNICATION
|
||||||
call!!.status = "connected"
|
call!!.status = "connected"
|
||||||
call.onhold = false
|
call.onhold = false
|
||||||
if (ua.account.callHistory)
|
if (ua.account.callHistory)
|
||||||
@@ -1571,7 +1560,7 @@ class BaresipService: Service() {
|
|||||||
isAudioFocused = true
|
isAudioFocused = true
|
||||||
if (isBluetoothHeadsetConnected(ctx) /* && !am.isBluetoothScoOn */) {
|
if (isBluetoothHeadsetConnected(ctx) /* && !am.isBluetoothScoOn */) {
|
||||||
Log.d(TAG, "Starting Bluetooth SCO")
|
Log.d(TAG, "Starting Bluetooth SCO")
|
||||||
startBluetoothSco(am, 0L)
|
startBluetoothSco(am, 10L, 1)
|
||||||
}
|
}
|
||||||
am.mode = AudioManager.MODE_IN_COMMUNICATION
|
am.mode = AudioManager.MODE_IN_COMMUNICATION
|
||||||
//if (type == AudioAttributes.CONTENT_TYPE_SPEECH || isBluetoothHeadsetConnected(ctx))
|
//if (type == AudioAttributes.CONTENT_TYPE_SPEECH || isBluetoothHeadsetConnected(ctx))
|
||||||
@@ -1616,26 +1605,23 @@ class BaresipService: Service() {
|
|||||||
false
|
false
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun startBluetoothSco(am: AudioManager, delay: Long) {
|
private fun startBluetoothSco(am: AudioManager, delay: Long, count: Int) {
|
||||||
Log.d(TAG, "Starting Bluetooth SCO")
|
Log.d(TAG, "Starting Bluetooth SCO at count $count")
|
||||||
Handler(Looper.getMainLooper()).postDelayed({
|
Handler(Looper.getMainLooper()).postDelayed({
|
||||||
if (VERSION.SDK_INT < 35)
|
if (VERSION.SDK_INT < 31) {
|
||||||
am.startBluetoothSco()
|
am.startBluetoothSco()
|
||||||
else
|
} else {
|
||||||
Utils.setCommunicationDevice(am, AudioDeviceInfo.TYPE_BLUETOOTH_SCO)
|
Utils.setCommunicationDevice(am, AudioDeviceInfo.TYPE_BLUETOOTH_SCO)
|
||||||
if (!isBluetoothScoOn(am)) {
|
|
||||||
Log.d(TAG, "Trying to start Bluetooth SCO again")
|
|
||||||
Handler(Looper.getMainLooper()).postDelayed({
|
|
||||||
am.startBluetoothSco()
|
|
||||||
}, delay)
|
|
||||||
}
|
}
|
||||||
|
if (!isBluetoothScoOn(am) && count > 1)
|
||||||
|
startBluetoothSco(am, delay, count - 1)
|
||||||
}, delay)
|
}, delay)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun stopBluetoothSco(am: AudioManager) {
|
private fun stopBluetoothSco(am: AudioManager) {
|
||||||
Log.d(TAG, "Stopping Bluetooth SCO")
|
Log.d(TAG, "Stopping Bluetooth SCO")
|
||||||
Handler(Looper.getMainLooper()).postDelayed({
|
Handler(Looper.getMainLooper()).postDelayed({
|
||||||
if (VERSION.SDK_INT < 35)
|
if (VERSION.SDK_INT < 31)
|
||||||
am.stopBluetoothSco()
|
am.stopBluetoothSco()
|
||||||
else
|
else
|
||||||
am.clearCommunicationDevice()
|
am.clearCommunicationDevice()
|
||||||
|
|||||||
@@ -680,18 +680,8 @@ class MainActivity : AppCompatActivity() {
|
|||||||
|
|
||||||
requestPermissionsLauncher =
|
requestPermissionsLauncher =
|
||||||
registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { isGranted: Map<String, Boolean> ->
|
registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { isGranted: Map<String, Boolean> ->
|
||||||
Log.e(TAG, "********** isGranted $isGranted")
|
if (firstRun && isGranted.isEmpty())
|
||||||
if (firstRun && isGranted.isEmpty()) {
|
askMicAndBtPermissions()
|
||||||
with(MaterialAlertDialogBuilder(this, R.style.AlertDialogTheme)) {
|
|
||||||
setTitle("Permissions")
|
|
||||||
setMessage(getString(R.string.mic_and_bluetooth))
|
|
||||||
setPositiveButton(getString(R.string.ok)) { dialog, _ ->
|
|
||||||
requestPermissionsLauncher.launch(arrayOf(RECORD_AUDIO, BLUETOOTH_CONNECT))
|
|
||||||
dialog.dismiss()
|
|
||||||
}
|
|
||||||
show()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Preferences(applicationContext).displayTheme != AppCompatDelegate.getDefaultNightMode()) {
|
if (Preferences(applicationContext).displayTheme != AppCompatDelegate.getDefaultNightMode()) {
|
||||||
@@ -708,30 +698,11 @@ class MainActivity : AppCompatActivity() {
|
|||||||
if (!Utils.checkPermissions(this, arrayOf(RECORD_AUDIO, BLUETOOTH_CONNECT)))
|
if (!Utils.checkPermissions(this, arrayOf(RECORD_AUDIO, BLUETOOTH_CONNECT)))
|
||||||
if (ActivityCompat.shouldShowRequestPermissionRationale(this, RECORD_AUDIO) ||
|
if (ActivityCompat.shouldShowRequestPermissionRationale(this, RECORD_AUDIO) ||
|
||||||
ActivityCompat.shouldShowRequestPermissionRationale(this, BLUETOOTH_CONNECT)) {
|
ActivityCompat.shouldShowRequestPermissionRationale(this, BLUETOOTH_CONNECT)) {
|
||||||
layout.showSnackBar(
|
askMicAndBtPermissions()
|
||||||
binding.root,
|
|
||||||
if (!Utils.checkPermissions(this, arrayOf(RECORD_AUDIO)) &&
|
|
||||||
!Utils.checkPermissions(this, arrayOf(BLUETOOTH_CONNECT)))
|
|
||||||
getString(R.string.mic_and_bluetooth)
|
|
||||||
else if (!Utils.checkPermissions(this, arrayOf(RECORD_AUDIO)))
|
|
||||||
getString(R.string.no_calls)
|
|
||||||
else
|
|
||||||
getString(R.string.no_bluetooth),
|
|
||||||
Snackbar.LENGTH_INDEFINITE,
|
|
||||||
getString(R.string.ok)
|
|
||||||
) {
|
|
||||||
requestPermissionsLauncher.launch(arrayOf(RECORD_AUDIO, BLUETOOTH_CONNECT))
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
requestPermissionsLauncher.launch(
|
requestPermissionsLauncher.launch(arrayOf(RECORD_AUDIO, BLUETOOTH_CONNECT)
|
||||||
arrayOf(
|
|
||||||
RECORD_AUDIO,
|
|
||||||
BLUETOOTH_CONNECT
|
|
||||||
)
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
else
|
|
||||||
Log.e(TAG, "********** all permissions granted")
|
|
||||||
|
|
||||||
val action = intent.getStringExtra("action")
|
val action = intent.getStringExtra("action")
|
||||||
if (action != null) {
|
if (action != null) {
|
||||||
@@ -845,6 +816,18 @@ class MainActivity : AppCompatActivity() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun askMicAndBtPermissions() {
|
||||||
|
with(MaterialAlertDialogBuilder(this, R.style.AlertDialogTheme)) {
|
||||||
|
setTitle(getString(R.string.permissions_rationale))
|
||||||
|
setMessage(getString(R.string.mic_and_bt_permissions))
|
||||||
|
setPositiveButton(getString(R.string.ok)) { dialog, _ ->
|
||||||
|
requestPermissionsLauncher.launch(arrayOf(RECORD_AUDIO, BLUETOOTH_CONNECT))
|
||||||
|
dialog.dismiss()
|
||||||
|
}
|
||||||
|
show()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private fun callAction(intent: Intent) {
|
private fun callAction(intent: Intent) {
|
||||||
if (Call.calls().isNotEmpty() || BaresipService.uas.size == 0)
|
if (Call.calls().isNotEmpty() || BaresipService.uas.size == 0)
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -503,8 +503,7 @@
|
|||||||
<string name="call_already_active">Sinulla on jo puhelu käynnissä.</string>
|
<string name="call_already_active">Sinulla on jo puhelu käynnissä.</string>
|
||||||
<string name="start_failed">Sovelluksen käynnistäminen epäonnistui. Tämä voi johtua virheellisestä
|
<string name="start_failed">Sovelluksen käynnistäminen epäonnistui. Tämä voi johtua virheellisestä
|
||||||
Asetukset arvosta. Tarkista Kuunteluosoite, TLS-varmennintiedosto ja TLS CA-tiedosto.
|
Asetukset arvosta. Tarkista Kuunteluosoite, TLS-varmennintiedosto ja TLS CA-tiedosto.
|
||||||
Sen jälkeen käynnistä baresip uudelleen.
|
Sen jälkeen käynnistä baresip uudelleen.</string>
|
||||||
</string>
|
|
||||||
<string name="registering_failed">Tilin \'%1$s\' rekisteröinti epäonnistui.</string>
|
<string name="registering_failed">Tilin \'%1$s\' rekisteröinti epäonnistui.</string>
|
||||||
<string name="verify">Todennuspyyntö</string>
|
<string name="verify">Todennuspyyntö</string>
|
||||||
<string name="verify_sas">Todennatko SAS:n <%1$s>\?</string>
|
<string name="verify_sas">Todennatko SAS:n <%1$s>\?</string>
|
||||||
@@ -513,27 +512,22 @@
|
|||||||
<string name="call_failed">Puhelu epäonnistui</string>
|
<string name="call_failed">Puhelu epäonnistui</string>
|
||||||
<string name="call_closed">Puhelu on päättynyt</string>
|
<string name="call_closed">Puhelu on päättynyt</string>
|
||||||
<string name="call_not_secure">Tämä puhelu EI ole turvallinen!</string>
|
<string name="call_not_secure">Tämä puhelu EI ole turvallinen!</string>
|
||||||
<string name="peer_not_verified">Tämä puhelu on turvallinen, mutta
|
<string name="peer_not_verified">Tämä puhelu on turvallinen, mutta kohdetta ei ole
|
||||||
kohdetta ei ole todennettu!
|
todennettu!</string>
|
||||||
</string>
|
|
||||||
<string name="call_is_secure">Tämä pulelu on turvallinen ja kohde on
|
<string name="call_is_secure">Tämä pulelu on turvallinen ja kohde on
|
||||||
todennettu! Haluatko poistaa todennuksen\?</string>
|
todennettu! Haluatko poistaa todennuksen\?</string>
|
||||||
<string name="unverify">Poista todennus</string>
|
<string name="unverify">Poista todennus</string>
|
||||||
<string name="backed_up">Sovelluksen tiedot talletettiin tiedostoon \'%1$s\'. Android
|
<string name="backed_up">Sovelluksen tiedot talletettiin tiedostoon \'%1$s\'. Android
|
||||||
versioon 9 saakka tiedosto löytyy Download-kansiosta.
|
versioon 9 saakka tiedosto löytyy Download-kansiosta.</string>
|
||||||
</string>
|
|
||||||
<string name="backup_failed">Sovelluksen tietojen talletus epäonnistui. Android versioon 9 saakka
|
<string name="backup_failed">Sovelluksen tietojen talletus epäonnistui. Android versioon 9 saakka
|
||||||
Tarkista Asetukset → Sovellukset → baresip → Käyttöluvat → Tallennustila.
|
Tarkista Asetukset → Sovellukset → baresip → Käyttöluvat → Tallennustila.</string>
|
||||||
</string>
|
|
||||||
<string name="restart_request">Uudelleenkäynnistyspyyntö</string>
|
<string name="restart_request">Uudelleenkäynnistyspyyntö</string>
|
||||||
<string name="restored">Sovelluksen tiedot palautettiin. baresip pitää käynnistää
|
<string name="restored">Sovelluksen tiedot palautettiin. baresip pitää käynnistää
|
||||||
uudelleen. Käynnistä uudelleen nyt\?
|
uudelleen. Käynnistä uudelleen nyt\?</string>
|
||||||
</string>
|
|
||||||
<string name="restore_failed">Sovelluksen tietojen palauttaminen epäonnistui. Tarkista, että
|
<string name="restore_failed">Sovelluksen tietojen palauttaminen epäonnistui. Tarkista, että
|
||||||
annoit oikean salasanan ja että palautustiedosto kuuluu tällä sovellukselle.
|
annoit oikean salasanan ja että palautustiedosto kuuluu tällä sovellukselle.
|
||||||
Android versioon 9 saakka tarkista myös Asetukset → Sovellukset → baresip → Käyttöluvat →
|
Android versioon 9 saakka tarkista myös Asetukset → Sovellukset → baresip → Käyttöluvat →
|
||||||
Tallennustila ja että tiedosto \'%1$s\' on Download-kansiossa.
|
Tallennustila ja että tiedosto \'%1$s\' on Download-kansiossa.</string>
|
||||||
</string>
|
|
||||||
<string name="no_notifications">Et voi käyttää tätä sovellusta ilman Ilmoitukset-lupaa.</string>
|
<string name="no_notifications">Et voi käyttää tätä sovellusta ilman Ilmoitukset-lupaa.</string>
|
||||||
<string name="no_calls">Et voi soittaa puheluita tai vastata niihin ilman Mikrofoni-lupaa.</string>
|
<string name="no_calls">Et voi soittaa puheluita tai vastata niihin ilman Mikrofoni-lupaa.</string>
|
||||||
<string name="no_video_calls">Salli Kamera-lupa jotta voit soittaa videopuheluita ja vastata niihin.</string>
|
<string name="no_video_calls">Salli Kamera-lupa jotta voit soittaa videopuheluita ja vastata niihin.</string>
|
||||||
@@ -544,6 +538,10 @@
|
|||||||
<string name="no_network">Ei verkkoyhteyttä!</string>
|
<string name="no_network">Ei verkkoyhteyttä!</string>
|
||||||
<string name="choose_telephony_provider_account">Valitse puhelinpalvelun tarjoava tili</string>
|
<string name="choose_telephony_provider_account">Valitse puhelinpalvelun tarjoava tili</string>
|
||||||
<string name="call_details">Puhelutiedot</string>
|
<string name="call_details">Puhelutiedot</string>
|
||||||
<string name="no_android_contacts">Et voi käyttää Androidin yhteystietoja ilman Yhteystiedot-sovelluslupaa.</string>
|
<string name="no_android_contacts">Et voi käyttää Androidin yhteystietoja ilman Yhteystiedot-lupaa.</string>
|
||||||
<string name="audio_focus_denied">Audio fokus evätty!</string>
|
<string name="audio_focus_denied">Audio fokus evätty!</string>
|
||||||
|
<string name="permissions_rationale">Tarvittavat luvat</string>
|
||||||
|
<string name="mic_and_bt_permissions">baresip tarvitsee Mikrofoni-luvan puheluita varten ja
|
||||||
|
Lähellä olevat laitteet -luvan Bluetooth-mikrofonin/kaiuttimen havaitsemista varten, mikäli
|
||||||
|
sellaista halutaan käyttää.</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -520,6 +520,8 @@
|
|||||||
<string name="show_password">Show Password</string>
|
<string name="show_password">Show Password</string>
|
||||||
<string name="no_network">No network connection!</string>
|
<string name="no_network">No network connection!</string>
|
||||||
<string name="audio_focus_denied">Audio focus denied!</string>
|
<string name="audio_focus_denied">Audio focus denied!</string>
|
||||||
<string name="mic_and_bluetooth">baresip needs \"Microphone\" permission for calls and
|
<string name="permissions_rationale">Permissions rationale</string>
|
||||||
\"Nearby devices\" permission for Bluetooth detection.</string>
|
<string name="mic_and_bt_permissions">baresip needs \"Microphone\" permission for voice calls and
|
||||||
|
\"Nearby devices\" permission for Bluetooth microphone/speaker detection if you want to use
|
||||||
|
such a device.</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
Reference in New Issue
Block a user