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

getcontent, getmultiplecontent 갤러리로 바로접근

0 추천
안드로이드12고, getmultiplecontent, getcontent를 통해 갤러리 접근하려하는데,
바로 갤러리가 아닌 파일저장소라 해야되나..? 거기로 가지는데 바로 갤러리접근이 안되나요?

사용자가 거기서 갤러리를 눌러서 한번 더들어가야 갤러리가 들어가지네요

galleryTest.launch("image/Pictures/*)
이렇게 써줬는데 파일저장소?로 가네요
수원통학러 (2,750 포인트) 님이 9월 16일 질문

1개의 답변

0 추천

GetContent 의 input이 데이터 타입일 겁니다. 개발자 문서에 있는 예제 코드를 참고하세요.

https://developer.android.com/training/basics/intents/result#launch

 

spark (172,410 포인트) 님이 9월 16일 답변
spark님이 9월 16일 수정
한번 봤는데 기존에는 image/*로 쓰고있었는데 똑같이 파일저장소같은곳으로 가버려서요
            val intent = Intent(
                Intent.ACTION_PICK,
                android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI
            )
            intent.type = "image/*"
            galleryContract.launch(intent)
이런식으로도 써봤는데 갤러리 접근은 바로되는데, 여러개 선택하려고
   intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true) 등 쓰면
intent.action, data등에 한번에 여러개선택하려고 써보면 다시 파일저장소같은곳으로
가버립니다
어떻게 해야되는거죠?
코드가 이상하네요. 왜 launch에 custom Intent를 넘기는지 모르겠네요. 그냥 mGetContent.launch("image/*") 하면 끝인데.

public class GalleryContracts extends ActivityResultContract<String, List<Uri>> {

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

    private int requestCode;

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

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

    //  requestCode Getter & Setter 생략
}

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

private GalleryContracts getGalleryContract() {
        return (GalleryContracts) mGetContent.getContract();
    }


private void imageSelected(List<Uri> uris) {
        int requestCode = getGalleryContract().getRequestCode();
         // Do something
}

getGalleryContract().setRequestCode(1000);
mGetContent.launch("image/*");

위의 코드로 테스트해봤고 잘 동작합니다.
RequestCode가 필요없으면 GalleryContracts 대신에 ActivityResultContracts.GetMultipleContents()를 바로 사용하시면 됩니다.

private ActivityResultLauncher<String> mGetContent = registerForActivityResult(new ActivityResultContracts.GetMultipleContents(),
            uris -> {
               imageSelected(uris);
            });
...