마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

registerForActivityResult로 resultcode를 설정하는 방법?

0 추천

안녕하세요, 만들다가 막혔는데 검색으로 해결이 쉽지 않아 질문드립니다.

startActivityForResult가 더 이상 사용되지 않는 걸 알고 나서 registerForActivityResult를 사용했는데요. 갤러리에서 선택한 사진을 보여주는 기능을 만들었습니다. 저는 한 액티비티에 서로 다른 두 개의 사진을 보여주고 싶어서 launch를 할 때 불러온 사진을 구분해줄 requestcode를 집어넣고 싶은데, 다른 분들이 사용하는 putExtra와 getIntExtra로는 받아오지 못하는 것 같았습니다.(계속 default값 유지)

갤러리에서 사진을 골랐을 때 유지되는 requestcode가 있을까요?

resultLauncher = registerForActivityResult(
        new ActivityResultContracts.StartActivityForResult(),
        new ActivityResultCallback<ActivityResult>() {
            @Override
            public void onActivityResult(ActivityResult result) {
                if(result.getResultCode() == RESULT_OK){
                    ImageButton btnImageIngameSs = findViewById(R.id.btn_imageIngameSs);
                    ImageButton btnImageVictorySs = findViewById(R.id.btn_imageVictorySs);

                    Intent intent = result.getData();
                        try{
                            InputStream is = getContentResolver().openInputStream(intent.getData());
                            Bitmap image = BitmapFactory.decodeStream(is);
                            is.close();

                            btnImageIngameSs.setImageBitmap(image);
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                }
            }
        });

아래는 갤러리 진입 코드입니다.

Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
resultLauncher.launch(intent);
Happy Slime (200 포인트) 님이 9월 16일 질문
갤러리, 카메라, 권한 같은 경우는 미리 정의된 클래스가 있습니다.
Gallery의 경우는 GetContent를 사용하시면 됩니다. 개발자 문서에 예제가 나와 있어요.
https://developer.android.com/training/basics/intents/result#launch

1개의 답변

0 추천
 
채택된 답변

굳이 ActivityResultContract를 두개 사용해서 처리하면, requestCode가 필요한지는 모르겠지만, 필요하다면 아래처럼 GetContent를 감싸서 처리해볼 수 있을 것 같은데요.

public class GalleryContracts extends ActivityResultContract<String, Uri> {

    private ActivityResultContract<String, Uri> delegate = new ActivityResultContracts.GetContent();

    private int requestCode;
    
    public GalleryContracts(){
    }

    @NonNull
    @Override
    public Intent createIntent(@NonNull Context context, String s) {
        return delegate.createIntent(context, s);
    }

    @Override
    public Uri parseResult(int i, @Nullable Intent intent) {
        return delegate.parseResult(i, intent);
    }

    public int getRequestCode() {
        return requestCode;
    }

    public void setRequestCode(int requestCode) {
        this.requestCode = requestCode;
    }
}

 

private ActivityResultLauncher<String> mGetContent = registerForActivityResult(new GalleryContracts(),
            result -> {
                 
            });

((GalleryContracts) mGetContent1.getContract()).setRequestCode(1000);
mGetContent.launch("image/*");

 

spark (161,480 포인트) 님이 9월 16일 답변
Happy Slime님이 9월 16일 채택됨
...