Android Camera2 APIを使用しており、15枚の画像を連続して撮影したいと考えています。問題は、いくつかの写真を正常に撮影するが、6〜8枚の写真の後にクラッシュすることである。ここでAndroidアプリケーションがクラッシュすることがありますが、しばらく時間がかかり、クラッシュしないで良い状態になります。
はログです:
レガシー-CameraDevice-JNI:LegacyCameraDevice_nativeGetSurfaceId: 表面からネイティブのサーフェスを取得できませんでした。 E/AndroidRuntime:FATAL 例外:スレッド-1095 プロセス:com.example.grobomac.traindriver、PID:11690 java.lang.IllegalArgumentException:サーフェスに有効なネイティブがありません サーフェス。 でandroid.hardware.camera2.legacy.LegacyCameraDevice.nativeGetSurfaceId(ネイティブ 方法) でandroid.hardware.camera2.legacy.LegacyCameraDevice.getSurfaceId(LegacyCameraDevice.java:658) android.hardware.camera2.legacyで android.hardware.Camera $ EventHandler.handleMessageで android.hardware.camera2.legacy.RequestThreadManager $ 2.onPictureTaken(RequestThreadManager.java:225) (Camera.javaで.LegacyCameraDevice.containsSurfaceId(LegacyCameraDevice.java:678) : 1272) android.os.Han android.hardware.camera2.legacy.CameraDeviceUserShim $ CameraLooper.run(CameraDeviceUserShim.java:136) でdler.dispatchMessage(Handler.java:111)android.os.Looper.loop(Looper.java:207)で java.lang.Thread.run(Thread.java:818)で 10-04 14:26:59.566 11690から11690/E/AndroidCameraApi com.example.grobomac.traindriver:
とコードI onPause使用:
public void onImageAvailable(ImageReader reader) {
Image image = null;
try {
image = reader.acquireLatestImage();
ByteBuffer buffer = image.getPlanes()[0].getBuffer();
byte[] bytes = new byte[buffer.capacity()];
buffer.get(bytes);
save(bytes);
mBitmapToSave1 = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
mBitmapToSave = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
Bitmap scaled = Bitmap.createScaledBitmap(mBitmapToSave, width, height, true);
int w = scaled.getWidth();
int h = scaled.getHeight();
// Setting post rotate to 90
Matrix mtx = new Matrix();
mtx.postRotate(-180);
// Rotating Bitmap
mBitmapToSave = Bitmap.createBitmap(scaled, 0, 0, w, h, mtx, true);
// mBitmapToSave = Bitmap.createBitmap(width+rowPadding/pixelStride,height, Bitmap.Config.RGB_565);
// mBitmapToSave.copyPixelsToBuffer(buffer);
if (detector.isOperational() && mBitmapToSave != null) {
Frame frame = new Frame.Builder().setBitmap(mBitmapToSave).build();
SparseArray<Face> faces = detector.detect(frame);
for (index = 0; index < faces.size(); ++index) {
Face face = faces.valueAt(index);
}
if (faces.size() == 0) {
MediaPlayer mediaPlayer = MediaPlayer.create(getApplicationContext(), R.raw.not);
mediaPlayer.start();
//Toast.makeText(AndroidCamera2API.this, "Face Not detected Adjust Camera Properly", Toast.LENGTH_SHORT).show();
} else {
c++;
Toast.makeText(AndroidCamera2API.this, "Face Found " + "\n", Toast.LENGTH_SHORT).show();
//Toast.makeText(AndroidCamera2API.this, "Saved:" + file, Toast.LENGTH_SHORT).show();
setFileToUpload();
//file.delete();
// if(file.exists()){
//file.getCanonicalFile().delete();
// if(file.exists()){
// getApplicationContext().deleteFile(file.getName());
// }
// }
a++;
Toast.makeText(AndroidCamera2API.this, "" +c, Toast.LENGTH_SHORT).show();
// Toast.makeText(AndroidCamera2API.this, "completed" , Toast.LENGTH_SHORT).show();
}
}
}catch(FileNotFoundException e){
e.printStackTrace();
} catch(IOException e){
e.printStackTrace();
} finally{
if (image != null) {
image.close();
}
}
}
私はOnResumeで写真を撮る: