我是android编程新手,以前从未使用过java,但我正在尝试创建一个应用程序,允许用户查看检查列表,并在必要时拍照。问题是,当我点击按钮打开相机时,我看到(失败)按钮附近,当我点击拍照时,应用程序停止并崩溃,错误消息如下。
设备操作系统版本代码:29设备版本代码名称:rel设备名称:三星sm-a011f版本代码:36版本名称:1.0软件包名称:com.app.kirby构建类型:发布
java.lang.nullpointerexception:尝试在空对象引用上调用虚拟方法“int android.hardware.camera2.cameracapturesession.capture(android.hardware.camera2.cameracapturesession$capturecallback,android.os.handler)”
---------堆栈跟踪---------
com.app.kirby.CameraActivity.lockFocus(CameraActivity.java:1749)
com.app.kirby.CameraActivity.onClick(CameraActivity.java:1191)
android.view.View.performClick(View.java:7862)
android.view.View.performClickInternal(View.java:7831)
android.view.View.access$3600(View.java:879)
android.view.View$PerformClick.run(View.java:29359)
android.os.Handler.handleCallback(Handler.java:883)
android.os.Handler.dispatchMessage(Handler.java:100)
android.os.Looper.loop(Looper.java:237)
android.app.ActivityThread.main(ActivityThread.java:8173)
java.lang.reflect.Method.invoke(Native Method)
com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:496)
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1100)
---------原因---------
cameraactivity.java第1191行的一部分如下:
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@SuppressLint("StringFormatInvalid")
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.snap:
cameraCapturedOrientation = detectOrientation;
if (isCamera2Support) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
if (CameraCharacteristics.LENS_FACING_FRONT == mCameraLensFacingDirection) {
captureStillPicture();
} else {
lockFocus();
}
}
} else {
try {
camera.takePicture(shutterCallback, rawCallback, jpegCallback);
} catch (NullPointerException e) {
e.printStackTrace();
} catch (RuntimeException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
break;
case R.id.next:
int totalCount = totalImageCount();
if (temp.size() == 0 || totalCount < 0) {
Toast.makeText(CameraActivity.this, getString(R.string.please_add_image), Toast.LENGTH_SHORT).show();
} else if (totalCount > Constants.IMAGE_COUNT) {
String number = numberFormat.format(Constants.IMAGE_COUNT);
Toast.makeText(CameraActivity.this, String.format(getString(R.string.error_msg_to_imgcount), number), Toast.LENGTH_SHORT).show();
} else if (selectedImages.size() == 0 && totalCount == 0) {
Toast.makeText(CameraActivity.this, getString(R.string.please_select_images), Toast.LENGTH_SHORT).show();
} else {
switch (from) {
case "edit": {
Intent i = new Intent();
i.putExtra("from", from);
itemMap.setPhotos(selectedImages);
i.putExtra("data", itemMap);
i.putExtra("from", from);
setResult(Activity.RESULT_OK, i);
finish();
}
break;
case "home": {
Intent i = new Intent(CameraActivity.this, AddProductDetail.class);
i.putExtra("from", from);
itemMap.setPhotos(selectedImages);
i.putExtra("data", itemMap);
i.putExtra("from", from);
startActivity(i);
finish();
}
break;
case "add": {
Intent i = new Intent(CameraActivity.this, AddProductDetail.class);
i.putExtra("from", from);
itemMap.setPhotos(selectedImages);
i.putExtra("data", itemMap);
i.putExtra("from", from);
// startActivity(i);
setResult(Activity.RESULT_OK, i);
finish();
}
break;
default: {
Intent i = new Intent(CameraActivity.this, AddProductDetail.class);
i.putExtra("from", from);
startActivity(i);
}
break;
}
}
break;
下面是cameraactivity.java第1749行的一部分:
/**
* Lock the focus as the first step for a still image capture.
*/
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
private void lockFocus() {
try {
// This is how to tell the camera to lock focus.
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER,
CameraMetadata.CONTROL_AF_TRIGGER_START);
// Tell #mCaptureCallback to wait for the lock.
mState = STATE_WAITING_LOCK;
mCaptureSession.capture(mPreviewRequestBuilder.build(), mCaptureCallback,
mBackgroundHandler);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
/**
* Unlock the focus. This method should be called when still image capture sequence is
* finished.
*/
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
private void unlockFocus() {
try {
// Reset the auto-focus trigger
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER,
CameraMetadata.CONTROL_AF_TRIGGER_CANCEL);
mCaptureSession.capture(mPreviewRequestBuilder.build(), mCaptureCallback,
mBackgroundHandler);
// After this, the camera will go back to the normal state of preview.
mState = STATE_PREVIEW;
mCaptureSession.setRepeatingRequest(mPreviewRequest, mCaptureCallback,
mBackgroundHandler);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
/**
* Run the precapture sequence for capturing a still image. This method should be called when
* we get a response in {@link #mCaptureCallback} from {@link #lockFocus()}.
*/
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
private void runPreCaptureSequence() {
try {
// This is how to tell the camera to trigger.
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER,
CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER_START);
// Tell #mCaptureCallback to wait for the precapture sequence to be set.
mState = STATE_WAITING_PRECAPTURE;
mCaptureSession.capture(mPreviewRequestBuilder.build(), mCaptureCallback,
mBackgroundHandler);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
private void setAutoFlash(CaptureRequest.Builder requestBuilder) {
if (mFlashSupported && flash) {
requestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_ALWAYS_FLASH);
requestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_SINGLE);
} else if (mFlashSupported) {
requestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON);
requestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_OFF);
}
}
完整文件下载地址:
cameraactivity.java
暂无答案!
目前还没有任何答案,快来回答吧!