Я собрал простое приложение для камеры (из разных источников в Интернете, используя SurfaceHolder) в качестве прототипа, чтобы позже интегрировать его в более крупный проект.
Приложение работает очень хорошо. Он не падает и сохраняет изображения должным образом.
Я начал интегрировать его с большим проектом. Теперь он запускается из другого вида деятельности (вместо того, чтобы быть основным видом деятельности). Он по-прежнему показывает ожидаемый вид камеры и не вылетает.
Однако ни одна из сделанных фотографий не сохранится.
Код приложения независимой камеры и действия встроенной камеры идентичны.
Я протестировал код встроенной камеры, не вызывая finish () и не запуская другие действия (просто чтобы убедиться, что он выводит изображение правильно).
Но это все равно не работает.
Кто-нибудь сталкивался с этим раньше? Спасибо.
Это исходный код действия камеры:
public class CameraViewActivity extends Activity implements
SurfaceHolder.Callback, OnClickListener {
private static final String SD_CARD_LOC = "/sdcard/";
private static final String FILE_NAME = "image";
private static final String JPEG_FORMAT = ".jpg";
private static final String TAG = "CameraViewActivity";
private Context context = this;
private SurfaceView surfaceView;
private SurfaceHolder surfaceHolder;
Camera camera;
boolean isPreviewRunning = false;
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
Log.e(TAG, "onCreate");
//Bundle extras = getIntent().getExtras();
getWindow().setFormat(PixelFormat.TRANSLUCENT);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.camera_view_layout);
surfaceView = (SurfaceView) findViewById(R.id.surface_camera);
surfaceView.setOnClickListener(this);
surfaceHolder = surfaceView.getHolder();
surfaceHolder.addCallback(this);
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
}
Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() {
public void onPictureTaken(byte[] imageByteData, Camera c) {
if (imageByteData != null) {
Intent intent = new Intent(CameraViewActivity.this,SharePhotoActivity.class);
if(saveByteImage(context, imageByteData, 50)){
camera.startPreview();
startActivity(intent);
finish();
}
}
}
};
@Override
public void onResume() {
Log.e(TAG, "onResume");
super.onResume();
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
}
@Override
public void onStop() {
Log.e(TAG, "onStop");
super.onStop();
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
Log.e(TAG, "surfaceCreated");
camera = Camera.open();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
Log.e(TAG, "surfaceChanged");
if (isPreviewRunning) {
camera.stopPreview();
}
Camera.Parameters parameters = camera.getParameters();
int height = parameters.getPreviewSize().height;
int width = parameters.getPreviewSize().width;
Display display = ((WindowManager) getSystemService(WINDOW_SERVICE))
.getDefaultDisplay();
switch (display.getRotation()) {
case Surface.ROTATION_0: {
parameters.setPreviewSize(width, height);
camera.setDisplayOrientation(90);
}
break;
case Surface.ROTATION_180: {
parameters.setPreviewSize(width, height);
}
break;
case Surface.ROTATION_270: {
parameters.setPreviewSize(width, height);
camera.setDisplayOrientation(180);
}
break;
case Surface.ROTATION_90: {
parameters.setPreviewSize(width, height);
}
break;
}
camera.setParameters(parameters);
try {
camera.setPreviewDisplay(holder);
camera.startPreview();
isPreviewRunning = true;
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
Log.e(TAG, "surfaceDestroyed");
camera.stopPreview();
isPreviewRunning = false;
camera.release();
}
@Override
public void onClick(View arg0) {
camera.takePicture(null, mPictureCallback, mPictureCallback);
}
public static boolean saveByteImage(Context context, byte[] imageByteData, int quality) {
StringBuffer fileUri = new StringBuffer();
fileUri.append(SD_CARD_LOC);
fileUri.append(FILE_NAME);
fileUri.append("-");
fileUri.append(System.currentTimeMillis());
fileUri.append(JPEG_FORMAT);
try {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 5;
Bitmap bitmapImage = BitmapFactory.decodeByteArray(imageByteData, 0, imageByteData.length, options);
FileOutputStream fos = new FileOutputStream(fileUri.toString());
BufferedOutputStream bos = new BufferedOutputStream(fos);
bitmapImage.compress(CompressFormat.JPEG, quality, bos);
bos.flush();
bos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return true;
}
}
Обновление: я создал новый проект для Android с двумя действиями: основным и видом с камеры. Основное действие просто запускает действие просмотра камеры с помощью нажатия кнопки. И все равно не будет сохранять изображения.