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

화면 캡쳐시 검은 화면

0 추천
public class MainActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final CameraSurfaceView cameraView = new CameraSurfaceView(getApplicationContext());
        FrameLayout previewFrame = (FrameLayout) findViewById(R.id.previewFrame);
        previewFrame.addView(cameraView);

        Button saveBtn = (Button) findViewById(R.id.saveBtn);
        saveBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View vv) {
                Bitmap bm = Bitmap.createBitmap(viewToBitmap(cameraView));

                if (bm != null) {
                    try {
                        String path = Environment.getExternalStorageDirectory().toString();
                        OutputStream fOut = null;
                        File file = new File(path + "/", "screentest.jpg");
                        fOut = new FileOutputStream(file);

                        bm.compress(Bitmap.CompressFormat.JPEG, 85, fOut);
                        fOut.flush();
                        fOut.close();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        });
    }

    private class CameraSurfaceView extends SurfaceView implements SurfaceHolder.Callback {
        private SurfaceHolder mHolder;
        private Camera camera = null;

        public CameraSurfaceView(Context context) {
            super(context);

            mHolder = getHolder();
            mHolder.addCallback(this);
        }

        public void surfaceCreated(SurfaceHolder holder) {
            camera = Camera.open();

            try {
                camera.setPreviewDisplay(mHolder);
            } catch (Exception e) {
                Log.e("CameraSurfaceView", "Failed to set camera preview.", e);
            }
        }

        public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
            camera.startPreview();
        }

        public void surfaceDestroyed(SurfaceHolder holder) {
            camera.stopPreview();
            camera.release();
            camera = null;
        }
    }

    public static Bitmap viewToBitmap(View view) {
        Bitmap bitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bitmap);

        if (view instanceof SurfaceView) {
            SurfaceView surfaceView = (SurfaceView) view;
            surfaceView.setZOrderOnTop(true);
            surfaceView.draw(canvas);
            surfaceView.setZOrderOnTop(false);
            return bitmap;
        } else{
            view.draw(canvas);
            return bitmap;
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();

        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

카메라 프리뷰 중에 화면 캡쳐시 검은 화면으로 캡쳐 됩니다.

도와주세요...

오드 (120 포인트) 님이 2015년 8월 20일 질문

1개의 답변

0 추천

 camera.setPreviewDisplay(mHolder); 이 의심 스럽습니다.

public void surfaceCreated(SurfaceHolder holder) 에서 생성되어 들어오는 holder 를 사용해야 할 것으로 보입니다.

 camera.setPreviewDisplay(holder); 로 바꿔 테스트 해 보세요

익명사용자 님이 2015년 8월 20일 답변
바꿔서 테스트 해봐도 똑같이 검은 화면이 나옵니다 ㅜㅜ
아 코드를 잘 못 봤네요.  
사진 찍는 코드인줄 알았더니, 카메라를 쓴 상태에서  view화면을 캡쳐하는 것이군요...
surface view의 경우 일반 view와 달리 캡쳐가 안됩니다.

카메라 화면을 캡쳐 하고 싶으시면, takePicture 를 통해 캡쳐 하세요..
takePicture를 사용할수 없는 상황이라 화면 캡쳐를 해야합니다...
갤럭시 폰을 예로들면 홈버튼과 전원버튼을 2초정도 동시에 누르고 있으면
화면이 캡쳐가 되는대 카메라 켠 상태에서 캡쳐 하면 프리뷰 화면까지 캡쳐가 되거든요 그래서 혹시 방법이 없을까요?
안되는 줄 알았더니.. canvas에 그리는 편법이 있었네요..
http://blog.naver.com/pii90/90167897138
링크해주신 소스대로 문의글을 올리기 전에 해봤는대 똑같이 검은 화면이 나왔었습니다.

View captureView = findViewById(R.id.리소스);
Bitmap bm = Bitmap.createBitmap(captureView.drawBitmap());

이 부분에서 저는 captureView를 제 소스의 CameraSurfaceView cameraView를 이용해서 Bitmap bm = Bitmap.createBitmap(cameraView.drawBitmap()); 이런 식으로 했었는대 소스상에 문제가 있었던 걸까요?

링크 속 댓글들도 보면 안된다는 의견이 많고...ㅜㅜ
편법이라 단말 특성 탈수도 있을 듯 합니다.
다른 단말로 해보거나,
링크 주인이 한국 분이니 정중하게 데모소스 요청 드리는게 좋을 듯 합니다.
바쁘실텐데 시간내서 답변해주셔서 감사드립니다.
좋은 하루 되세요^^
...