[Android] 레이아웃을 이미지로 만들어서 공유하기 Layout to Image share

하나의 화면 자체를 공유하고 싶을때 사용합니다.

작동 원리는 레이아웃을 스크린샷 형태로 갤러리에 저장한 뒤에 그 uri을 가져와서 공유하는 방식입니다.

 

일단 LayoutToImage 클래스를 복붙 합니다!

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
public class LayoutToImage {
 
    public interface SaveImageCallback{
        void imageResult(int status, Uri uri);
    }
 
    SaveImageCallback saveImageCallback;
 
    public void setSaveImageCallback(SaveImageCallback saveImageCallback) {
        this.saveImageCallback = saveImageCallback;
    }
 
    public void saveBitMap(Context context, View drawView) {
        File pictureFileDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), context.getString(R.string.app_name));
        if (!pictureFileDir.exists()) {
            boolean isDirectoryCreated = pictureFileDir.mkdirs();
            if (!isDirectoryCreated) {
                if(saveImageCallback != null){
                    saveImageCallback.imageResult(400null);
                }
                return;
            }
        }
        String filename = pictureFileDir.getPath() + File.separator + System.currentTimeMillis() + ".jpg";
        File pictureFile = new File(filename);
        Bitmap bitmap = getBitmapFromView(drawView);
        try {
            pictureFile.createNewFile();
            FileOutputStream oStream = new FileOutputStream(pictureFile);
            bitmap.compress(Bitmap.CompressFormat.PNG, 100, oStream);
            oStream.flush();
            oStream.close();
        } catch (IOException e) {
            if(saveImageCallback != null){
                saveImageCallback.imageResult(400null);
            }
        }
        scanGallery(context, pictureFile.getAbsolutePath());
    }
 
    //create bitmap from view and returns it
    private Bitmap getBitmapFromView(View view) {
        //Define a bitmap with the same size as the view
        Bitmap returnedBitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888);
        //Bind a canvas to it
        Canvas canvas = new Canvas(returnedBitmap);
        //Get the view's background
        Drawable bgDrawable = view.getBackground();
        if (bgDrawable != null) {
            //has background drawable, then draw it on the canvas
            bgDrawable.draw(canvas);
        } else {
            //does not have background drawable, then draw white background on the canvas
            canvas.drawColor(Color.WHITE);
        }
        // draw the view on the canvas
        view.draw(canvas);
        //return the bitmap
        return returnedBitmap;
    }
 
    // used for scanning gallery
    private void scanGallery(Context context, String path) {
        try {
            MediaScannerConnection.scanFile(context, new String[]{path}, nullnew MediaScannerConnection.OnScanCompletedListener() {
                public void onScanCompleted(String path, Uri uri) {
                    if(saveImageCallback != null){
                        saveImageCallback.imageResult(200, uri);
                    }
 
                }
            });
        } catch (Exception e) {
            if(saveImageCallback != null){
                saveImageCallback.imageResult(400null);
            }
        }
    }
}
 
 

 

사용할 액티비티에서 임플리먼트를 해주신 다음에 sharedImage 함수를 만들고 콜백 함수에 담아줍니다.

 

1
implements LayoutToImage.SaveImageCallback
 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@Override
    public void imageResult(int status, Uri uri) {
        switch (status) {
            case 200:
                shareIamge(uri);
                break;
            case 400:
                break;
 
        }
    }
 
    private void shareIamge(Uri uri) {
        Intent intent = new Intent(Intent.ACTION_SEND);
        intent.setType("image/*");
        intent.putExtra(Intent.EXTRA_STREAM, uri);
        startActivity(intent.createChooser(intent, "Share Image"));
 
   }
 

 

마지막으로 사용할 곳에서 적어주시면 끄읕!

저는 카드뷰 레이아웃을 공유하였습니다.

 

1
2
3
LayoutToImage layoutToImage = new LayoutToImage();
layoutToImage.setSaveImageCallback(this);
layoutToImage.saveBitMap(this, cardView);
 

댓글