diff --git a/desktop/src-tauri/gen/android/app/src/main/AndroidManifest.xml b/desktop/src-tauri/gen/android/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..97a6a67
--- /dev/null
+++ b/desktop/src-tauri/gen/android/app/src/main/AndroidManifest.xml
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/desktop/src-tauri/gen/android/app/src/main/java/com/wzp/desktop/MainActivity.kt b/desktop/src-tauri/gen/android/app/src/main/java/com/wzp/desktop/MainActivity.kt
new file mode 100644
index 0000000..c1994a2
--- /dev/null
+++ b/desktop/src-tauri/gen/android/app/src/main/java/com/wzp/desktop/MainActivity.kt
@@ -0,0 +1,53 @@
+package com.wzp.desktop
+
+import android.Manifest
+import android.content.pm.PackageManager
+import android.os.Bundle
+import android.util.Log
+import androidx.activity.enableEdgeToEdge
+import androidx.core.app.ActivityCompat
+import androidx.core.content.ContextCompat
+
+class MainActivity : TauriActivity() {
+ companion object {
+ private const val TAG = "WzpMainActivity"
+ private const val AUDIO_PERMISSIONS_REQUEST = 4242
+ private val REQUIRED_AUDIO_PERMISSIONS = arrayOf(
+ Manifest.permission.RECORD_AUDIO,
+ Manifest.permission.MODIFY_AUDIO_SETTINGS
+ )
+ }
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ enableEdgeToEdge()
+ super.onCreate(savedInstanceState)
+
+ // Request RECORD_AUDIO early so Oboe (inside libwzp_native.so) can open
+ // the AAudio input stream without silently failing. The grant is
+ // persisted, so after the first launch the dialog no longer appears.
+ // MODIFY_AUDIO_SETTINGS is requested alongside because Oboe toggles the
+ // audio mode to communication on some devices.
+ val needsRequest = REQUIRED_AUDIO_PERMISSIONS.any {
+ ContextCompat.checkSelfPermission(this, it) != PackageManager.PERMISSION_GRANTED
+ }
+ if (needsRequest) {
+ Log.i(TAG, "requesting audio permissions")
+ ActivityCompat.requestPermissions(this, REQUIRED_AUDIO_PERMISSIONS, AUDIO_PERMISSIONS_REQUEST)
+ } else {
+ Log.i(TAG, "audio permissions already granted")
+ }
+ }
+
+ override fun onRequestPermissionsResult(
+ requestCode: Int,
+ permissions: Array,
+ grantResults: IntArray
+ ) {
+ super.onRequestPermissionsResult(requestCode, permissions, grantResults)
+ if (requestCode == AUDIO_PERMISSIONS_REQUEST) {
+ val allGranted = grantResults.isNotEmpty() &&
+ grantResults.all { it == PackageManager.PERMISSION_GRANTED }
+ Log.i(TAG, "audio permissions result: allGranted=$allGranted grants=${grantResults.toList()}")
+ }
+ }
+}