ActivityResultLauncher

김영호·2021년 9월 26일
0

안드로이드

목록 보기
1/2
post-thumbnail
// public static final class ContractType extends ActivityResultContract<I, O>
ActivityResultLauncher<I> launcher = appCompatActivity.registerForActivityResult(
                new ActivityResultContracts.ContractType(),
                result -> { // Type O

                }
        );
        
I param;
launcher.launch(param);

ActivityResultContract<I, O>
I : launch시에 param type
O : activity result의 result type

registerForActivityResult(
액티비티 타입,
result callback
)

// Permission Get
// public static final class RequestPermission extends ActivityResultContract<String, Boolean>
ActivityResultLauncher<String> permissionLauncher = appCompatActivity.registerForActivityResult(
                new ActivityResultContracts.RequestPermission(),
                isGranted -> {
                    if(isGranted) {
                        // Permission Granted
                    } else {
                       // Permission Denied
                    }
                }
        );
        
permissionLauncher.launch(Manifest.permission.PERMISSION_TYPE);

퍼미션을 받아오는 launcher Manifest.permission 안에 있는 Permission을 param으로 넘겨줘야 한다

// Camera
// public static class TakePicture extends ActivityResultContract<Uri, Boolean>

file = new File(appCompatActivity.getFilesDir(), "picFromCamera");
uri = FileProvider.getUriForFile(
            appCompatActivity,
            "pakage.path.provider",
            file
    );

ActivityResultLauncher<Uri> cameraActivityLauncher = = appCompatActivity.registerForActivityResult(
                new ActivityResultContracts.TakePicture(),
                isSuccess -> {
                    if(isSuccess && uri != null) {
                        
                    }
                }
        );
        
// If CAMERA Permission Denied -> Throw SecurityException
cameraActivityLauncher.launch(uri)

/*
[AndroidManifest.xml]
<provider
            android:name="androidx.core.content.FileProvider"
            android:authorities="pakage.path.provider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/provider_paths_app" />
</provider>

[@xml/provider_paths_app]
        <?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <files-path
        name="appName"
        path="." />
</paths>
*/

Camera는 Uri를 param으로 주면 그 Uri에 사용자가 찍은 사진이 들어온다
file에 대한 provider 가 필요하기 때문에 위와 같은 세팅이 필요하다
카메라가 launch 될 때 CAMERA 퍼미션이 없으면 SecurityException이 발생한다 -> 퍼미션 launch를 해준 뒤 다시 시도 해야 한다.

// Pick Image
// public static class GetContent extends ActivityResultContract<String, Uri>
ActivityResultLauncher<String> pickImageActivityLauncher = appCompatActivity.registerForActivityResult(
                new ActivityResultContracts.GetContent(),
                uri -> {
                    if (uri != null) {
                        
                    }
                }
        );

pickImageActivityLauncher.launch("image/*");

launch 의 param으로 받아올 이미지의 MIME Type을 줘야 한다

// Pick Images
// public static class GetMultipleContents extends ActivityResultContract<String, List<Uri>>
ActivityResultLauncher<String> launcher = appCompatActivity.registerForActivityResult(
                new ActivityResultContracts.GetMultipleContents(),
                result ->{
               	    if(result) {
                    	for(Uri image : result)
                    }
                }
        );
        
launcher.launch("image/*");

launch 의 param으로 받아올 이미지의 MIME Type을 줘야 한다
result 에는 Uri List가 온다

profile
공부하는 개발자

0개의 댓글

관련 채용 정보