gpt4 book ai didi

android - camera.startPreview() 太慢

转载 作者:行者123 更新时间:2023-11-29 01:42:01 25 4
gpt4 key购买 nike

我想制作一个相机应用程序,它会在按下按钮时开始将图像从相机显示到屏幕,并在释放按钮时拍照。我都做了,就是相机启动速度太慢了。我希望它在我按下按钮时立即启动。我试图实例化我的相机,设置所有参数并将其流式传输到一个不可见的 SurfaceView,但当我按下按钮时,它似乎重新启动了相机。可能是什么问题?

这是我的代码:

import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.res.Configuration;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.MotionEvent;
import android.view.Surface;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View.OnTouchListener;
import android.view.ViewGroup.LayoutParams;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.SeekBar;
import android.view.View;
import android.graphics.AvoidXfermode.Mode;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.PixelFormat;
import android.hardware.Camera;
import android.hardware.Camera.Parameters;
import android.hardware.Camera.PictureCallback;
import android.hardware.Camera.ShutterCallback;
import android.hardware.Camera.Size;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.mime.HttpMultipartMode;
import org.apache.http.entity.mime.MultipartEntity;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.entity.mime.content.StringBody;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.BasicHttpContext;
import org.apache.http.protocol.HttpContext;
import org.json.JSONException;
import org.json.JSONObject;

import com.shtern.selfy.MainActivity.JSONParse;

@TargetApi(Build.VERSION_CODES.GINGERBREAD)
public class CameraActivity extends Activity implements SurfaceHolder.Callback,
View.OnTouchListener, Camera.PictureCallback, Camera.PreviewCallback {
private Camera camera;
private SurfaceHolder surfaceHolder;
private SurfaceView preview;
private Button shotBtn;
JSONObject json = new JSONObject();
JSONParse jsparse = new JSONParse();
String url = "http://myserverurl";
String userid;
String token;
String parentactivity;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

userid = getIntent().getStringExtra("userid").toString();
token = getIntent().getStringExtra("token").toString();
parentactivity = getIntent().getStringExtra("parent").toString();


setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);


getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);


requestWindowFeature(Window.FEATURE_NO_TITLE);

setContentView(R.layout.camera);


preview = (SurfaceView) findViewById(R.id.SurfaceView01);

surfaceHolder = preview.getHolder();
surfaceHolder.addCallback(this);
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);


shotBtn = (Button) findViewById(R.id.Button01);
shotBtn.setOnTouchListener(this);
camera = Camera.open(Camera.CameraInfo.CAMERA_FACING_FRONT);
// camera = Camera.open();
Camera.Parameters params = camera.getParameters();
params.setPictureSize(800, 480);
params.setRotation(270);
camera.setParameters(params);
try {
camera.setPreviewDisplay(surfaceHolder);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
camera.setPreviewDisplay(surfaceHolder);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
preview.setVisibility(View.VISIBLE);
camera.startPreview();
preview.setVisibility(View.VISIBLE);


}

@Override
protected void onResume() {
super.onResume();

preview.setVisibility(View.INVISIBLE);
}

@Override
protected void onPause() {
super.onPause();

if (camera != null) {
camera.stopPreview();
camera.setPreviewCallback(null);

camera.release();
camera = null;
}
preview.setVisibility(View.GONE);
}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
}

@Override
public void surfaceCreated(SurfaceHolder holder) {
Log.d("SURFACE", "CREATED");

Size previewSize = camera.getParameters().getPreviewSize();
float aspect = (float) previewSize.width / previewSize.height;

int previewSurfaceWidth = preview.getWidth();
int previewSurfaceHeight = preview.getHeight();

LayoutParams lp = preview.getLayoutParams();

if (this.getResources().getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE) {


camera.setDisplayOrientation(90);
lp.height = previewSurfaceHeight;
lp.width = (int) (previewSurfaceHeight / aspect);

} else {


camera.setDisplayOrientation(0);
lp.width = previewSurfaceWidth;
lp.height = (int) (previewSurfaceWidth / aspect);
}

preview.setLayoutParams(lp);

try {
camera.setPreviewDisplay(holder);
camera.setPreviewCallback(this);
} catch (IOException e) {
e.printStackTrace();
}
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
camera.stopPreview();
camera.setPreviewCallback(null);
camera.release();
camera = null;
preview.setVisibility(View.GONE);
}

public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
Log.d("TOUCH", "PUSHED");
shotBtn.setVisibility(View.GONE);
preview.setVisibility(View.VISIBLE);

// start_camera();

}
if (event.getAction() == MotionEvent.ACTION_UP) {
Log.d("TOUCH", "Release detected");

camera.takePicture(null, null, null, this);
//

}
return true;
}

@Override
public void onPictureTaken(byte[] paramArrayOfByte, Camera paramCamera) {
camera.stopPreview();
camera.setPreviewCallback(null);
preview.setVisibility(View.INVISIBLE);
CameraActivity.this.finish();
FrameLayout fl = (FrameLayout) findViewById(R.id.FrameLayout01);
fl.removeAllViews();
try {
String path = CameraActivity.this.getFilesDir().getPath();
Log.d("PATH", path);
File saveDir = new File(path);

if (!saveDir.exists()) {
saveDir.mkdirs();
}
FileOutputStream os = new FileOutputStream(String.format(path
+ "/ava.jpg"));

os.write(paramArrayOfByte);
os.close();
} catch (Exception e) {
}


jsparse.execute();

}

class JSONParse extends AsyncTask<Void, Void, JSONObject> {

@Override
protected JSONObject doInBackground(Void... params) {

List<NameValuePair> parameters = new ArrayList<NameValuePair>();
String path = CameraActivity.this.getFilesDir().getPath();
path = path + "/ava.jpg";
Log.d("PATHINCAMERA", path);

parameters.add(new BasicNameValuePair("user_id", userid));
parameters.add(new BasicNameValuePair("token", token));
parameters.add(new BasicNameValuePair("file", path));
url = url + "/change_avatar_request/";

postWithImage(url, parameters);
if (parentactivity.equals("RegisterActivity")) {
final Intent intent = new Intent(getApplicationContext(),
MenuActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("userid", String.valueOf(userid));
intent.putExtra("token", String.valueOf(token));
startActivity(intent);
}
// CameraActivity.this.finish();
return null;
}

@Override
protected void onPostExecute(JSONObject json) {


}

}

public void postWithImage(String url, List<NameValuePair> nameValuePairs) {
HttpClient httpClient = new DefaultHttpClient();
HttpContext localContext = new BasicHttpContext();
HttpPost httpPost = new HttpPost(url);

try {
MultipartEntity entity = new MultipartEntity(
HttpMultipartMode.BROWSER_COMPATIBLE);

for (int index = 0; index < nameValuePairs.size(); index++) {
if (nameValuePairs.get(index).getName()
.equalsIgnoreCase("file")) {
// If the key equals to "image", we use FileBody to transfer
// the data
entity.addPart(nameValuePairs.get(index).getName(),
new FileBody(new File(nameValuePairs.get(index)
.getValue())));
} else {
// Normal string data
entity.addPart(
nameValuePairs.get(index).getName(),
new StringBody(nameValuePairs.get(index).getValue()));
}
}

httpPost.setEntity(entity);

HttpResponse response = httpClient.execute(httpPost, localContext);
} catch (IOException e) {
e.printStackTrace();
}
}

@Override
public void onPreviewFrame(byte[] paramArrayOfByte, Camera paramCamera) {

}
}

最佳答案

要保持预览工作,你不应该设置

preview.setVisibility(View.INVISIBLE)

相反,您可以暂时(直到按下按钮)用非透明 View 覆盖预览,例如图片 View 。

关于android - camera.startPreview() 太慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23983527/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com