独立的Android相机应用程序工作,但当所述相机应用程序代码被另一个活动调用时不起作用

时间:2011-05-04 20:18:45

标签: android file-io android-activity android-camera surfaceholder

我一起构建了一个简单的相机应用程序(来自互联网上的各种来源,使用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 :(得分:0)

我修好了。

显然我制作的原型是使用比版本4更早的android api版本。

并且不需要以下许可:

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

我刚添加它,现在效果很好。

感谢。