java如何将frontcamera添加到SurfaceView并使用它拍照?
你好
我怎样才能像使用“REAL camera”那样将前置摄像头视图添加到SurfaceView
。这是我的代码:
摄像活动。java
**public class CameraActivity extends Activity implements SurfaceHolder.Callback{
Camera camera;
@InjectView(R.id.s)
SurfaceView surfaceView;
@InjectView(R.id.takeaphoto)
ImageView imageView;
SurfaceHolder surfaceHolder;
Camera.PictureCallback callback;
private int cameraId = 0;
Camera.ShutterCallback shutterCallback;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.camera_activity);
ButterKnife.inject(this);
surfaceHolder=surfaceView.getHolder();
surfaceHolder.addCallback(this);
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
cameraImage();
}
});
callback = new 安卓.hardware.Camera.PictureCallback() {
@Override
public void onPictureTaken(byte[] bytes, 安卓.hardware.Camera camera) {
FileOutputStream outputStream=null;
File file_image = getDirc();
SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyymmddhhmms");
String date = simpleDateFormat.format(new Date());
String photo_file="PI_"+date+".jpg";
String file_name = file_image.getAbsolutePath()+"/"+photo_file;
File picfile=new File(file_name);
try {
outputStream=new FileOutputStream(picfile);
outputStream.write(bytes);
outputStream.close();
}catch (FileNotFoundException e){}
catch (IOException ex){}
finally {
}
refreshCamera();
refreshGallery(picfile);
try {
camera.stopPreview();
}catch (Exception e){}
try{
camera.setPreviewDisplay(surfaceHolder);
camera.startPreview();
}catch (Exception e){}
}
};
}
private void refreshGallery(File file){
Intent intent=new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
intent.setData(Uri.fromFile(file));
}
public void refreshCamera(){
if (surfaceHolder.getSurface() == null){
return;
}
}
private File getDirc(){
File dics = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);
return new File(dics ,"Camera");
}
public void cameraImage(){
camera.takePicture(null , null ,callback);
MediaPlayer mediaPlayer = MediaPlayer.create(this , R.raw.sound);
mediaPlayer.start();
}
public void surfaceCreated(SurfaceHolder surfaceHolder ) {
try {
camera = Camera.open(0);
}catch (RuntimeException ex){}
Camera.Parameters parameters;
parameters = camera.getParameters();
parameters.setPreviewFrameRate(60);
parameters.setPreviewSize(1920 , 1080);
parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
camera.setParameters(parameters);
camera.setDisplayOrientation(90);
try {
camera.setPreviewDisplay(surfaceHolder);
camera.startPreview();
}catch (Exception e){
}
}
@Override
public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {
refreshCamera();
}
@Override
public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
camera.stopPreview();
camera.release();
camera=null;
}
public void frontCamera(View view) {
if (cameraId == 0){
try {
camera = Camera.open(1);
}catch (RuntimeException ex){}
try {
camera.setPreviewDisplay(surfaceHolder);
camera.startPreview();
}catch (Exception e){
}
}
else{
try {
camera = Camera.open(0);
}catch (RuntimeException ex){}
try {
camera.setPreviewDisplay(surfaceHolder);
camera.startPreview();
}catch (Exception e){
}
}
}
}**
和XML(如果需要的话):
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:安卓="http://schemas.安卓.com/apk/res/安卓"
xmlns:tools="http://schemas.安卓.com/tools"
安卓:layout_width="match_parent" 安卓:layout_height="match_parent">
<RelativeLayout
安卓:layout_width="match_parent"
安卓:layout_height="match_parent"
安卓:id="@+id/rel">
<SurfaceView
安卓:layout_width="match_parent"
安卓:layout_height="match_parent"
安卓:id="@+id/s">
</SurfaceView>
<RelativeLayout
安卓:layout_width="match_parent"
安卓:id="@+id/rel2"
安卓:background="@color/colorPrimaryDark"
安卓:layout_alignParentBottom="true"
安卓:layout_height="150dp">
<ImageView
安卓:id="@+id/takeaphoto"
安卓:background="@drawable/button_press"
安卓:layout_height="80dp"
安卓:layout_width="80dp"
安卓:layout_centerVertical="true"
安卓:layout_centerHorizontal="true" />
</RelativeLayout>
<RelativeLayout
安卓:layout_width="match_parent"
安卓:layout_height="50dp"
安卓:id="@+id/rel1"
安卓:background="@color/colorPrimaryDark"
安卓:layout_alignParentTop="true"
安卓:layout_alignParentStart="true">
<ImageView
安卓:layout_width="30dp"
安卓:layout_marginEnd="10dp"
安卓:layout_height="wrap_content"
安卓:layout_alignParentRight="true"
安卓:src="@drawable/switchcamera"
安卓:id="@+id/imageView" />
</RelativeLayout>
</RelativeLayout>
</FrameLayout>
更新:现在以这种方式更新了我的代码,但仍然显示错误
An error occurred while connecting to camera: 1
# 1 楼答案
使用此方法获取前置摄像头的id,并将其作为参数传递给
camera.open(int id)
我假设您想通过调用方法frontCamera(View view)
来切换摄像头,我将该方法更改为switchCamera(View view)
,并对您的代码进行编辑,如下所示:祝你好运
# 2 楼答案
修改这一行
摄像头=安卓。硬件照相机open()
到
摄像头=安卓。硬件照相机开放式(1)
注:后凸轮使用id 0,前凸轮使用id 1。通常这对所有的fones都是一样的。所以我不认为每次都能找到id是不必要的