- 문제점 :
공유 기능을 만들었는데
공유를 하더라도 똑같은 사진이 공유되는 현상이 일어났다.
- 레이아웃 :
- 코드:
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();//rootViewrootView.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 - [나의 일기] - 코인 (계산기+정보+포트폴리오) 어플리케이션