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

갤러리 파일의 URI를 알고 싶습니다..

0 추천

지금 사진 업로드를 구현 중인데요,

현재 완료된 작업은 사진선택(갤러리) -> 선택한 사진 비트맵 파일에 쓰기 -> 생성된 이미지 파일 서버 전송

입니다.

근데 문제는 갤러리에서 선택한 사진을 일단 내부 파일에 쓰고 나서 서버에 보낸 다는 문제가 있습니다..

만약에 사용자 폰 용량이 부족해서 내부에 파일이 써지지 않는다면 큰일이겠죠..

아래 소스는 새 파일을 스는 소스 입니다.

                String path = rootView.getContext().getFilesDir().getPath();

                FileOutputStream fos = rootView.getContext().openFileOutput("profile.png" , 0);
                bm.compress(Bitmap.CompressFormat.PNG, 100 , fos);
                fos.flush();
                fos.close();
 
                new File(path + "/profile.png")) //이걸 서버에 보냅니다. (일부부만 따온것.)
 
이렇게 profile.png라는 파일스트림을 만들고 사진의 비트맵을 삽입하는 식입니다.
 
이렇게 한 이유는 서버에 전송할때 retrofit 라이브러리를 쓰는데 파일을 보낼때 인자값에 new FIle()을 줘야 합니다.
new File(String fileURI) 여서 file을 생성해야 fileURL를 가져올수 있기 때문에 파일을 생성했습니다..
 
하지만 갤러리의 사진도 결국 폰 내부에 있는 사진파일이니까 URI가 있을거 같은데.. 
이 String URI를 가져오는 방법을 모르겠습니다 ㅠㅠㅠㅠ
 
현재는 아래처럼 되있습니다.
 
AssetFileDescriptor fileDescriptor = rootView.getContext().getContentResolver().openAssetFileDescriptor( data.getData(), "r");
Bitmap resultBitmap = BitmapFactory.decodeFileDescriptor(fileDescriptor.getFileDescriptor(), null, options);
 
요런식으로 파일을 읽어서 비트맵으로 만듭니다..
그리고 만들어진 비트맵을 넘겨서 아까 저~ 위에 있던 소스처럼 앱내부에 파일을 만듭니다..
 
이 파일을 만드는 작업을 빼고 싶습니다
그러기 위해선 AssetFileDescriptor로 읽어드린 파일의 uri를 알아낼 방법이 필여합니당...
 
도와주세용..
cmsypub (820 포인트) 님이 2015년 7월 15일 질문

1개의 답변

0 추천
갤러리에서 사진 선택을 해서 data.getData()로 받아 오는 값이 uri아닌가요?

근데 uri를 알고 싶으시다 하시니 이해가 잘 안가네요.
익명사용자 님이 2015년 7월 15일 답변
data.getData()로 받아오면 media:/content/blah
이런게 받아와지는데 이걸 스트링으로 변환해서 new File()의 인자로 넣었는데 안되서요..
Uri를 알고싶은 이유는 new File의 인자로 넣기위해서입니다.
아 그거는 구글에다가 convert uri realpath 이렇게 키워드로 검색해도 나올텐데..
일단 바로 알려드릴게요. uri 로 realpath 가지고 오는 소스 코드에여.
그리고 Uri는 media:/content/blah 이거구요 단어 선택이 잘못된거같네요.

private String getRealPathFromURI(Uri contentUri) {
        String[] proj = { MediaStore.Images.Media.DATA };

        CursorLoader cursorLoader = new CursorLoader(this, contentUri, proj, null, null, null);
        Cursor cursor = cursorLoader.loadInBackground();

        int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        return cursor.getString(column_index);
}
하....네 맞아요 이겁니다 ㅠㅠㅠㅠㅠㅠㅠㅠㅠ 윽...감사합니다 ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ잘되네요ㅠㅠㅠㅠㅠ
답변 덕분에 해결했으면 채택을 하세요
...