这是我的相机代码每隔1秒拍照,问题是它很慢并且需要时间来保存一个图像,然后开始计数1秒并拍摄另一个图像,是否有更好的方法来做到这一点,并且我应该使用AsyncTask还是后台进程以及如何做到这一点?
import java.io.IOException;
import java.io.OutputStream;
import android.app.Activity;
import android.content.ContentValues;
import android.content.res.Configuration;
import android.hardware.Camera;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.provider.MediaStore.Images.Media;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
public class Test extends Activity implements OnClickListener,
SurfaceHolder.Callback, Camera.PictureCallback {
SurfaceView cameraView;
SurfaceHolder surfaceHolder;
Camera camera;
Button startStopButton;
TextView countdownTextView;
Handler timerUpdateHandler;
boolean timelapseRunning = false;
int currentTime = 0;
final int SECONDS_BETWEEN_PHOTOS = 1;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
cameraView = (SurfaceView) this.findViewById(R.id.CameraView);
surfaceHolder = cameraView.getHolder();
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
surfaceHolder.addCallback(this);
countdownTextView = (TextView) findViewById(R.id.CountDownTextView);
startStopButton = (Button) findViewById(R.id.CountDownButton);
startStopButton.setOnClickListener(this);
timerUpdateHandler = new Handler();
}
public void onClick(View v) {
if (!timelapseRunning) {
startStopButton.setText("Stop");
timelapseRunning = true;
timerUpdateHandler.post(timerUpdateTask);
} else {
startStopButton.setText("Start");
timelapseRunning = false;
timerUpdateHandler.removeCallbacks(timerUpdateTask);
}
}
private Runnable timerUpdateTask = new Runnable() {
public void run() {
if (currentTime < SECONDS_BETWEEN_PHOTOS) {
currentTime++;
} else {
camera.takePicture(null, null, null, Test.this);
currentTime = 0;
}
timerUpdateHandler.postDelayed(timerUpdateTask, 1000);
countdownTextView.setText("" + currentTime);
}
};
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
camera.startPreview();
}
public void surfaceCreated(SurfaceHolder holder) {
camera = Camera.open();
try {
camera.setPreviewDisplay(holder);
Camera.Parameters parameters = camera.getParameters();
if (this.getResources().getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE) {
parameters.set("orientation", "portrait");
camera.setDisplayOrientation(90);
}
camera.setParameters(parameters);
} catch (IOException exception) {
camera.release();
}
}
public void surfaceDestroyed(SurfaceHolder holder) {
camera.stopPreview();
camera.release();
}
public void onPictureTaken(byte[] data, Camera camera) {
Uri imageFileUri = getContentResolver().insert(
Media.EXTERNAL_CONTENT_URI, new ContentValues());
try {
OutputStream imageFileOS = getContentResolver().openOutputStream(
imageFileUri);
imageFileOS.write(data);
imageFileOS.flush();
imageFileOS.close();
Toast t = Toast.makeText(this, "Saved JPEG!", Toast.LENGTH_SHORT);
t.show();
} catch (Exception e) {
Toast t = Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT);
t.show();
}
camera.startPreview();
}
}
//layout/main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<FrameLayout android:id="@+id/FrameLayout01"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<SurfaceView android:id="@+id/CameraView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"></SurfaceView>
<LinearLayout android:id="@+id/LinearLayout01"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView android:id="@+id/CountDownTextView"
android:text="10"
android:textSize="100dip"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical|center_horizontal|center"></TextView>
<Button android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/CountDownButton"
android:text="Start Timer"></Button>
</LinearLayout>
</FrameLayout>
</LinearLayout>
答案 0 :(得分:0)
要在静止图像模式下打开相机应用,请使用 INTENT_ACTION_STILL_IMAGE_CAMERA 操作。
public void capturePhoto() {
Intent intent = new Intent(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA);
if (intent.resolveActivity(getPackageManager()) != null) {
startActivityForResult(intent);
}
}
在用户完成活动之前,它不会退出:
示例意图过滤器:
<activity ...>
<intent-filter>
<action android:name="android.media.action.STILL_IMAGE_CAMERA" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
要获取相机图像,您应该查看以下链接:
Android Camera Intent: how to get full sized photo?
或强>
如果您想使用自己的代码,那么您应该使用**
主题
**并让它睡3至4秒以保存文件并再次准备拍照。