파일 권한 얻기: 두 판 사이의 차이

redbird's home
둘러보기로 이동 검색으로 이동
(MANAGE_EXTERNAL_STORAGE 파일 권한 얻기)
 
편집 요약 없음
 
(같은 사용자의 중간 판 하나는 보이지 않습니다)
6번째 줄: 6번째 줄:
</source>
</source>


build.gradle.kts
1. Check if permission is already granted
<source lang='xml'>
Before attempting file operations, verify if your app has the special access using Environment.isExternalStorageManager().
buildFeatures {
<source lang='kotlin'>
buildConfig = true
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>
</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.activity.result.contract.ActivityResultContracts
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 {
// Permission denied, handle accordingly (e.g., show a dialog)
Text("앱 사용을 위해 모든 파일 액세스 권한이 필요합니다.")
println("All files access denied.")
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?) {
super.onCreate(savedInstanceState)
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 이하에서는 이 함수를 호출할 필요가 없습니다.
}