Ste*_*win 5 android android-camera android-activity commonsware-cwac
我有一个简单的应用程序,它有一个活动被警报管理器定期调用以显示预览帧并在构建预览帧时拍照。拍照后,它使用 a 保存AsyncTask,活动使用finish(). 当我打开屏幕时,代码工作得很好。但是它无法在屏幕关闭的情况下拍照。我想监视房子并使用该应用程序定期拍照,在这种情况下保持屏幕始终打开或打开它手动不是一个可行的选择。
此外,相机活动的代码已从Commonsware库中复制,效果非常好。我只是在关闭屏幕的情况下拍照时遇到问题。我还可以从日志中看到相机是由活动打开的。但是应该在构建预览帧时拍照的 Runnable 没有运行,而是相机进入暂停状态并停留在那里。
我已经完美设置了必要的权限,因为我能够在屏幕打开的情况下获取图像。也许当屏幕关闭并且有人可以在那里照亮时,我无法理解活动生命周期。
我尝试使用唤醒锁打开屏幕,但这没有任何好处。
下面是活动的代码。
另外我很抱歉,但删除许可证的评论以使其简短。
package com.thopedia.snapper; /***
Copyright (c) 2008-2012 CommonsWare, LLC
*/
import all;
public class CameraActivity1 extends Activity {
private PreviewFrameLayout frame=null;
private SurfaceView preview=null;
private SurfaceHolder previewHolder=null;
private Camera camera=null;
private boolean inPreview=false;
private boolean cameraConfigured=false;
private PowerManager.WakeLock wakeLock;
private PowerManager powerManager;
@SuppressWarnings("deprecation")
@Override
public void onCreate(Bundle savedInstanceState) {
/* powerManager = (PowerManager) getSystemService(POWER_SERVICE);
wakeLock = powerManager.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK, getClass()
.getName());*/
Log.v(GlobalVariables.TAG,"CameraActivity On create called");
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
frame=(PreviewFrameLayout)findViewById(R.id.frame);
preview=(SurfaceView)findViewById(R.id.preview);
previewHolder=preview.getHolder();
previewHolder.addCallback(surfaceCallback);
previewHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
@TargetApi(Build.VERSION_CODES.GINGERBREAD)
@Override
public void onResume() {
// wakeLock.acquire();
Log.v(GlobalVariables.TAG,"camera activity onResume called");
super.onResume();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) {
Camera.CameraInfo info=new Camera.CameraInfo();
for (int i=0; i < Camera.getNumberOfCameras(); i++) {
Camera.getCameraInfo(i, info);
if (info.facing == Camera.CameraInfo.CAMERA_FACING_BACK) {
try{
camera=Camera.open(i);
}catch (Exception e){
Log.v(GlobalVariables.TAG,"Camera Opening Exception");
if(!isFinishing()) {
finish();
}}}}}
if (camera == null) {
try{
camera=Camera.open();
}catch (Exception e){
if(!isFinishing()) {
finish();
}
Log.v(GlobalVariables.TAG,"Camera opening exception");
}
}
startPreview();
preview.post(new Runnable() {
@Override
public void run() {
if (inPreview) {
camera.takePicture(null, null, photoCallback);
inPreview=false;
}
}
});
}
@Override
public void onPause() {
super.onPause();
Log.v(GlobalVariables.TAG,"Camera activity onPause called");
if (inPreview) {
if(camera!=null) {
camera.stopPreview();
}
}
if(camera!=null) {
camera.release();
camera = null;
}
inPreview=false;
}
@Override
protected void onDestroy() {
Log.v(GlobalVariables.TAG,"Camera activity onDestroy called!");
super.onDestroy();
if(camera!=null){
camera.release();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
new MenuInflater(this).inflate(R.menu.options, menu);
return(super.onCreateOptionsMenu(menu));
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == R.id.camera) {
if (inPreview) {
camera.takePicture(null, null, photoCallback);
inPreview=false;
}
}
return(super.onOptionsItemSelected(item));
}
private Camera.Size getBestPreviewSize(int width, int height,
Camera.Parameters parameters) {
Camera.Size result=null;
for (Camera.Size size : parameters.getSupportedPreviewSizes()) {
if (size.width <= width && size.height <= height) {
if (result == null) {
result=size;
}
else {
int resultArea=result.width * result.height;
int newArea=size.width * size.height;
if (newArea > resultArea) {
result=size;
}
}
}
}
return(result);
}
private Camera.Size getSmallestPictureSize(Camera.Parameters parameters) {
Camera.Size result=null;
for (Camera.Size size : parameters.getSupportedPictureSizes()) {
if (result == null) {
result=size;
}
else {
int resultArea=result.width * result.height;
int newArea=size.width * size.height;
if (newArea < resultArea) {
result=size;
}
}
}
return(result);
}
private void initPreview(int width, int height) {
if (camera != null && previewHolder.getSurface() != null) {
try {
camera.setPreviewDisplay(previewHolder);
}
catch (Throwable t) {
Log.e("PreviewDemo-surfaceCallback",
"Exception in setPreviewDisplay()", t);
Toast.makeText(CameraActivity1.this, t.getMessage(),
Toast.LENGTH_LONG).show();
}
if (!cameraConfigured) {
Camera.Parameters parameters=camera.getParameters();
Camera.Size size=getBestPreviewSize(width, height, parameters);
Camera.Size pictureSize=getSmallestPictureSize(parameters);
if (size != null && pictureSize != null) {
parameters.setPreviewSize(size.width, size.height);
parameters.setPictureSize(pictureSize.width,
pictureSize.height);
parameters.setPictureFormat(ImageFormat.JPEG);
frame.setAspectRatio((double)size.width / size.height);
camera.setParameters(parameters);
cameraConfigured=true;
}
}
}
}
private void startPreview() {
if (cameraConfigured && camera != null) {
camera.startPreview();
inPreview=true;
}
}
SurfaceHolder.Callback surfaceCallback=new SurfaceHolder.Callback() {
public void surfaceCreated(SurfaceHolder holder) {
// no-op -- wait until surfaceChanged()
}
public void surfaceChanged(SurfaceHolder holder, int format,
int width, int height) {
initPreview(width, height);
startPreview();
}
public void surfaceDestroyed(SurfaceHolder holder) {
// no-op
}
};
Camera.PictureCallback photoCallback=new Camera.PictureCallback() {
public void onPictureTaken(byte[] data, Camera camera) {
new SavePhotoTask().execute(data);
camera.startPreview();
inPreview=true;
if(!isFinishing()) {
finish();
}
}
};
Run Code Online (Sandbox Code Playgroud)
在正确创建预览表面后,我使用以下代码单击图片 onResume().
preview.post(new Runnable() {
@Override
public void run() {
if (inPreview) {
camera.takePicture(null, null, photoCallback);
inPreview=false;
}
}
});
Run Code Online (Sandbox Code Playgroud)
任何帮助表示赞赏。谢谢
我认为您可以使用 WakeLock 来确保不会发生屏幕关闭。下面是示例代码/算法,您可以通过它在屏幕关闭时打开屏幕。希望这可以帮助!
每当您使屏幕关闭广播意图时,请使用以下代码唤醒。
PowerManager pm = (PowerManager) context
.getSystemService(Context.POWER_SERVICE);
WakeLock wakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK
| PowerManager.ACQUIRE_CAUSES_WAKEUP
| PowerManager.ON_AFTER_RELEASE, "MyWakeLock");
wakeLock.acquire();
Run Code Online (Sandbox Code Playgroud)| 归档时间: |
|
| 查看次数: |
2723 次 |
| 最近记录: |