loading

프로그래밍/안드로이드

[Android Studio] exposed beyond app through clipdata.item.geturi() 에러 해결 방법

침착곰 2021. 4. 29. 15:19
반응형

안녕하세요

안드로이드 스튜디오[Android Studio]에서 작업을 하는 중에 exposed beyond app through clipdata.item.geturi() 에러가 나타나서 그 해결방법에 대해서 알아보겠습니다

 

에러 캡쳐

밑에는 에러 전문입니다

 


에러 원인

이 에러가 발생한 원인은 프로젝트 진행 중 카메라로 사진을 찍는 경우 파일로 전환해 서버에 전송하는 로직을 구현하는 중에 생긴 에러였습니다

파일을 생성하는데 경로가 file://URI로 생성되서 생기는 원인이었습니다

구글링을 검색한 자세한 내용입니다

Android 7.0 부터 API정책의 변경

안드로이드 7.0 (누가) 부터 앱사이의 공유가 더 엄격해져서 file:// URI 가 직접 노출되지 않도록 content:// URI를 보내고 이에 대해서 임시 액세스 권한을 부여하는 방식으로 변경되었다고 합니다. 

이에 대한 자세한 설명은 밑에 공식참고문서(구글번역기로 번역된 글입니다)를 보시됩니다.

출처 : kyome.tistory.com/9

 


해결 방법

다른 글을 확인해보니 AndroidManifest.xml를 수정해서 해결하는 방법이 많았습니다

저는 file의 경로를 fix해서 해결했습니다 

밑에는 해결한 소스입니다

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    switch (requestCode) {
        case CAPTURE_CODE:
            // 사진 선택
            if (resultCode == Activity.RESULT_OK) {
                try {
                    // 현재시간으로 파일명 지정
                    long now = System.currentTimeMillis();
                    Date mDate = new Date(now);
                    SimpleDateFormat simpleDate = new SimpleDateFormat("yyyy-MM-dd_hh:mm");
                    String getTime = simpleDate.format(mDate);

                    // 카메라로 찍은 데이터를 bitmap으로 받는다
                    Bitmap bitmap = (Bitmap) data.getExtras().get("data");

                    // 파일경로 Fix
                    STATICDATA.IMG_DIR = Environment.getExternalStorageDirectory() + "/tmp";

                    // 파일 선언
                    destFile = new File(STATICDATA.IMG_DIR, getTime + ".jpg");

                    // OutputStream 선언
                    OutputStream out = null;
                    destFile.createNewFile();
                    out = new FileOutputStream(destFile);

                    // bitmap의 데이터를 file에 넣는다
                    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);

                    // 이미지 전송
                    SendImage();
                } catch (Exception e) {
                    // 대기메시지 종료
                    activity.progressDismiss();
                }
            }
            // 사진 선택 취소
            else if (resultCode == activity.RESULT_CANCELED) {
                Toast.makeText(activity, "사진 선택 취소", Toast.LENGTH_LONG).show();
            }
            break;
    }
}

 

여기까지 위의 에러를 해결한 방법이었습니다

안드로이드를 개발하는 분들이 제 해결방법이 참고가 되셨으면 좋겠습니다

반응형
그리드형