aboutsummaryrefslogtreecommitdiff
path: root/src/android
diff options
context:
space:
mode:
authorBix <bix@bixed.xyz>2025-07-04 21:47:42 +0000
committeredendev <edendev@noreply.localhost>2025-07-04 21:47:42 +0000
commitd8bfc691d145cef736b7f12e23fdc6c454e8f926 (patch)
tree2df1aad070b0c5318fc3d39338b8633ac3dfbf82 /src/android
parent39a46d755f103579a1ef19cd5fbda2916fd334c1 (diff)
[Android] Add proper Bluetooth permissions check to avoid crashes
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>
Diffstat (limited to 'src/android')
-rw-r--r--src/android/app/src/main/AndroidManifest.xml4
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/main/MainActivity.kt37
2 files changed, 40 insertions, 1 deletions
diff --git a/src/android/app/src/main/AndroidManifest.xml b/src/android/app/src/main/AndroidManifest.xml
index e4885e5126..353c2f722d 100644
--- a/src/android/app/src/main/AndroidManifest.xml
+++ b/src/android/app/src/main/AndroidManifest.xml
@@ -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.VIBRATE" />
<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
android:name="org.yuzu.yuzu_emu.YuzuApplication"
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/main/MainActivity.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/main/MainActivity.kt
index 5177e78874..8cc32f4bd2 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/main/MainActivity.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/main/MainActivity.kt
@@ -65,6 +65,36 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
private val CHECKED_FIRMWARE = "CheckedFirmware"
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?) {
val splashScreen = installSplashScreen()
splashScreen.setKeepOnScreenCondition { !DirectoryInitialization.areDirectoriesReady }
@@ -75,8 +105,13 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
NativeLibrary.initMultiplayer()
binding = ActivityMainBinding.inflate(layoutInflater)
- setContentView(binding.root)
+
+ setContentView(binding.root)
+
+
+ checkAndRequestBluetoothPermissions()
+
if (savedInstanceState != null) {
checkedDecryption = savedInstanceState.getBoolean(CHECKED_DECRYPTION)
checkedFirmware = savedInstanceState.getBoolean(CHECKED_FIRMWARE)