feat: 更严格的权限检查

Android 11 及以上: 檢查 Environment.isExternalStorageManager(),如果沒有權限,則跳轉到「所有檔案存取權」設定頁面 。

Android 10 及以下: 檢查並請求 WRITE_EXTERNAL_STORAGE 和 READ_EXTERNAL_STORAGE 權限 。
This commit is contained in:
NkBe 2025-12-05 23:51:24 +08:00
parent 2d86d32ff2
commit f4b2513182
No known key found for this signature in database
GPG Key ID: 525137026FF031DF
1 changed files with 42 additions and 1 deletions

View File

@ -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