며칠 동안 문제를 해결하기 위해 주변을 둘러 보았습니다. 지금 당장은 완전히 두려워하고 있습니다. 모든 것을 시도했는데 왜 내 카메라 앱이 나를 죽은 서비스 예외로 설정하는지 이유를 찾지 못했습니다.카메라 서비스를 호스팅하는 프로세스가 예기치 않게 사망했습니다.
여기에 해당합니다. 저는 이미 확인한 HDR jni 라이브러리를 사용하고 있습니다.이 라이브러리는 원시 메모리의 메모리가 아니며 jni 문제가 아닙니다.
난 그냥 CaptureResult에 기다리고있어 센서가 이미 정확한 노출을 한 후 내 메서드를 호출 여부를 확인하기 위해 나에게 AE_CONVERGED_STATE를 반환 :
Log.performanceEnd("YUV capture");
Log.d(TAG, "[onImageAvailable] YUV capture, mBurstCount: " + mBurstCount);
Image image = imageReader.acquireNextImage();
if (mBackgroundHandler != null) {
mBackgroundHandler.post(new YuvCopy(image, mBurstCount));
}
mBurstCount++;
if (mBurstState == BURST_STATE_HDR) {
switch (mBurstCount) {
case 1:
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_EXPOSURE_COMPENSATION, HDR_EXPOSURE_COMPENSATION_VALUE_HIGH);
break;
case 2:
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_EXPOSURE_COMPENSATION, HDR_EXPOSURE_COMPENSATION_VALUE_LOW);
break;
case 3:
//Restore exposure compensation value
mCaptureCallback = mPhotoCaptureCallback;
mSettingsManager.setExposureCompensation(mPreviewRequestBuilder);
mActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
onPictureCaptured();
}
});
unlockFocus();
break;
}
if (mBurstCount != 3) {
updatePreviewSession();
}
//Finish HDR session
if (mBurstCount < YUV_BURST_LIMIT) mHdrState = STATE_PICTURE_TAKEN;
}
을 그래서, 문제는 내 코드에있을해야
/**
* Transform YUV420 to NV21 readable frames
*/
private class YuvCopy implements Runnable {
private final Image mImage;
private final int mPictureIndex;
public YuvCopy(Image image, int index) {
mImage = image;
mPictureIndex = index;
}
@Override
public void run() {
if (mImage != null) {
if (mImage.getWidth() * mImage.getHeight() > 0) {
Image.Plane[] planes = mImage.getPlanes();
long startCopy = System.currentTimeMillis();
int width = mImage.getWidth();
int height = mImage.getHeight();
int ySize = width * height;
ByteBuffer yBuffer = mImage.getPlanes()[0].getBuffer();
ByteBuffer uvBuffer = mImage.getPlanes()[1].getBuffer();
ByteBuffer vuBuffer = mImage.getPlanes()[2].getBuffer();
byte[] mData = new byte[ySize + (ySize/2)];
yBuffer.get(mData, 0, ySize);
vuBuffer.get(mData, ySize, (ySize/2) - 1);
mData[mData.length - 1] = uvBuffer.get(uvBuffer.capacity() - 1);
mImage.close();
mHdrCaptureArray[mPictureIndex] = mData;
Log.i(TAG, "[YuvCopy|run] Time to Copy data: " + (System.currentTimeMillis() - startCopy) + "ms");
if (mPictureIndex == YUV_BURST_LIMIT - 1) {
startHdrProcessing();
} else {
mImage.close();
}
}
}
}
내가 세 사진의 총을 선택하고 내 JNI 라이브러리 내 병합 메소드를 호출
여기 내 YUV 방법입니다. 모든 jni 코드를 주석 처리하려고 시도했지만 여전히 발생하고 있습니다. 따라서 문제는 여기, YUV 메소드 또는 버스트 HDR 호출에 있어야합니다. 이 happends 때
마지막으로 여기 내 로그 오류입니다 :
01-01 12:30:27.531 21945-21957/com.myCamera W/AudioSystem: AudioFlinger server died!
01-01 12:30:27.532 21945-22038/com.myCamera W/AudioSystem: AudioPolicyService server died!
1-01 12:30:27.903 21945-21978/com.myCamera I/CameraManagerGlobal: Connecting to camera service
01-01 12:30:27.903 21945-21978/com.myCamera E/CameraManagerGlobal: Camera service is unavailable
01-01 12:30:27.903 21945-21978/com.myCamera W/System.err: android.hardware.camera2.CameraAccessException: Camera service is currently unavailable
01-01 12:30:29.103 21945-21945/com.myCamera W/System.err: android.hardware.camera2.CameraAccessException: Process hosting the camera service has died unexpectedly
때로는 그냥 2 사진, 때로는 300을했지만 결국, 그것은 여전히 일어나고. 또한 많은 시간 내 모든 장치가 거의 죽었고 어떤 작업이든 상관 없으므로 전화기를 재부팅해야합니다.
나는 누군가가 나를 도울 수 있기를 바란다. 왜냐하면 내가 시도한 모든 것을 완전히 버리고 나는 단지 하하하에서 죽기를 원하기 때문이다.
미리 감사드립니다.
나는 아주 비슷한 오류가 있었지만 그 이유는 틀 렸습니다. 나는 몇 시간 동안 정확한 이유를 찾으려고 노력했다. 그리고 결국 나는 당신이'잘못된 ImageReader 구성 '에 대해 설명하기 시작하는 몇 줄의 첫 번째 줄을 읽은 후에 그것을 발견했다. 제 경우에는 맞춤 플래시 라이트에 관한 것이 었습니다 ... 아이디어에 감사드립니다. –