Android 공부

(Solve) Android Studio Duplicate photos on sharing

- 문제점 : 

공유 기능을 만들었는데

공유를 하더라도 똑같은 사진이 공유되는 현상이 일어났다.


- 레이아웃 :


- 코드:


private Bitmap captureView;
private View rootView;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    ...

...

//리사이클러뷰를 사용하기 위함, 공유기능만 보기 위해서는 share_menuTV의 리스너를 봐야함.
diaryContentRV.setLayoutManager(linearLayoutManager);
diaryContentRV.setAdapter(diaryDetailRecyclerAdapter);
diaryContentRV.scrollToPosition(currentPos);
diaryContentRV.setHasFixedSize(true);
diaryContentRV.setItemViewCacheSize(4);
diaryContentRV.setDrawingCacheEnabled(true);

diaryContentRV.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);


share_menuTV.setOnClickListener(view -> {
checkPermissions();
if (rootView != null) {//rootView는 공유하려는 View객체 null값 체크를 한 것은 이미 있다는 것은 한 번 실행했다는 것이고 기존 비트맵과 파일을 지운다.

File file = new File(bitmapUri.getPath());//파일 객체를 만든다.

file.delete();//파일을 삭제

rootView.setDrawingCacheEnabled(false);//루트뷰의 캐시를 못하게 한다.


rootView.destroyDrawingCache();//비트맵 객체를 삭제한다.

rootView.invalidate();//비트맵을 최신화한다.


rootView = null;//비트맵을 널 값으로 처리


captureView.eraseColor(Color.TRANSPARENT);//captureView는 비트맵 객체 캡쳐를 하려는 대상 layout영역, 투명으로 처리해서 null로


captureView.recycle();//리사이클을 해서 캐시를 삭제

captureView = null;//null값으로

}


rootView = findViewById(android.R.id.content).getRootView();
rootView.setDrawingCacheEnabled(true);//캐시를 가져올 수 있도록 한다.

rootView.buildDrawingCache();//캐시를 가져온다.


captureView = Bitmap.createBitmap(rootView.getDrawingCache());//비트맵을 객체로 만든다.


Intent share = new Intent(Intent.ACTION_SEND);//공유 인텐트

share.setType("image/jpeg");//이미지 파일


ContentValues values = new ContentValues();//콘텐트 밸류로 파일을 만들기 위한 변수를 쌓는다.

values.put(MediaStore.Images.Media.TITLE, "title");//이름

values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");//종류


bitmapUri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);//insert해서 파일 생성



OutputStream outstream;
//captureView에 넣을 스트림

try {
rootView.invalidate();//rootView

rootView.setDrawingCacheEnabled(true);//가져오려는 뷰의 캐시를 사용할 수 있게 한다.
rootView.buildDrawingCache();//캐시 객체 생성
outstream = getContentResolver().openOutputStream(
bitmapUri);//위에서 만든 bitmapUri를 스트림으로 가져온다.
captureView.compress(Bitmap.CompressFormat.JPEG, 100, outstream);//위에서 만든 stream을 통해 bitmap을 그려준다.
outstream.close();
//스트림을 닫는다.
}
catch (Exception e) {
Log.
d("error",e.toString());
}

Intent shareIntent =
new Intent(); //다른 앱에 넘길 인텐트를 만든다.
shareIntent.setAction(Intent.
ACTION_SEND);//ACTION_SEND 기능
shareIntent.putExtra(Intent.
EXTRA_STREAM, bitmapUri);//bitmapUri를 STREAM으로 보낸다.
shareIntent.setType(
"image/jpeg");//해당 인텐트 파일은 image/jpeg
startActivity(Intent.
createChooser(shareIntent, "Share Image"));//앱 선택 인텐트의 제목을 Share Image와 인텐트들을 담는다.
});

}



코드 분석을 했을 때,

초점을 둔 곳은 bitmap 객체를 만드는 것에서

캐시가 삭제되지 않아서

bitmap 캐시를 삭제하는 로직을 이것 저것 찾아봤다.


하지만, 문제는 그곳이 아니라 다른 곳이었다.

공유하려고 하는 것은 리사이클러뷰 아이템 중 하나를

공유하려고 했다.


리사이클러뷰 셋팅 과정 중에서


diaryContentRV.setDrawingCacheEnabled(true);


라는 코드가 있었고 이것을 주석처리 하게 되니

중복된 이미지를 보내는 일이 없어졌다.




1인 개발자를 도와주세여!

다이어리 어플리케이션과 코인 계산기 어플리케이션!!

많이 사용해주시면 감사합니다.

2018/07/15 - [나의 일기] - #담아두다 #일상 #다이어리 #어플리케이션

2018/07/16 - [나의 일기] - 코인 (계산기+정보+포트폴리오) 어플리케이션