[안드로이드] ActivityResultLauncher로 startActivityForResult와 requestPermissions 대체하기

박서현·2021년 6월 3일
0

안드로이드

목록 보기
3/9
post-custom-banner

오랜만에 안드로이드로 다시 돌아왔더니, deprecated된 것이 너무 많다ㅠㅠ 그 덕에 새로운 대체 방법들을 찾아보며 공부를 하게 되었다.

ActivityResultLauncher가 이전과 비교해 달라진 점?

이전과 가장 큰 차이점은 requestCode가 없어졌다는 점이다. 기존에 startActivityForResult를 사용할 때는, 액티비티를 구분하기 위한 requestCode를 int형으로 입력해야 했는데, 새로 대체된 방법에서는 이게 사라졌다.
사실 이전에 requestCode를 설정하는 것이 매우 귀찮았기 때문에 새로운 방법이 꽤 맘에 들었다.

startActivityForResult 대신 ActivityResultLauncher 사용하기

우선 implementation을 해준다.

implementation 'androidx.activity:activity:1.3.0-alpha08'
implementation 'androidx.fragment:fragment:1.4.0-alpha01'

ActivityResultLauncher 사용법은 아래와 같다.
// launcher 선언
ActivityResultLauncher<Intent> launcher;
launcher = registerForActivityResult(new StartActivityForResult(), 
	result -> {
            if (result.getResultCode() == Activity.RESULT_OK) {
                Intent data = result.getData();
                // RESULT_OK일 때 실행할 코드...
            }
        });

// launcher를 이용해서 화면 시작하기
Intent intent = new Intent(WritePostActivity.this, GalleryActivity.class);
launcher.launch(intent);

requestPermissions 대신 ActivityResultLauncher 사용하기

permission을 받기 위해서는 먼저 매니페스트 파일에 명시해야함을 잊지말자.

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-feature android:name="android.hardware.camera2"/>
// scoped storage로 바뀌면서 WRITE_EXTERNAL_STORAGE는 허가받을 필요가 없어졌다.

// 갤러리의 이미지를 다루기 위해서 필요
<provider
     android:authorities="패키지명"
     android:name="androidx.core.content.FileProvider"
     android:exported="false"
     android:grantUriPermissions="true">
     <meta-data
         android:name="android.support.FILE_PROVIDER_PATHS"
         android:resource="@xml/file_path"/>
</provider>

xml/file_path 파일

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path name="my_images" path="Android/data/패키지명"/>
</paths>


사용법은 아래와 같다.

// permissionLauncher 선언
ActivityResultLauncher<String> permissionLauncher;
permissionLauncher = registerForActivityResult(new RequestPermission(), 
	isGranted -> {
                if (isGranted) {
                    // 권한 있는 경우 실행할 코드...

                } else {
                    new AlertDialog.Builder(WritePostActivity.this)
                            .setTitle("미디어 접근 권한")
                            .setMessage("미디어를 첨부하시려면, 앱 접근 권한을 허용해 주세요.")
                            .setPositiveButton("확인", new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    Intent intent = new Intent();
                                    intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                                    Uri uri = Uri.fromParts("package",
                                            BuildConfig.APPLICATION_ID, null);
                                    intent.setData(uri);
                                    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                                    startActivity(intent);
                                }
                            })
                            .create()
                            .show();
                }
        });
            
// 앨범 버튼 눌렀을 때 권한 확인하고 요청하기
btn_gallery.setOnClickListener(v -> {
            if (ContextCompat.checkSelfPermission(WritePostActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
                // 권한 있는 경우 실행할 코드...

            } else {
                // 권한 없는 경우, 권한 요청
                permissionLauncher.launch(Manifest.permission.READ_EXTERNAL_STORAGE);
            }

        });

안드로이드 공식 문서를 많이 참고했다.
아래 링크를 눌러 공식 문서를 확인해보자.

앱 권한 요청

profile
차곡차곡 쌓아가기
post-custom-banner

0개의 댓글