我们来看看android媒体这一块实现照相机的功能,现在很多的做法都是跳到手机系统,获取手机本身的照相功能,但是今天我所讲的是底层的做法。
没什么理论的知识可以讲的,所以直接上代码。
首先就是一个布局xml,布局里面就是一个surfaceView的控件,值了就不粘贴了,直接上java代码。
package com.example.medioplayer;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.PixelFormat;
import android.hardware.Camera;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* Created by Administrator on 2017/2/22.
*/
public class CameraActivity extends AppCompatActivity {
private SurfaceView sf_camera;
private Camera opencamera;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getSupportActionBar().hide();
setContentView(R.layout.activity_camera);
sf_camera = (SurfaceView) findViewById(R.id.sf_camera);
sf_camera.getHolder().addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder holder) {
//打开照相机
opencamera = Camera.open();
//给照相机设置参数
Camera.Parameters paramters= opencamera.getParameters();
//设置输出格式
paramters.setPictureFormat(PixelFormat.JPEG);
//设置照片质量
paramters.set("jpeg-quality",85);//jpeg-quality是固定的值
opencamera.setParameters(paramters);
//将照相机捕捉到的画面给surfaceView
try {
opencamera.setPreviewDisplay(sf_camera.getHolder());
//开启预览
opencamera.startPreview();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
//关闭照相机
}
});
}
public void takephone(View viwe){
opencamera.takePicture(null, null, new Camera.PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
//压缩
Bitmap bitmap=BitmapFactory.decodeByteArray(data,0,data.length);
FileOutputStream fos= null;
try {
fos = new FileOutputStream("/mnt/sdcard/DCIM/camera/gg_"+System.currentTimeMillis()+".png");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
bitmap.compress(Bitmap.CompressFormat.PNG,85,fos);//第二个参数的取值范围在1-100,代表着像素的清晰度
}
});
}
}
这里就是一个完整的相机实现.