오랜만에 안드로이드로 다시 돌아왔더니, 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'
// 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);
}
});
안드로이드 공식 문서를 많이 참고했다.
아래 링크를 눌러 공식 문서를 확인해보자.