파일 권한 얻기: 두 판 사이의 차이
둘러보기로 이동
검색으로 이동
편집 요약 없음 |
편집 요약 없음 |
||
| 13번째 줄: | 13번째 줄: | ||
</source> |
</source> |
||
1. Check if permission is already granted |
|||
Before attempting file operations, verify if your app has the special access using Environment.isExternalStorageManager(). |
|||
<source lang='kotlin'> |
|||
import android.os.Environment |
|||
import android.os.Build |
|||
private fun hasAllFilesAccess(): Boolean { |
|||
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { // R is API 30 (Android 11) |
|||
Environment.isExternalStorageManager() |
|||
} else { |
|||
// For devices below Android 11, traditional permissions apply |
|||
// You would check READ/WRITE_EXTERNAL_STORAGE here |
|||
true // Or implement a check for the older permissions |
|||
} |
|||
} |
|||
</source> |
|||
2. Request the permission |
|||
If access is not granted, launch an intent to the system settings page where the user can manually enable the permission for your app. |
|||
<source lang='kotlin'> |
<source lang='kotlin'> |
||
import android.content.Intent |
import android.content.Intent |
||
import android.net.Uri |
import android.net.Uri |
||
import android.os.Build |
|||
import android.os.Environment |
|||
import android.provider.Settings |
import android.provider.Settings |
||
import androidx. |
import androidx.compose.foundation.layout.* |
||
import androidx.compose.material3.Button |
|||
import androidx.compose.material3.Text |
|||
import androidx.compose.runtime.* |
|||
import androidx.compose.ui.Alignment |
|||
import androidx.compose.ui.Modifier |
|||
import androidx.compose.ui.platform.LocalContext |
|||
import androidx.compose.ui.unit.dp |
|||
@Composable |
|||
// Register an Activity Result Launcher to handle the result when the user returns from settings |
|||
fun ManageAllFilesPermissionScreen() { |
|||
private val storagePermissionResultLauncher = |
|||
val context = LocalContext.current |
|||
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> |
|||
var hasPermission by remember { mutableStateOf(checkAllFilesPermission(context)) } |
|||
// When the user returns from the settings screen, check the permission status again |
|||
if (hasAllFilesAccess()) { |
|||
// 권한 상태를 주기적으로 확인할 수 있는 효과 |
|||
// Permission granted, proceed with your file operations |
|||
LaunchedEffect(Unit) { |
|||
println("All files access granted!") |
|||
while (true) { |
|||
hasPermission = checkAllFilesPermission(context) |
|||
kotlinx.coroutines.delay(1000) // 1초마다 확인 |
|||
} |
|||
} |
|||
Column( |
|||
modifier = Modifier |
|||
.fillMaxSize() |
|||
.padding(16.dp), |
|||
verticalArrangement = Arrangement.Center, |
|||
horizontalAlignment = Alignment.CenterHorizontally |
|||
) { |
|||
if (hasPermission) { |
|||
Text("모든 파일 액세스 권한이 부여되었습니다.") |
|||
} else { |
} else { |
||
Text("앱 사용을 위해 모든 파일 액세스 권한이 필요합니다.") |
|||
Spacer(modifier = Modifier.height(16.dp)) |
|||
Button(onClick = { |
|||
requestAllFilesPermission(context) |
|||
}) { |
|||
Text("권한 설정으로 이동") |
|||
} |
|||
} |
} |
||
} |
} |
||
} |
|||
// 권한 부여 여부 확인 |
|||
private fun requestAllFilesAccess() { |
|||
fun checkAllFilesPermission(context: android.content.Context): Boolean { |
|||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { |
|||
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { // Android 11 (API 30) 이상 |
|||
val intent = Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION) |
|||
Environment.isExternalStorageManager() |
|||
val uri = Uri.fromParts("package", packageName, null) |
|||
} else { |
|||
intent.data = uri |
|||
// Android 10 이하에서는 일반 READ/WRITE 권한으로 충분합니다. |
|||
storagePermissionResultLauncher.launch(intent) |
|||
// 여기서는 예시를 위해 항상 true를 반환하거나 다른 권한 확인 로직을 추가할 수 있습니다. |
|||
true |
|||
} |
} |
||
// No runtime request needed for versions below Android 11 |
|||
} |
} |
||
</source> |
|||
// 사용자에게 권한 요청 (설정 화면으로 이동) |
|||
fun requestAllFilesPermission(context: android.content.Context) { |
|||
3. Integrate into your Activity |
|||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { // Android 11 (API 30) 이상 |
|||
Call these functions within your Activity (e.g., in onCreate or when a specific button is clicked): |
|||
val intent = Intent( |
|||
<source lang='kotlin'> |
|||
Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION, |
|||
class MainActivity : AppCompatActivity() { |
|||
Uri.parse("package:${context.packageName}") |
|||
) |
|||
override fun onCreate(savedInstanceState: Bundle?) { |
|||
context.startActivity(intent) |
|||
setContentView(R.layout.activity_main) |
|||
if (!hasAllFilesAccess()) { |
|||
requestAllFilesAccess() |
|||
} else { |
|||
// Permission already granted, perform file operations |
|||
} |
|||
} |
} |
||
// Android 10 이하에서는 이 함수를 호출할 필요가 없습니다. |
|||
// ... include hasAllFilesAccess() and requestAllFilesAccess() functions here ... |
|||
} |
} |
||
</source> |
</source> |
||
2026년 1월 8일 (목) 12:42 기준 최신판
파일 권한 얻기
AndroidManifest.xml
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
build.gradle.kts
buildFeatures {
buildConfig = true
}
import android.content.Intent
import android.net.Uri
import android.os.Build
import android.os.Environment
import android.provider.Settings
import androidx.compose.foundation.layout.*
import androidx.compose.material3.Button
import androidx.compose.material3.Text
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.unit.dp
@Composable
fun ManageAllFilesPermissionScreen() {
val context = LocalContext.current
var hasPermission by remember { mutableStateOf(checkAllFilesPermission(context)) }
// 권한 상태를 주기적으로 확인할 수 있는 효과
LaunchedEffect(Unit) {
while (true) {
hasPermission = checkAllFilesPermission(context)
kotlinx.coroutines.delay(1000) // 1초마다 확인
}
}
Column(
modifier = Modifier
.fillMaxSize()
.padding(16.dp),
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally
) {
if (hasPermission) {
Text("모든 파일 액세스 권한이 부여되었습니다.")
} else {
Text("앱 사용을 위해 모든 파일 액세스 권한이 필요합니다.")
Spacer(modifier = Modifier.height(16.dp))
Button(onClick = {
requestAllFilesPermission(context)
}) {
Text("권한 설정으로 이동")
}
}
}
}
// 권한 부여 여부 확인
fun checkAllFilesPermission(context: android.content.Context): Boolean {
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { // Android 11 (API 30) 이상
Environment.isExternalStorageManager()
} else {
// Android 10 이하에서는 일반 READ/WRITE 권한으로 충분합니다.
// 여기서는 예시를 위해 항상 true를 반환하거나 다른 권한 확인 로직을 추가할 수 있습니다.
true
}
}
// 사용자에게 권한 요청 (설정 화면으로 이동)
fun requestAllFilesPermission(context: android.content.Context) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { // Android 11 (API 30) 이상
val intent = Intent(
Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION,
Uri.parse("package:${context.packageName}")
)
context.startActivity(intent)
}
// Android 10 이하에서는 이 함수를 호출할 필요가 없습니다.
}