Независимое приложение камеры Android работает, но не работает, когда указанный код приложения камеры вызывается другим действием - PullRequest
0 голосов
/ 05 мая 2011

Я собрал простое приложение для камеры (из разных источников в Интернете, используя 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 с двумя действиями: основным и видом с камеры. Основное действие просто запускает действие просмотра камеры с помощью нажатия кнопки. И все равно не будет сохранять изображения.

1 Ответ

0 голосов
/ 05 мая 2011

Я исправил это.

Видимо, прототип, который я сделал, использовал версию Android API, более раннюю, чем версия 4.

И не требует следующего разрешения:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> 

Я только что добавил его, и теперь он работает хорошо.

Спасибо.

...