调用系统相机请戳这里:http://blog.csdn.net/jljcslg/article/details/50162259
以下项目使用Android Studio工具开发。
今天想分享下自定义照相机的用法。
理解的比较浅显,如果有好的想法或者代码中有误的地方,欢迎大家交流沟通。
也是借鉴各位大神们的代码,自己整合,作为记录。
我把自定义相机分为三大步骤:
1.预览
2.拍照
3.显示图片
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:text="Capture"
android:onClick="capture"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<ImageView
android:id="@+id/imageview"
android:background="#000000"
android:scaleType="fitXY"
android:layout_width="100dp"
android:layout_height="100dp" />
<SurfaceView
android:id="@+id/preview"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
代码:
package com.example.myapplication;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.ImageFormat;
import android.graphics.Matrix;
import android.hardware.Camera;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.ImageView;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback{
public static final String TAG="MyLog";
private Camera mCamera;
private SurfaceView mPreview;
private SurfaceHolder mHolder;
private ImageView imageview;
private Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
if(hasSdcard()) {
File tempFile = Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES);
if (!tempFile.exists()) {
tempFile.mkdirs();
}
tempFile = new File(tempFile.getPath() + "/" + "temppic.png");
try {
FileOutputStream fos = new FileOutputStream(tempFile);
fos.write(data);
fos.close();
// imageview.setImageURI(Uri.fromFile(tempFile));
//调整显示图片角度
FileInputStream fis=new FileInputStream(tempFile);
Bitmap bitmap= BitmapFactory.decodeStream(fis);
Matrix matrix=new Matrix();
matrix.setRotate(90);
bitmap=Bitmap.createBitmap(bitmap,0,0,bitmap.getWidth(),
bitmap.getHeight(),matrix,true);
imageview.setImageBitmap(bitmap);
mCamera.stopPreview();
setStartPreview(mCamera, mHolder);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
};
private boolean hasSdcard(){
if(Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())){
return true;
}else{
return false;
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mPreview=(SurfaceView)findViewById(R.id.preview);
mHolder=mPreview.getHolder();
mHolder.addCallback(this);
mPreview.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mCamera.autoFocus(null);
}
});
imageview = (ImageView)findViewById(R.id.imageview);
Log.d(MainActivity.TAG, "onCreate");
}
public void capture(View view){
Camera.Parameters parameters=mCamera.getParameters();
parameters.setPictureFormat(ImageFormat.JPEG);
parameters.setPreviewSize(400, 800);
// mCamera.setDisplayOrientation(90);
mCamera.autoFocus(new Camera.AutoFocusCallback() {
@Override
public void onAutoFocus(boolean success, Camera camera) {
if (success) {
mCamera.takePicture(null, null, mPictureCallback);
}
}
});
}
@Override
protected void onResume() {
Log.d(MainActivity.TAG, "onResume");
super.onResume();
if(mCamera==null){
mCamera=getCamera();
// if(mHolder!=null){
// setStartPreview(mCamera,mHolder);
// }
}
}
@Override
protected void onPause() {
Log.d(MainActivity.TAG,"onPause");
super.onPause();
releaseCamera();
}
//获取Camera对象
private Camera getCamera(){
Camera camera= Camera.open();
return camera;
}
//开始预览相机内容
private void setStartPreview(Camera camera,SurfaceHolder holder){
Log.d(MainActivity.TAG,"setStartPreview");
try {
camera.setPreviewDisplay(holder);
//调整预览角度
camera.setDisplayOrientation(90);
camera.startPreview();
} catch (IOException e) {
e.printStackTrace();
}
}
//释放资源
private void releaseCamera(){
if(mCamera!=null){
mCamera.setPreviewCallback(null);
mCamera.stopPreview();
mCamera.release();
mCamera=null;
}
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
Log.d(MainActivity.TAG,"surfaceCreated");
setStartPreview(mCamera,mHolder);
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
Log.d(MainActivity.TAG,"surfaceChanged");
mCamera.stopPreview();
setStartPreview(mCamera,mHolder);
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
Log.d(MainActivity.TAG,"surfaceDestroyed");
releaseCamera();
}
}
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.CAMERA"/>
这个代码有两个问题:
1.拍照成像很慢
2.虽然显示的图片是对的,但拍完照存储的角度却偏了90度。
可是我没有想到解决方法哎。。。
最后,听说大神们下载都不用分哦
下载地址:http://download.csdn.net/detail/jljcslg/9336543