想要直接預覽相機的畫面可以利用SurfaceView的方法呈現並存取下來
Step 1:
在Gradle裡面加入
compile 'com.google.android.gms:play-services-vision:9.4.0+'
後面的版本編號可能要看你現在相對應的
Step 2:
在AndroidManifest加入
<uses-permission android:name="android.permission.CAMERA" />
Step 3:
拉layout
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<SurfaceView
android:id="@+id/surfaceview"
android:layout_width="368dp"
android:layout_height="0dp"
android:layout_centerHorizontal="true"
app:layout_constraintTop_toTopOf="parent"
android:layout_marginTop="8dp"
android:layout_marginLeft="8dp"
app:layout_constraintLeft_toLeftOf="parent"
android:layout_marginRight="8dp"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintHorizontal_bias="0.0"
android:layout_marginBottom="0dp"
app:layout_constraintBottom_toTopOf="@+id/take"
app:layout_constraintVertical_bias="0.479" />
<Button
android:id="@+id/take"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Take Photo"
app:layout_constraintBottom_toBottomOf="parent"
android:layout_marginBottom="8dp"
android:layout_marginLeft="8dp"
app:layout_constraintLeft_toLeftOf="parent"
android:layout_marginRight="8dp"
app:layout_constraintRight_toRightOf="parent" />
</android.support.constraint.ConstraintLayout>
Step 4:
完整程式碼
public class CameraActivity extends Activity {
private SurfaceView mian_sfv_id;
private Camera camera;
private Button take;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_camera);
mian_sfv_id = (SurfaceView) findViewById(R.id.surfaceview);
take = (Button) findViewById(R.id.take);
//SurfaceView設置監聽器
mian_sfv_id.getHolder().addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder holder) {
camera=Camera.open();
Camera.Parameters parameters = camera.getParameters();
//畫面旋轉
int rotation = getDisplayOrientation();
camera.setDisplayOrientation(rotation);
//相機會自動對焦
parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
camera.setParameters(parameters);
//將畫面顯示到SurfaceView
try {
camera.setPreviewDisplay(mian_sfv_id.getHolder());
camera.startPreview();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
if (camera!=null){
camera.stopPreview();
camera.release();
}
}
});
take.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
camera.autoFocus(afcb);
}
});
}
//讓呈現的畫面跟使用者是同一個方向
public int getDisplayOrientation() {
Display display = ((WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
int rotation = display.getRotation();
int degrees = 0;
switch (rotation) {
case Surface.ROTATION_0:
degrees = 0;
break;
case Surface.ROTATION_90:
degrees = 90;
break;
case Surface.ROTATION_180:
degrees = 180;
break;
case Surface.ROTATION_270:
degrees = 270;
break;
}
android.hardware.Camera.CameraInfo camInfo = new android.hardware.Camera.CameraInfo();
android.hardware.Camera.getCameraInfo(Camera.CameraInfo.CAMERA_FACING_BACK, camInfo);
int result = (camInfo.orientation - degrees + 360) % 360;
return result;
}
PictureCallback jpeg =new PictureCallback(){
public void onPictureTaken(byte[] data, Camera camera) {
Bitmap bmp=BitmapFactory.decodeByteArray(data, 0, data.length);
//得到bitmap後取得照片的Uri
Uri uri = getImageUri(bmp);
//利用Uri去取得照片的路徑
String path = getRealPathFromURI(uri);
//將照片存入到手機裡
saveBitmapFile(bmp,new File(path));
camera.startPreview();
}
};
Camera.AutoFocusCallback afcb= new Camera.AutoFocusCallback(){
public void onAutoFocus(boolean success, Camera camera) {
if(success){
//對焦成功才拍照
camera.takePicture(null, null, jpeg);
}
}
};
public Uri getImageUri(Bitmap inImage) {
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
inImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
String path = MediaStore.Images.Media.insertImage(getContentResolver(), inImage, "Title", null);
return Uri.parse(path);
}
public String getRealPathFromURI(Uri uri) {
Cursor cursor = getContentResolver().query(uri, null, null, null, null);
cursor.moveToFirst();
int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
return cursor.getString(idx);
}
public static void saveBitmapFile(Bitmap bitmap, File file) {
try {
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file));
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bos);
bos.flush();
bos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
文章標籤
全站熱搜
