// 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가 온다