目标效果:
能简单的实现查看,变焦,拍照,显示等基本功能,但是依然有很多没解决的地方,比如变焦效果不明显,拍照和查看时距离不一样等。
1.activity_my_camera.xml页面设置布局。
activity_my_camera.xml页面:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MyCameraActivity" >
<SurfaceView
android:id="@+id/svCamera"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<Button
android:id="@+id/btnClickMyCamera"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:text="拍照" />
</RelativeLayout>
2.activity_result_picture.xml页面显示图片。
activity_result_picture.xml页面:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ResultPictureActivity" >
<ImageView
android:id="@+id/ivShowPhoto"
android:scaleType="center"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>
3.MyCamera.java页面自定义相机,变焦并拍照。
MyCamera.java页面:
package com.example.camera;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import android.os.Bundle;
import android.app.Activity;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.ImageFormat;
import android.hardware.Camera;
import android.view.Menu;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MyCameraActivity extends Activity implements OnClickListener,
SurfaceHolder.Callback {
private Button btnClickMyCamera;
private SurfaceView svCamera;
private Camera mCamera;
private SurfaceHolder mHolder;
private Camera.PictureCallback mPictureCallback=new Camera.PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) { //data存储了拍照后整个相片的数据
File tempFile=new File("/sdcard/temp.png");
try {
FileOutputStream fos=new FileOutputStream(tempFile);
fos.write(data);
fos.close();
Intent intent=new Intent(MyCameraActivity.this,ResultPictureActivity.class);
intent.putExtra("picPath",tempFile.getAbsolutePath());
startActivity(intent);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my_camera);
// 初始化控件
init();
// 绑定点击事件
bindClick();
}
// 初始化控件
private void init() {
btnClickMyCamera = (Button) findViewById(R.id.btnClickMyCamera);
svCamera = (SurfaceView) findViewById(R.id.svCamera);
mHolder = svCamera.getHolder();
mHolder.addCallback(this);
}
// 绑定点击事件
private void bindClick() {
btnClickMyCamera.setOnClickListener(this);
svCamera.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.btnClickMyCamera:
//拍照
takePhoto();
break;
case R.id.svCamera:
//自动对焦
mCamera.autoFocus(null);
break;
default:
break;
}
}
//拍照
private void takePhoto() {
Camera.Parameters parameters=mCamera.getParameters();
parameters.setPictureFormat(ImageFormat.JPEG);//拍照格式
parameters.setPreviewSize(50,40); //拍照大小
parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);//设置自动对焦
mCamera.setParameters(parameters);
mCamera.autoFocus(new Camera.AutoFocusCallback() { //获取最清晰的对焦
@Override
public void onAutoFocus(boolean success, Camera camera) {
if(success){
mCamera.takePicture(null,null,mPictureCallback); //拍照
}
}
});
}
/**
* 获取Camera对象
*
* @return
*/
private Camera getCamera() {
Camera camera = null;
try {
camera = Camera.open();
} catch (Exception e) {
e.printStackTrace();
}
return camera;
}
/**
* 开始预览相机内容
*/
private void setStartPreview(Camera camera, SurfaceHolder holder) {
try {
camera.setPreviewDisplay(holder); // 绑定camera和holder
camera.setDisplayOrientation(90);// 横屏camera转换为竖屏的
camera.startPreview();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 释放相机所占用的资源
*/
private void releaseCamera() {
if (mCamera != null) {
mCamera.setPreviewCallback(null);// 将相机的回调置空,取消SurfaceView和camera的关联操作
mCamera.stopPreview();
mCamera.release();
mCamera = null;
}
}
@Override
protected void onResume() {
super.onResume();
if (mCamera == null) {
mCamera = getCamera();
if (mHolder != null) {
setStartPreview(mCamera, mHolder);
}
}
}
@Override
protected void onPause() {
super.onPause();
releaseCamera();
}
@Override
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
mCamera.stopPreview();
setStartPreview(mCamera, mHolder);
}
@Override
public void surfaceCreated(SurfaceHolder arg0) {
setStartPreview(mCamera, mHolder);
}
@Override
public void surfaceDestroyed(SurfaceHolder arg0) {
releaseCamera();
}
}
4.ResultPictureActivity.java页面显示图片。
ResultPictureActivity.java页面:
package com.example.camera;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import android.os.Bundle;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;
public class ResultPictureActivity extends Activity {
private ImageView ivShowPhoto;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_result_picture);
// 初始化控件
init();
// 获取数据
getPath();
}
// 初始化控件
private void init() {
ivShowPhoto = (ImageView) findViewById(R.id.ivShowPhoto);
}
// 获取数据
private void getPath() {
String path=getIntent().getStringExtra("picPath");
try {
FileInputStream fis=new FileInputStream(path);
Bitmap bitmap=BitmapFactory.decodeStream(fis);
Matrix matrix=new Matrix();
matrix.setRotate(90); //设置参数旋转90度
bitmap=Bitmap.createBitmap(bitmap,0,0,bitmap.getWidth(),bitmap.getHeight(),matrix,true);//重新创建一个bitmap,只不过新的旋转了90度
ivShowPhoto.setImageBitmap(bitmap);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
5.AndroidManifest.xml页面添加权限。
AndroidManifest.xml页面:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.camera"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="17"
android:targetSdkVersion="19" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.camera.MyCameraActivity"
android:label="@string/title_activity_my_camera" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<!-- 注册相机功能,在别的程序Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);进行启动相机时也会选择是否启动该应用 -->
<intent-filter>
<action android:name="android.media.action.IMAGE_CAPTURE" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity
android:name="com.example.camera.ResultPictureActivity"
android:label="@string/title_activity_result_picture" >
</activity>
</application>
</manifest>
6.运行就可以显示目标效果了。