测试程序,多次打开camera拍照推出

今天写了一个测试程序,测试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>








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值