From f4b2513182147d66169c08855a5fc25c5b8b69e4 Mon Sep 17 00:00:00 2001 From: NkBe Date: Fri, 5 Dec 2025 23:51:24 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=9B=B4=E4=B8=A5=E6=A0=BC=E7=9A=84?= =?UTF-8?q?=E6=9D=83=E9=99=90=E6=A3=80=E6=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Android 11 及以上: 檢查 Environment.isExternalStorageManager(),如果沒有權限,則跳轉到「所有檔案存取權」設定頁面 。 Android 10 及以下: 檢查並請求 WRITE_EXTERNAL_STORAGE 和 READ_EXTERNAL_STORAGE 權限 。 --- .../npatch/ui/activity/MainActivity.kt | 43 ++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) 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