[Android] Add proper Bluetooth permissions check to avoid crashes
All checks were successful
eden-build / source (push) Successful in 6m9s
eden-build / linux (push) Successful in 27m29s
eden-build / windows (msvc) (push) Successful in 29m42s
eden-build / android (push) Successful in 33m54s

Authored-by: edendev <edendev@eden-emu.org>

Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/261
Co-authored-by: Bix <bix@bixed.xyz>
Co-committed-by: Bix <bix@bixed.xyz>
This commit is contained in:
Bix 2025-07-04 21:47:42 +00:00 committed by edendev
parent 39a46d755f
commit d8bfc691d1
No known key found for this signature in database
GPG key ID: BA8734FD0EE46976
2 changed files with 40 additions and 1 deletions

View file

@ -25,6 +25,10 @@ SPDX-License-Identifier: GPL-3.0-or-later
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" android:required="false" /> <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" android:required="false" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
<uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30" />
<application <application
android:name="org.yuzu.yuzu_emu.YuzuApplication" android:name="org.yuzu.yuzu_emu.YuzuApplication"

View file

@ -65,6 +65,36 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
private val CHECKED_FIRMWARE = "CheckedFirmware" private val CHECKED_FIRMWARE = "CheckedFirmware"
private var checkedFirmware = false private var checkedFirmware = false
private val requestBluetoothPermissionsLauncher =
registerForActivityResult(androidx.activity.result.contract.ActivityResultContracts.RequestMultiplePermissions()) { permissions ->
val granted = permissions.entries.all { it.value }
if (granted) {
// Permissions were granted.
android.widget.Toast.makeText(this, "Bluetooth permissions granted.", android.widget.Toast.LENGTH_SHORT).show()
} else {
// Permissions were denied.
android.widget.Toast.makeText(this, "Bluetooth permissions denied. Controller support may be limited.", android.widget.Toast.LENGTH_LONG).show()
}
}
private fun checkAndRequestBluetoothPermissions() {
// This check is only necessary for Android 12 (API level 31) and above.
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.S) {
val permissionsToRequest = arrayOf(
android.Manifest.permission.BLUETOOTH_SCAN,
android.Manifest.permission.BLUETOOTH_CONNECT
)
val permissionsNotGranted = permissionsToRequest.filter {
checkSelfPermission(it) != android.content.pm.PackageManager.PERMISSION_GRANTED
}
if (permissionsNotGranted.isNotEmpty()) {
requestBluetoothPermissionsLauncher.launch(permissionsNotGranted.toTypedArray())
}
}
}
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
val splashScreen = installSplashScreen() val splashScreen = installSplashScreen()
splashScreen.setKeepOnScreenCondition { !DirectoryInitialization.areDirectoriesReady } splashScreen.setKeepOnScreenCondition { !DirectoryInitialization.areDirectoriesReady }
@ -75,8 +105,13 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
NativeLibrary.initMultiplayer() NativeLibrary.initMultiplayer()
binding = ActivityMainBinding.inflate(layoutInflater) binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
setContentView(binding.root)
checkAndRequestBluetoothPermissions()
if (savedInstanceState != null) { if (savedInstanceState != null) {
checkedDecryption = savedInstanceState.getBoolean(CHECKED_DECRYPTION) checkedDecryption = savedInstanceState.getBoolean(CHECKED_DECRYPTION)
checkedFirmware = savedInstanceState.getBoolean(CHECKED_FIRMWARE) checkedFirmware = savedInstanceState.getBoolean(CHECKED_FIRMWARE)