Open philipy355 opened 8 months ago
manifest 권한
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" /> <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
Composable PermissionRequestScreen, HomeScreen
HomeScreen
@Composable fun PermissionRequestScreen(onClick: () -> Unit){ Column( modifier = Modifier.fillMaxSize(), verticalArrangement = Arrangement.Center, horizontalAlignment = Alignment.CenterHorizontally ) { Text("권한이 허용되지 않았습니다") Button( onClick = onClick ){ Text("권한 요청") } } } @OptIn(ExperimentalPagerApi::class) @Composable fun HomeScreen(photoUris: List<Uri>){ val pagerState = rememberPagerState() Column( modifier = Modifier.fillMaxSize() ) { HorizontalPager( state = pagerState, count = photoUris.size, modifier = Modifier .weight(1f) .padding(16.dp) .fillMaxSize() ) {pageIndex -> Card( modifier = Modifier .graphicsLayer { val pageOffset = calculateCurrentOffsetForPage(pageIndex).absoluteValue lerp( start = 0.85f, stop = 1f, fraction = 1f - pageOffset.coerceIn(0f, 1f), ).also { scale -> scaleX = scale scaleY = scale } alpha = lerp( start = 0.5f, stop = 1f, fraction = 1f - pageOffset.coerceIn(0f, 1f), ) } ) { Image( painter = rememberImagePainter( data = photoUris[pageIndex] ), contentDescription = null, modifier = Modifier.fillMaxSize(), contentScale = ContentScale.Crop ) } } HorizontalPagerIndicator( pagerState = pagerState, modifier = Modifier .align(Alignment.CenterHorizontally) .padding(16.dp), ) } } private fun lerp(start: Float, stop: Float, fraction: Float): Float = (1 - fraction) * start + fraction * stop
MainActivity
class MainActivity : ComponentActivity() { @RequiresApi(Build.VERSION_CODES.O) @OptIn(ExperimentalMaterial3Api::class, ExperimentalComposeUiApi::class) @SuppressLint("UnusedMaterial3ScaffoldPaddingParameter", "UnusedMaterialScaffoldPaddingParameter" ) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { val viewModel = viewModel<MainViewModel>() var granted by remember { mutableStateOf(false)} val launcher = rememberLauncherForActivityResult(ActivityResultContracts.RequestPermission()){ isGranted -> granted = isGranted } if(Build.VERSION.SDK_INT>= Build.VERSION_CODES.TIRAMISU) { if(ContextCompat.checkSelfPermission(this@MainActivity, Manifest.permission.READ_MEDIA_IMAGES,) == PackageManager.PERMISSION_GRANTED){ granted = true } } else{ if(ContextCompat.checkSelfPermission(this@MainActivity, Manifest.permission.READ_EXTERNAL_STORAGE,) == PackageManager.PERMISSION_GRANTED){ granted = true } } if(granted){ //Text("권한 허용 됨") viewModel.fetchPhotos() HomeScreen(photoUris = viewModel.photoUris.value) }else{ PermissionRequestScreen { if(Build.VERSION.SDK_INT>= Build.VERSION_CODES.TIRAMISU) { launcher.launch(Manifest.permission.READ_MEDIA_IMAGES) } else{ launcher.launch(Manifest.permission.READ_EXTERNAL_STORAGE) } } } } } }
MainViewModel
class MainViewModel(application: Application) : AndroidViewModel(application){ private val _photoUris = mutableStateOf(emptyList<Uri>()) val photoUris: State<List<Uri>> = _photoUris @RequiresApi(Build.VERSION_CODES.O) fun fetchALLPhotos(){ val uris = mutableListOf<Uri>() getApplication<Application>().contentResolver.query( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, null, null, null, "${MediaStore.Images.ImageColumns.DATE_TAKEN} DESC" )?.use {cursor -> val idIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID) while(cursor.moveToNext()){ val id = cursor.getLong(idIndex) val contentUri = ContentUris.withAppendedId( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, id, ) uris.add(contentUri) } } _photoUris.value = uris Log.d("MainViewModel", "Fetched URIs: $uris") } @RequiresApi(Build.VERSION_CODES.O) fun fetchPhotos() { val uris = mutableListOf<Uri>() getApplication<Application>().contentResolver.query( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, null, null, null, "${MediaStore.Images.ImageColumns.DATE_TAKEN} DESC" )?.use { cursor -> val idIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID) var count = 0 while (cursor.moveToNext() && count < 5) { // 최대 5개의 이미지만 로드 val id = cursor.getLong(idIndex) val contentUri = ContentUris.withAppendedId( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, id, ) uris.add(contentUri) count++ // 이미지 카운트 증가 } } _photoUris.value = uris } }
manifest 권한
Composable PermissionRequestScreen,
HomeScreen
MainActivity
MainViewModel