gpt4 book ai didi

Android Camera 第二次拍摄失败

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

我正在尝试用我的应用拍摄两张照片,第一张照片拍摄没有问题,但拍摄另一张照片时出现 NullPointerException。

以下代码是我的相机 Activity 。最近两天我试图解决这个问题,但到目前为止还没有成功。

编辑:相机到底哪里出了问题?当用户拍照时,我会在另一个 Activity 中向他们展示预览。如果用户想拍另一张照片,请单击“拍另一张照片”按钮。 Activity 返回到 TakePicture 类。这是用户拍摄多张照片时的主要问题。

还有 displayGuide() 方法在第二次拍摄时弹出两次

感谢任何帮助。

public class TakePicture extends Activity
{
private SurfaceView mySurfaceView;
private SurfaceHolder holder;
private Camera myCamera;
private int orient;

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

b = getIntent().getExtras();
orient = b.getInt("orient");
// Switch to Screen orientation based on BARCODE
switch (orient)
{
case 3 :
case 4 :
case 5 :
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
break;
default :
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
break;
}

requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_fullscreen);

myCamera = getCameraInstance();

mySurfaceView = (SurfaceView) findViewById(R.id.surface_view);
holder = mySurfaceView.getHolder();
holder.addCallback(mSurfaceListener);
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}

@Override
protected void onResume()
{
if (myCamera == null)
myCamera = getCameraInstance();

super.onResume();
}

@Override
public void onPause()
{
super.onPause();
releaseCamera();
}

private void releaseCamera()
{
if (myCamera != null)
{
myCamera.setPreviewCallback(null);
myCamera.release();
myCamera = null;
}
}

private static Camera getCameraInstance()
{
Camera c = null;

try
{
c = Camera.open();
}
catch(Exception e)
{
new ErrLog(e.toString());
}

return c;
}

private final ShutterCallback shutterCallback = new ShutterCallback()
{
public void onShutter()
{
AudioManager mgr = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
mgr.playSoundEffect(AudioManager.FLAG_PLAY_SOUND);
}
};

private SurfaceHolder.Callback mSurfaceListener = new SurfaceHolder.Callback()
{
public void surfaceCreated(SurfaceHolder holder)
{
//myCamera = Camera.open();

try
{
myCamera.setPreviewDisplay(holder);
}
catch (Exception e)
{
new ErrLog(e.toString());
}
}

public void surfaceDestroyed(SurfaceHolder holder)
{
//myCamera.release();
//myCamera = null;
}

@SuppressLint("InlinedApi")
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height)
{
myCamera.stopPreview();

Parameters mParam = myCamera.getParameters();

List<Size> getPictureSize = mParam.getSupportedPictureSizes();
Size getPicSize = getPictureSize.get(5);

mParam.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
mParam.setPictureSize(getPicSize.width, getPicSize.height);
mParam.setRotation(fixPictureOrientation());

myCamera.setParameters(mParam);

Display display = getWindowManager().getDefaultDisplay();

if (display.getRotation() == Surface.ROTATION_0)
myCamera.setDisplayOrientation(90);
else if (display.getRotation() == Surface.ROTATION_270)
myCamera.setDisplayOrientation(180);

// Display guide
displayGuide();
}
};

private int fixPictureOrientation()
{
Camera.CameraInfo info = new Camera.CameraInfo();
Camera.getCameraInfo(Camera.CameraInfo.CAMERA_FACING_BACK, info);
int rotation = getWindowManager().getDefaultDisplay().getRotation();
int degrees = 0;
switch (rotation)
{
case Surface.ROTATION_0 :
degrees = 0;
break; // Natural orientation
case Surface.ROTATION_90 :
degrees = 90;
break; // Landscape left
case Surface.ROTATION_180 :
degrees = 180;
break;// Upside down
case Surface.ROTATION_270 :
degrees = 270;
break;// Landscape right
}

int rotate = (info.orientation - degrees + 360) % 360;

return rotate;
}

private PictureCallback mPictureListener = new PictureCallback()
{
@Override
public void onPictureTaken(byte[] data, Camera camera)
{
String fileName = "sample_" + (System.currentTimeMillis() / 1000) + ".jpg";

try
{
File file = new File(PATH + "/" + fileName);

FileOutputStream out = new FileOutputStream(file);
out.write(data);

if (out != null)
out.close();
}
catch (Exception e)
{
new ErrLog(e.toString());
}

// Refreshing SD card
new UpdateSDCard().mediaScan(TakePicture.this, PATH);
// Stop Preview
myCamera.stopPreview();

Intent i = new Intent(TakePicture.this, PreviewPictureActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
i.putExtra("orient", orient);
startActivity(i);
}
};

public void takePicture(View v)
{
if(myCamera != null)
myCamera.takePicture(shutterCallback, null, mPictureListener);
}

public void cancelActivity(View v)
{
Intent i = new Intent(TakePicture.this, MenuActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(i);
TakePicture.this.finish();
}

private void displayGuide()
{
GetScreenSize size = new GetScreenSize();

final Dialog dialog = new Dialog(TakePicture.this);
dialog.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(R.layout.guide_layout_picture);
dialog.setCanceledOnTouchOutside(false);
dialog.setCancelable(false);

ImageView close = (ImageView) dialog.findViewById(R.id.imageView1);
close.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
dialog.dismiss();

if(myCamera == null)
{
myCamera = Camera.open();
}

myCamera.startPreview();
}
});

dialog.show();

WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
Window window = dialog.getWindow();
lp.copyFrom(window.getAttributes());
// This makes the dialog take up the full width
lp.width = (int) (size.getScreenW() * 0.8F);
lp.height = (int) (size.getScreenH() * 0.7F);

window.setAttributes(lp);
}
}

这是输出日志

11-07 11:14:28.998: E/AndroidRuntime(1502): 致命异常: main11-07 11:14:28.998: E/AndroidRuntime(1502): java.lang.RuntimeException: 无法连接到相机服务11-07 11:14:28.998:E/AndroidRuntime(1502):在 android.hardware.Camera.native_setup( native 方法)11-07 11:14:28.998: E/AndroidRuntime(1502): 在 android.hardware.Camera.(Camera.java:371)11-07 11:14:28.998: E/AndroidRuntime (1502): 在 android.hardware.Camera.open (Camera.java:344)11-07 11:14:28.998: E/AndroidRuntime(1502): 在 main_app.TakePicture$4.onClick(TakePicture.java:236)11-07 11:14:28.998: E/AndroidRuntime(1502): 在 android.view.View.performClick(View.java:4203)11-07 11:14:28.998: E/AndroidRuntime(1502): 在 android.view.View$PerformClick.run(View.java:17189)11-07 11:14:28.998: E/AndroidRuntime (1502): 在 android.os.Handler.handleCallback (Handler.java:615)11-07 11:14:28.998: E/AndroidRuntime (1502): 在 android.os.Handler.dispatchMessage (Handler.java:92)11-07 11:14:28.998: E/AndroidRuntime(1502): 在 android.os.Looper.loop(Looper.java:137)11-07 11:14:28.998: E/AndroidRuntime(1502): 在 android.app.ActivityThread.main(ActivityThread.java:4961)11-07 11:14:28.998:E/AndroidRuntime(1502):在 java.lang.reflect.Method.invokeNative( native 方法)11-07 11:14:28.998: E/AndroidRuntime(1502): 在 java.lang.reflect.Method.invoke(Method.java:511)11-07 11:14:28.998: E/AndroidRuntime(1502): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1004)11-07 11:14:28.998: E/AndroidRuntime (1502): 在 com.android.internal.os.ZygoteInit.main (ZygoteInit.java:771)11-07 11:14:28.998: E/AndroidRuntime(1502): 在 dalvik.system.NativeStart.main(Native Method)

最佳答案

好的,伙计们。我想我发现了问题。问题是 myCamera = getCameraInstance(); onCreate 方法中的行,所以我删除了该行,相机不再失败。希望这对其他人有帮助。

关于Android Camera 第二次拍摄失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26792616/

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