diff --git a/manager/src/main/java/org/lsposed/npatch/ui/activity/MainActivity.kt b/manager/src/main/java/org/lsposed/npatch/ui/activity/MainActivity.kt index 23977ae..28d25d0 100644 --- a/manager/src/main/java/org/lsposed/npatch/ui/activity/MainActivity.kt +++ b/manager/src/main/java/org/lsposed/npatch/ui/activity/MainActivity.kt @@ -1,6 +1,13 @@ package org.lsposed.npatch.ui.activity +import android.Manifest +import android.content.Intent +import android.content.pm.PackageManager +import android.net.Uri +import android.os.Build import android.os.Bundle +import android.os.Environment +import android.provider.Settings import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.compose.animation.ExperimentalAnimationApi @@ -11,6 +18,7 @@ import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp +import androidx.core.app.ActivityCompat import androidx.navigation.NavGraph.Companion.findStartDestination import androidx.navigation.NavHostController import com.google.accompanist.navigation.animation.rememberAnimatedNavController @@ -28,6 +36,10 @@ class MainActivity : ComponentActivity() { @OptIn(ExperimentalAnimationApi::class) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + + // 檢查並請求權限 + checkAndRequestPermissions() + setContent { val navController = rememberAnimatedNavController() LSPTheme { @@ -47,6 +59,35 @@ class MainActivity : ComponentActivity() { } } } + + private fun checkAndRequestPermissions() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + // Android 11 (SDK 30) 以上請求 "所有檔案存取權" + if (!Environment.isExternalStorageManager()) { + try { + val intent = Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION) + intent.addCategory("android.intent.category.DEFAULT") + intent.data = Uri.parse("package:$packageName") + startActivity(intent) + } catch (e: Exception) { + val intent = Intent(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION) + startActivity(intent) + } + } + } else { + // Android 10 以下請求傳統讀寫權限 + if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { + ActivityCompat.requestPermissions( + this, + arrayOf( + Manifest.permission.READ_EXTERNAL_STORAGE, + Manifest.permission.WRITE_EXTERNAL_STORAGE + ), + 1001 + ) + } + } + } } @Composable @@ -82,4 +123,4 @@ private fun BottomBar(navController: NavHostController) { ) } } -} +} \ No newline at end of file