반응형

프로그래밍/안드로이드+코틀린

반응형
반응형

원래 대로라면 sqlite3에서 BLOB로 데이터 송수신을 해야 하는데, BLOB가 byte[]형식이다 보니 다시 drawable로 고치는 문제나, BLOB데이터를 읽으려고 해당 뷰로 전환을 하면 'ConnectionResetError: [WinError 10054] 현재 연결은 원격 호스트에 의해 강제로 끊겼습니다"와 같은 에러가 뜨는 등, 이 부분에 막혀서 다른 방법을 강구했다.

 

그래서 찾은 방법 BLOB형식으로 직접 저장하지 말고, google drive에 사진을 저장 후 그 주소에서 사진을 받아 어플리케이션에서 보여주라는 것이다. 그래서 위에 BLOB가 들어가는 부분은 text형식으로 주소가 들어가게 된다.

 


먼저 구글 드라이브에 사진을 올려줍니다.

 

이렇게 올려주시면 됩니다.

그리고 이미지 작업을 할 곳에 AsyncTask로 클래스를 만들어줍니다. 코드는 다음과 같습니다.

 private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
        ImageView bmImage;

        public DownloadImageTask(ImageView bmImage) {
            this.bmImage = bmImage;
        }

        protected Bitmap doInBackground(String... urls) {
            String urldisplay = urls[0];
            Bitmap mIcon11 = null;
            try {
                InputStream in = new java.net.URL(urldisplay).openStream();
                mIcon11 = BitmapFactory.decodeStream(in);
            } catch (Exception e) {
                Log.e("Error", e.getMessage());
                e.printStackTrace();
            }
            return mIcon11;
        }

        protected void onPostExecute(Bitmap result) {
            bmImage.setImageBitmap(result);
        }
    }

여기서 AsyncTask를 사용해야 하는 이유는, AsyncTask를 사용하지 않으면 "android.os.NetworkOnMainThreadException"오류가 뜨게 됩니다. 한 Thread에서 여러 작업을 하다 보니 오류가 뜨는 것이라고 합니다.(저도 Thread라는 개념을 오늘 처음 배워서..ㅋㅋ) 잘은 모르지만 Thread는 직역하면 실이라는 뜻인데, 어플리케이션은 한 Thread에서 작동되고 있습니다. Thread가 실행되는 중에 다른 곳(예를 들면 이 게시물에서는 사진이 담긴 url)에 접속하게 된다면 실행되고 있던 앱Thread가 종료되는 것 같습니다. 혹시 제 설명이 틀린 부분이 있다면 댓글로 알려주세요.

 그래서 AsyncTask를 사용해서 MultiThread로 해주셔야 합니다.  doInBackground가 실행되고 있는 Thread 뒤에서 작업하는 것으로 MultiThread를 해주고 있습니다. 

 

 여기까지는 설명이 많이 있었는데, 이 이후에 직접 사용하는 법을 적어놓은 곳을 찾지 못해서 찾는데 좀 걸렸습니다.

 

Bitmap bitmap;
ImageView imageView = findViewById(R.id.tempimageview);
DownloadImageTask downloadImageTask = new DownloadImageTask(imageView);
bitmap = downloadImageTask.execute("https://drive.google.com/uc?export=download&id=19yCen5ZnT4z9xmJO3CljEoiKkGDuS5K6").get();
drawable = new BitmapDrawable(bitmap);

위와 같이 쓰고 싶은 위치에서 사용하시면 됩니다. 

 

그런데 여기서 중요한 점이 구글 드라이브의 url을 그대로 가져다 쓰시면 안됩니다.

구글 드라이브에서 이미지 url을 가져올 때 아래와 같이 이미지에 우클릭을 한 후 공유 가능한 링크 가져오기를 합니다.

위 "공유 가능한 링크 가져오기"클릭 후,

 

여기서 링크 복사해서 그대로 가져다 넣으시면 안됩니다.

 

아래 사이트로 이동하셔서 아래 사진 처럼 해주시면 됩니다.

먼저 위에서 복사 했던 주소를 위 칸에다 입력하시고 아래에 초록색 박스를 클릭합니다. 그러면 "결과값 복사"라고 되어 있는 부분에 새로운 주소가 뜨는데 해당 주소로 하셔야 안드로이드 스튜디오에서 정상적으로 뜹니다. 바뀐 주소로 하지 않고 기존 주소로 하면 뜨지 않는 것을 확인했습니다.

 

[url 변경 사이트로 이동]

 

끝까지 읽어주셔서 감사합니다.

궁금한 점이나 지적 있으시면 댓글로 남겨주세요. 댓글이 달리면 저에게 알림이 와서 바로 확인할 수 있으니 최대한 빠른 시일 내에 답변 드리도록 하겠습니다.

반응형

+ Recent posts