2016-02-18 33 views
0

我明白了如何使用意图和使用意图启动相机应用捕获的图像,但是我想知道如何在下面的步骤进行:拍照不使用摄像头的应用程序 - Android电子

  1. 显示表面视图向用户显示相机预览
  2. 当用户按下捕捉时,在屏幕上向用户显示拍摄的图像并用相机预览隐藏表面视图(与Snapchat完全相同的行为)。

NP - 我不想在这个过程中的任何时候启动相机应用程序,我希望它可以在我自己的应用程序中完成。我当前的代码存在的问题是,当按下捕捉按钮时,它会启动相机应用程序。此外,它不会正确显示拍摄的照片,而是显示白色屏幕。目前,我有这个代码创建:

ANDROID活动:

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类:

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(); 
} 
} 

回答

0

您可以利用此代码

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

而不是打开设备的相机应用,使用您的自定义相机拍摄照片,请使用Camera#takePicture方法代替

这将使你的代码

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