不使用相机应用程序拍照 - Android

时间:2016-02-18 05:40:16

标签: java android camera

我理解如何使用意图捕获图像并使用意图启动相机应用程序,但我想知道如何按以下步骤执行此操作:

  1. 显示用于向用户预览相机的表面视图
  2. 当用户按下捕获时,在屏幕上向用户显示捕获的图像并使用相机预览隐藏表面视图(与Snapchat完全相同的行为)。
  3. NP - 我不希望在此过程中随时启动相机应用程序,我希望在我自己的应用程序中完成所有操作。我当前代码的问题是它在按下捕获按钮时启动了相机应用程序。此外,它不能正确显示拍摄的照片,而是显示白色屏幕。我目前已创建此代码:

    ANDROID ACTIVITY:

    public class CameraScreen extends Activity {
    private Camera mCamera = null;
    private SessionManager session;
    private String rand_img;
    private ImageView preview_pic;
    private CameraPreview mCameraView = null;
    static final int CAM_REQUEST = 1;
    private RandomString randomString = new RandomString(10);
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_camera_screen);
        session = new SessionManager(getApplicationContext());
        try{
            mCamera = Camera.open();//you can use open(int) to use different cameras
        } catch (Exception e){
            Log.d("ERROR", "Failed to get camera: " + e.getMessage());
        }
    
    
        if(mCamera != null) {
            mCameraView = new CameraPreview(this, mCamera);//create a SurfaceView to show camera data
            FrameLayout camera_view = (FrameLayout)findViewById(R.id.camera_view);
            camera_view.addView(mCameraView);//add the SurfaceView to the layout
        }
    
        //btn to close the application
        Button imgClose = (Button)findViewById(R.id.imgClose);
        imgClose.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                System.exit(0);
            }
        });
        //btn to logout
        Button logout = (Button)findViewById(R.id.imgOpen);
        logout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                session.logOut();
                Intent a = new Intent(CameraScreen.this, MainActivity.class);
                startActivity(a);
                finish();
            }
        });
        //CAPTURE BUTTON
        Button snap = (Button) findViewById(R.id.snap);
        snap.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent capture = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                capture.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(getFile()));
                startActivityForResult(capture,CAM_REQUEST);
            }
        });
    }
    
    @Override
    protected void onPause() {
        super.onPause();
        if (mCamera != null) {
            mCamera.setPreviewCallback(null);
            mCameraView.getHolder().removeCallback(mCameraView);
            mCamera.release();
        }
    }
    @Override
    public void onResume() {
        super.onResume();
    
        // Get the Camera instance as the activity achieves full user focus
        if (mCamera == null) {
            initializeCamera(); // Local method to handle camera initialization
        }
    }
    
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        String path = "sdcard/city_life_pic/" + rand_img;
        preview_pic = (ImageView) findViewById(R.id.picturedisplay);
        FrameLayout camera_view = (FrameLayout)findViewById(R.id.camera_view);
        camera_view.setVisibility(View.GONE);
        preview_pic.setVisibility(View.VISIBLE);
        preview_pic.setImageDrawable(Drawable.createFromPath(path));
    }
    
    protected void initializeCamera(){
        // Get an instance of Camera Object
        try{
            mCamera = Camera.open();//you can use open(int) to use different cameras
        } catch (Exception e){
            Log.d("ERROR", "Failed to get camera: " + e.getMessage());
        }
    
    
        if(mCamera != null) {
            mCameraView = new CameraPreview(this, mCamera);//create a SurfaceView to show camera data
            FrameLayout camera_view = (FrameLayout)findViewById(R.id.camera_view);
            camera_view.addView(mCameraView);//add the SurfaceView to the layout
        }
     }
    private File getFile() {
        File folder = new File("sdcard/city_life_pic");
        if (!folder.exists()) {
            folder.mkdir();
        }
        rand_img = randomString.nextString() + ".jpg";
        File image = new File(folder,rand_img);
        return image;
    }
    
    }
    

    CAMERA CLASS:

    public class CameraPreview extends SurfaceView implements  SurfaceHolder.Callback{
    private SurfaceHolder mHolder;
    private Camera mCamera;
    public CameraPreview(Context context, Camera camera){
        super(context);
    
        mCamera = camera;
        mCamera.setDisplayOrientation(90);
        //get the holder and set this class as the callback, so we can get camera data here
        mHolder = getHolder();
        mHolder.addCallback(this);
        mHolder.setType(SurfaceHolder.SURFACE_TYPE_NORMAL);;
    }
    
    @Override
    public void surfaceCreated(SurfaceHolder surfaceHolder) {
        try{
            //when the surface is created, we can set the camera to draw images in this surfaceholder
            mCamera.setPreviewDisplay(surfaceHolder);
            mCamera.startPreview();
        } catch (IOException e) {
            Log.d("ERROR", "Camera error on surfaceCreated " + e.getMessage());
        }
    }
    
    @Override
    public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i2, int i3) {
        //before changing the application orientation, you need to stop the preview, rotate and then start it again
        if(mHolder.getSurface() == null)//check if the surface is ready to receive camera data
            return;
    
        try{
            mCamera.stopPreview();
        } catch (Exception e){
            //this will happen when you are trying the camera if it's not running
        }
    
        //now, recreate the camera preview
        try{
            mCamera.setPreviewDisplay(mHolder);
            mCamera.startPreview();
        } catch (IOException e) {
            Log.d("ERROR", "Camera error on surfaceChanged " + e.getMessage());
        }
    }
    
    @Override
    public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
        //our app has only one screen, so we'll destroy the camera in the surface
        //if you are unsing with more screens, please move this code your activity
        mCamera.stopPreview();
        mCamera.release();
    }
    }
    

1 个答案:

答案 0 :(得分:0)

您正在使用此代码打开设备的相机应用

        Intent a = new Intent(CameraScreen.this, MainActivity.class);
        startActivity(a);
        finish();

相反,要使用自定义相机拍摄照片,请改用<{3}}方法

这会使你的代码

snap.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        mCamera.takePicture(....)       //set parameters based on what you need
    }
});