今天写了一个测试程序,测试camera在多次拍照后,camera的效果是否有影响。
要求:进入相机,拍照,保存,退出camera。反复N次。
为了方便测试,这里要注意保持屏幕常亮。
为了避免手机空间不足,在保存照片前,删除上次保存的照片。
不多说,上代码。共六个文件。
1、MainActivity.java
package com.example.xxcameratest;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.os.PowerManager;
import android.os.PowerManager.WakeLock;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class MainActivity extends Activity implements OnClickListener{
PowerManager powerManager = null;
WakeLock wakeLock = null;
TextView mHaveDoneTimes = null;
Button mButtonControl= null;
Button mButtonReset = null;
EditText mEditSetTimesCount = null;
int mHavedoneTimes = 0;
int mSetTimes = 0;
boolean mRun = false;
String TAG = "xxCameraTest";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
this.powerManager = (PowerManager) this.getSystemService(Context.POWER_SERVICE);
this.wakeLock = this.powerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK, "My Lock");
mButtonControl = (Button) findViewById(R.id.b_control);
mButtonReset = (Button) findViewById(R.id.b_reset);
mEditSetTimesCount = (EditText) findViewById(R.id.et_photo_times);
mHaveDoneTimes = (TextView) findViewById(R.id.tv_have_done_times_count);
mButtonControl.setOnClickListener(this);
mButtonReset.setOnClickListener(this);
mHavedoneTimes = 0;
mSetTimes = Integer.valueOf( mEditSetTimesCount.getText().toString()).intValue();
}
@Override
protected void onResume() {
super.onResume();
this.wakeLock.acquire();
mHaveDoneTimes.setText(String.valueOf(mHavedoneTimes));
if(mHavedoneTimes==mSetTimes){
mRun = false;
refreshUI(false);
dialog();
}
}
@Override
protected void onPause() {
super.onPause();
this.wakeLock.release();
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.b_control:
if(mButtonControl.getText().toString().equals(this.getString(R.string.start))){
mSetTimes = Integer.valueOf( mEditSetTimesCount.getText().toString()).intValue();
mRun = true;
refreshUI(true);
photographTest();
}else{
mRun = false;
refreshUI(false);
}
break;
case R.id.b_reset:
mHavedoneTimes = 0;
mHaveDoneTimes.setText(String.valueOf(mHavedoneTimes));
break;
default:
break;
}
}
void photographTest(){
if(mHavedoneTimes==mSetTimes){
mRun = false;
}
if(mRun){
Intent intent = new Intent();
intent.setClass(MainActivity.this, PhotographActivity.class);
startActivityForResult(intent,1);
mHavedoneTimes = mHavedoneTimes+1;
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
new photographTestThread().start();
}
class photographTestThread extends Thread{
@Override
public void run() {
super.run();
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
photographTest();
}
}
protected void dialog() {
new AlertDialog.Builder(MainActivity.this)
.setTitle("Finish")
.setMessage("Have taken "+ mSetTimes +" photos !")
.setPositiveButton("OK", null)
.show();
}
void refreshUI(boolean iRun){
if(iRun){
mButtonControl.setText(this.getString(R.string.stop));
mEditSetTimesCount.setEnabled(false);
mButtonReset.setEnabled(false);
}else{
mButtonControl.setText(this.getString(R.string.start));
mEditSetTimesCount.setEnabled(true);
mButtonReset.setEnabled(true);
}
}
}
2、PhotographActivity.java
package com.example.xxcameratest;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Date;
import android.app.Activity;
import android.graphics.PixelFormat;
import android.hardware.Camera;
import android.hardware.Camera.PictureCallback;
import android.os.Bundle;
import android.os.Environment;
import android.view.Surface;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Toast;
public class PhotographActivity extends Activity {
private View layout;
private Camera camera;
private Camera.Parameters parameters = null;
Bundle bundle = null; // 声明一个Bundle对象,用来存储数据
static String TESTPHOTONAME = "xxTest.jpg";
static String FOLDNAME = "/xxCameraTest/";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 显示界面
setContentView(R.layout.activity_photograph);
layout = this.findViewById(R.id.buttonLayout);
SurfaceView surfaceView = (SurfaceView) this
.findViewById(R.id.surfaceView);
surfaceView.getHolder()
.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
surfaceView.getHolder().setFixedSize(176, 144); // 设置Surface分辨率
surfaceView.getHolder().setKeepScreenOn(true);// 屏幕常亮
surfaceView.getHolder().addCallback(new SurfaceCallback());// 为SurfaceView的句柄添加一个回调函数
}
void takePictureTest() {
if (camera != null) {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
camera.takePicture(null, null, new MyPictureCallback());
}
}
private final class MyPictureCallback implements PictureCallback {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
try {
bundle = new Bundle();
bundle.putByteArray("bytes", data); // 将图片字节数据保存在bundle当中,实现数据交换
saveToSDCard(data); // 保存图片到sd卡中
Toast.makeText(getApplicationContext(), R.string.success,
Toast.LENGTH_SHORT).show();
camera.startPreview(); // 拍完照后,重新开始预览
exitTest();
} catch (Exception e) {
e.printStackTrace();
}
}
}
void exitTest() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
this.finish();
}
/**
* 将拍下来的照片存放在SD卡中
*
* @param data
* @throws IOException
*/
public static void saveToSDCard(byte[] data) throws IOException {
deletexxPhotoFromSDCard();
File fileFolder = new File(Environment.getExternalStorageDirectory()
+ FOLDNAME);
if (!fileFolder.exists()) { // 如果目录不存在,则创建一个目录
fileFolder.mkdir();
}
File jpgFile = new File(fileFolder, TESTPHOTONAME);
FileOutputStream outputStream = new FileOutputStream(jpgFile); // 文件输出流
outputStream.write(data); // 写入sd卡中
outputStream.close(); // 关闭输出流
}
public static void deletexxPhotoFromSDCard() throws IOException {
File fileFolder = new File(Environment.getExternalStorageDirectory()
+ FOLDNAME);
if (fileFolder.exists()) {
File jpgFile = new File(fileFolder, TESTPHOTONAME);
if (jpgFile.exists()) {
if (jpgFile.isFile()) {
jpgFile.delete();
}
}
}
}
private final class SurfaceCallback implements Callback {
// 拍照状态变化时调用该方法
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
parameters = camera.getParameters(); // 获取各项参数
parameters.setPictureFormat(PixelFormat.JPEG); // 设置图片格式
parameters.setPreviewSize(width, height); // 设置预览大小
parameters.setPreviewFrameRate(5); // 设置每秒显示4帧
parameters.setPictureSize(width, height); // 设置保存的图片尺寸
parameters.setJpegQuality(80); // 设置照片质量
}
// 开始拍照时调用该方法
@Override
public void surfaceCreated(SurfaceHolder holder) {
try {
camera = Camera.open(); // 打开摄像头
camera.setPreviewDisplay(holder); // 设置用于显示拍照影像的SurfaceHolder对象
camera.setDisplayOrientation(getPreviewDegree(PhotographActivity.this));
camera.startPreview(); // 开始预览
camera.cancelAutoFocus();
camera.autoFocus(null);
takePictureTest();
} catch (Exception e) {
e.printStackTrace();
}
}
// 停止拍照时调用该方法
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
if (camera != null) {
camera.release(); // 释放照相机
camera = null;
}
}
}
// 提供一个静态方法,用于根据手机方向获得相机预览画面旋转的角度
public static int getPreviewDegree(Activity activity) {
// 获得手机的方向
int rotation = activity.getWindowManager().getDefaultDisplay()
.getRotation();
int degree = 0;
// 根据手机的方向计算相机预览画面应该选择的角度
switch (rotation) {
case Surface.ROTATION_0:
degree = 90;
break;
case Surface.ROTATION_90:
degree = 0;
break;
case Surface.ROTATION_180:
degree = 270;
break;
case Surface.ROTATION_270:
degree = 180;
break;
}
return degree;
}
}
3、layout/activity_main.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"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.xxcameratest.MainActivity" >
<TextView
android:id = "@+id/tv_photo_times"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="20dip"
android:text="@string/photograph_times" />
<EditText
android:id = "@+id/et_photo_times"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/tv_photo_times"
android:text="10000"
android:layout_marginBottom="50dip"
android:layout_centerHorizontal="true"
/>
<ImageView
android:id = "@+id/division_line1"
android:layout_width="fill_parent"
android:layout_height="1dp"
android:background="#ffffff"
android:layout_below="@id/et_photo_times"
/>
<TextView
android:id = "@+id/tv_have_done_times"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/division_line1"
android:layout_marginTop="5dip"
android:text="@string/have_done_times" />
<TextView
android:id = "@+id/tv_have_done_times_count"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/tv_have_done_times"
android:textSize="60dp"
android:layout_centerHorizontal="true"
android:text="0" />
<Button
android:id="@+id/b_reset"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/b_control"
android:layout_alignBottom="@+id/b_control"
android:layout_alignRight="@+id/division_line1"
android:layout_toRightOf="@+id/et_photo_times"
android:text="@string/reset" />
<Button
android:id="@+id/b_control"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/tv_have_done_times"
android:layout_alignParentBottom="true"
android:layout_alignRight="@+id/tv_have_done_times"
android:layout_marginBottom="66dp"
android:text="@string/start" />
</RelativeLayout>
4、layout/activity_photograph.xml
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/FrameLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<!-- 显示预览图形 -->
<SurfaceView
android:id="@+id/surfaceView"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
<!-- 相对布局,放置两个按钮 -->
<RelativeLayout
android:id="@+id/buttonLayout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone"
>
<!-- 拍照按钮 -->
<Button
android:id="@+id/takepicture"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"
android:onClick="btnOnclick"
/>
<ImageView
android:id="@+id/scalePic"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentBottom="true"
android:layout_marginLeft="5dp"
android:onClick="imageClick"
/>
</RelativeLayout>
</FrameLayout>
5、strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">xxCameraTest</string>
<string name="hello_world">Hello world!</string>
<string name="action_settings">Settings</string>
<string name="photograph_times">How many times will you photograph?</string>
<string name="have_done_times">Have done times:</string>
<string name="start">Start</string>
<string name="stop">Pause</string>
<string name="reset">Reset</string>
<string name="photograph_activity">Photograph Test</string>
<string name="success">Success!</string>
</resources>
6、AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.xxcameratest"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="21"
android:targetSdkVersion="21" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.CAMERA" />
<!-- 在SDCard中创建与删除文件权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<!-- 往SDCard写入数据权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- 在SD卡上创建与删除权限 -->
<uses-permission android:name="android.permission.MOUNT_FORMAT_FILESYSTEMS" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:screenOrientation="portrait"
android:configChanges="orientation"
>
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".PhotographActivity"
android:label="@string/photograph_activity"
android:screenOrientation="portrait"
android:configChanges="orientation"
>
</activity>
</application>
</manifest>
要求:进入相机,拍照,保存,退出camera。反复N次。
为了方便测试,这里要注意保持屏幕常亮。
为了避免手机空间不足,在保存照片前,删除上次保存的照片。
不多说,上代码。共六个文件。
1、MainActivity.java
package com.example.xxcameratest;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.os.PowerManager;
import android.os.PowerManager.WakeLock;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class MainActivity extends Activity implements OnClickListener{
PowerManager powerManager = null;
WakeLock wakeLock = null;
TextView mHaveDoneTimes = null;
Button mButtonControl= null;
Button mButtonReset = null;
EditText mEditSetTimesCount = null;
int mHavedoneTimes = 0;
int mSetTimes = 0;
boolean mRun = false;
String TAG = "xxCameraTest";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
this.powerManager = (PowerManager) this.getSystemService(Context.POWER_SERVICE);
this.wakeLock = this.powerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK, "My Lock");
mButtonControl = (Button) findViewById(R.id.b_control);
mButtonReset = (Button) findViewById(R.id.b_reset);
mEditSetTimesCount = (EditText) findViewById(R.id.et_photo_times);
mHaveDoneTimes = (TextView) findViewById(R.id.tv_have_done_times_count);
mButtonControl.setOnClickListener(this);
mButtonReset.setOnClickListener(this);
mHavedoneTimes = 0;
mSetTimes = Integer.valueOf( mEditSetTimesCount.getText().toString()).intValue();
}
@Override
protected void onResume() {
super.onResume();
this.wakeLock.acquire();
mHaveDoneTimes.setText(String.valueOf(mHavedoneTimes));
if(mHavedoneTimes==mSetTimes){
mRun = false;
refreshUI(false);
dialog();
}
}
@Override
protected void onPause() {
super.onPause();
this.wakeLock.release();
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.b_control:
if(mButtonControl.getText().toString().equals(this.getString(R.string.start))){
mSetTimes = Integer.valueOf( mEditSetTimesCount.getText().toString()).intValue();
mRun = true;
refreshUI(true);
photographTest();
}else{
mRun = false;
refreshUI(false);
}
break;
case R.id.b_reset:
mHavedoneTimes = 0;
mHaveDoneTimes.setText(String.valueOf(mHavedoneTimes));
break;
default:
break;
}
}
void photographTest(){
if(mHavedoneTimes==mSetTimes){
mRun = false;
}
if(mRun){
Intent intent = new Intent();
intent.setClass(MainActivity.this, PhotographActivity.class);
startActivityForResult(intent,1);
mHavedoneTimes = mHavedoneTimes+1;
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
new photographTestThread().start();
}
class photographTestThread extends Thread{
@Override
public void run() {
super.run();
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
photographTest();
}
}
protected void dialog() {
new AlertDialog.Builder(MainActivity.this)
.setTitle("Finish")
.setMessage("Have taken "+ mSetTimes +" photos !")
.setPositiveButton("OK", null)
.show();
}
void refreshUI(boolean iRun){
if(iRun){
mButtonControl.setText(this.getString(R.string.stop));
mEditSetTimesCount.setEnabled(false);
mButtonReset.setEnabled(false);
}else{
mButtonControl.setText(this.getString(R.string.start));
mEditSetTimesCount.setEnabled(true);
mButtonReset.setEnabled(true);
}
}
}
2、PhotographActivity.java
package com.example.xxcameratest;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Date;
import android.app.Activity;
import android.graphics.PixelFormat;
import android.hardware.Camera;
import android.hardware.Camera.PictureCallback;
import android.os.Bundle;
import android.os.Environment;
import android.view.Surface;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Toast;
public class PhotographActivity extends Activity {
private View layout;
private Camera camera;
private Camera.Parameters parameters = null;
Bundle bundle = null; // 声明一个Bundle对象,用来存储数据
static String TESTPHOTONAME = "xxTest.jpg";
static String FOLDNAME = "/xxCameraTest/";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 显示界面
setContentView(R.layout.activity_photograph);
layout = this.findViewById(R.id.buttonLayout);
SurfaceView surfaceView = (SurfaceView) this
.findViewById(R.id.surfaceView);
surfaceView.getHolder()
.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
surfaceView.getHolder().setFixedSize(176, 144); // 设置Surface分辨率
surfaceView.getHolder().setKeepScreenOn(true);// 屏幕常亮
surfaceView.getHolder().addCallback(new SurfaceCallback());// 为SurfaceView的句柄添加一个回调函数
}
void takePictureTest() {
if (camera != null) {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
camera.takePicture(null, null, new MyPictureCallback());
}
}
private final class MyPictureCallback implements PictureCallback {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
try {
bundle = new Bundle();
bundle.putByteArray("bytes", data); // 将图片字节数据保存在bundle当中,实现数据交换
saveToSDCard(data); // 保存图片到sd卡中
Toast.makeText(getApplicationContext(), R.string.success,
Toast.LENGTH_SHORT).show();
camera.startPreview(); // 拍完照后,重新开始预览
exitTest();
} catch (Exception e) {
e.printStackTrace();
}
}
}
void exitTest() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
this.finish();
}
/**
* 将拍下来的照片存放在SD卡中
*
* @param data
* @throws IOException
*/
public static void saveToSDCard(byte[] data) throws IOException {
deletexxPhotoFromSDCard();
File fileFolder = new File(Environment.getExternalStorageDirectory()
+ FOLDNAME);
if (!fileFolder.exists()) { // 如果目录不存在,则创建一个目录
fileFolder.mkdir();
}
File jpgFile = new File(fileFolder, TESTPHOTONAME);
FileOutputStream outputStream = new FileOutputStream(jpgFile); // 文件输出流
outputStream.write(data); // 写入sd卡中
outputStream.close(); // 关闭输出流
}
public static void deletexxPhotoFromSDCard() throws IOException {
File fileFolder = new File(Environment.getExternalStorageDirectory()
+ FOLDNAME);
if (fileFolder.exists()) {
File jpgFile = new File(fileFolder, TESTPHOTONAME);
if (jpgFile.exists()) {
if (jpgFile.isFile()) {
jpgFile.delete();
}
}
}
}
private final class SurfaceCallback implements Callback {
// 拍照状态变化时调用该方法
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
parameters = camera.getParameters(); // 获取各项参数
parameters.setPictureFormat(PixelFormat.JPEG); // 设置图片格式
parameters.setPreviewSize(width, height); // 设置预览大小
parameters.setPreviewFrameRate(5); // 设置每秒显示4帧
parameters.setPictureSize(width, height); // 设置保存的图片尺寸
parameters.setJpegQuality(80); // 设置照片质量
}
// 开始拍照时调用该方法
@Override
public void surfaceCreated(SurfaceHolder holder) {
try {
camera = Camera.open(); // 打开摄像头
camera.setPreviewDisplay(holder); // 设置用于显示拍照影像的SurfaceHolder对象
camera.setDisplayOrientation(getPreviewDegree(PhotographActivity.this));
camera.startPreview(); // 开始预览
camera.cancelAutoFocus();
camera.autoFocus(null);
takePictureTest();
} catch (Exception e) {
e.printStackTrace();
}
}
// 停止拍照时调用该方法
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
if (camera != null) {
camera.release(); // 释放照相机
camera = null;
}
}
}
// 提供一个静态方法,用于根据手机方向获得相机预览画面旋转的角度
public static int getPreviewDegree(Activity activity) {
// 获得手机的方向
int rotation = activity.getWindowManager().getDefaultDisplay()
.getRotation();
int degree = 0;
// 根据手机的方向计算相机预览画面应该选择的角度
switch (rotation) {
case Surface.ROTATION_0:
degree = 90;
break;
case Surface.ROTATION_90:
degree = 0;
break;
case Surface.ROTATION_180:
degree = 270;
break;
case Surface.ROTATION_270:
degree = 180;
break;
}
return degree;
}
}
3、layout/activity_main.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"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.xxcameratest.MainActivity" >
<TextView
android:id = "@+id/tv_photo_times"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="20dip"
android:text="@string/photograph_times" />
<EditText
android:id = "@+id/et_photo_times"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/tv_photo_times"
android:text="10000"
android:layout_marginBottom="50dip"
android:layout_centerHorizontal="true"
/>
<ImageView
android:id = "@+id/division_line1"
android:layout_width="fill_parent"
android:layout_height="1dp"
android:background="#ffffff"
android:layout_below="@id/et_photo_times"
/>
<TextView
android:id = "@+id/tv_have_done_times"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/division_line1"
android:layout_marginTop="5dip"
android:text="@string/have_done_times" />
<TextView
android:id = "@+id/tv_have_done_times_count"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/tv_have_done_times"
android:textSize="60dp"
android:layout_centerHorizontal="true"
android:text="0" />
<Button
android:id="@+id/b_reset"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/b_control"
android:layout_alignBottom="@+id/b_control"
android:layout_alignRight="@+id/division_line1"
android:layout_toRightOf="@+id/et_photo_times"
android:text="@string/reset" />
<Button
android:id="@+id/b_control"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/tv_have_done_times"
android:layout_alignParentBottom="true"
android:layout_alignRight="@+id/tv_have_done_times"
android:layout_marginBottom="66dp"
android:text="@string/start" />
</RelativeLayout>
4、layout/activity_photograph.xml
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/FrameLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<!-- 显示预览图形 -->
<SurfaceView
android:id="@+id/surfaceView"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
<!-- 相对布局,放置两个按钮 -->
<RelativeLayout
android:id="@+id/buttonLayout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone"
>
<!-- 拍照按钮 -->
<Button
android:id="@+id/takepicture"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"
android:onClick="btnOnclick"
/>
<ImageView
android:id="@+id/scalePic"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentBottom="true"
android:layout_marginLeft="5dp"
android:onClick="imageClick"
/>
</RelativeLayout>
</FrameLayout>
5、strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">xxCameraTest</string>
<string name="hello_world">Hello world!</string>
<string name="action_settings">Settings</string>
<string name="photograph_times">How many times will you photograph?</string>
<string name="have_done_times">Have done times:</string>
<string name="start">Start</string>
<string name="stop">Pause</string>
<string name="reset">Reset</string>
<string name="photograph_activity">Photograph Test</string>
<string name="success">Success!</string>
</resources>
6、AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.xxcameratest"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="21"
android:targetSdkVersion="21" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.CAMERA" />
<!-- 在SDCard中创建与删除文件权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<!-- 往SDCard写入数据权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- 在SD卡上创建与删除权限 -->
<uses-permission android:name="android.permission.MOUNT_FORMAT_FILESYSTEMS" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:screenOrientation="portrait"
android:configChanges="orientation"
>
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".PhotographActivity"
android:label="@string/photograph_activity"
android:screenOrientation="portrait"
android:configChanges="orientation"
>
</activity>
</application>
</manifest>