【问题标题】:Application works on android 2.2, but not on 2.3应用程序适用于 android 2.2,但不适用于 2.3
【发布时间】:2012-03-04 19:23:15
【问题描述】:

我想编写一种相机应用程序,它使用 SurfaceView 上显示的相机实时预览,预览上方的另一层是蒙版(有趣的图片等)。点击显示拍照功能。问题是该应用程序在 adroid 2.2 上运行得很好,但在 2.3 上不起作用(使用手机和模拟器)。我有在 Mainfest 中使用相机的权限。

这是我的活动:

package funny.camera;

import android.app.Activity;
import android.content.pm.ActivityInfo;
import android.hardware.Camera;
import android.hardware.Camera.PictureCallback;
import android.hardware.Camera.ShutterCallback;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.ViewGroup.LayoutParams;

public class CameraActivity extends Activity{

    private CamScreen cam;
    private LayoutInflater controlInflater = null;
    SurfaceView surfaceView;
    SurfaceHolder surfaceHolder;
    View touchscreen;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        cam = new CamScreen(this);

        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 

        setContentView(R.layout.camscreen);

        surfaceView = (SurfaceView)findViewById(R.id.camerapreview);
        surfaceHolder = surfaceView.getHolder();
        surfaceHolder.addCallback(cam);
        surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);     

        controlInflater = LayoutInflater.from(getBaseContext());

        View viewControl = controlInflater.inflate(R.layout.camoverlay, null);
        LayoutParams layoutParamsControl = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
        addContentView(viewControl, layoutParamsControl);
        View viewTouch = controlInflater.inflate(R.layout.camtouch, null);
        addContentView(viewTouch, layoutParamsControl);  

        viewControl.setOnClickListener(new View.OnClickListener() {         
            @Override
            public void onClick(View v) {
                cam.camera.takePicture(shutterCallback, rawCallback, jpegCallback);
            }
        });
    }
    ShutterCallback shutterCallback = new ShutterCallback(){

        @Override
        public void onShutter() {

        }};

    PictureCallback rawCallback = new PictureCallback(){

        @Override
        public void onPictureTaken(byte[] arg0, Camera arg1) {

        }};

    PictureCallback jpegCallback = new PictureCallback(){

        @Override
        public void onPictureTaken(byte[] _data, Camera _camera) {

        }};
}

以及与相机预览相关的类

public class CamScreen extends SurfaceView implements SurfaceHolder.Callback {

    //SurfaceHolder sHolder;
    //SurfaceView surfaceView;
    Camera camera;

    CamScreen(Context context) {
    super(context);    
    }

    public void surfaceCreated(SurfaceHolder holder) {
        // Open the camera and start viewing    
        camera = Camera.open();

        try {
           camera.setPreviewDisplay(holder);
        } catch (IOException exception) {
            camera.release();
            camera = null;
        }
    }

    public void surfaceDestroyed(SurfaceHolder holder) {
        // Kill all our crap with the surface
        camera.stopPreview();
        camera.release();
        camera = null;
    }

    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
        // Modify parameters to match size.
        Camera.Parameters params = camera.getParameters();
        params.setPreviewSize(w, h);
        params.setPictureFormat(PixelFormat.JPEG);
        camera.setParameters(params);

        camera.startPreview();
    }
}

任何想法有什么问题吗?我想如果应用程序可以在较旧的 android 版本上运行,它也可以在新版本上运行。

谢谢

【问题讨论】:

标签: android android-2.2-froyo android-2.3-gingerbread


【解决方案1】:

API 级别 9 已打开公共静态相机 (int cameraId) 其中cameraid定义了前后摄像头。请更改api级别的android jar并将方法public Camera.open()更改为Camera open(int cameraId)

【讨论】:

  • 即使使用更高的 API 和 Camera.open(cameraId) 也不能防止应用程序崩溃。此外,API lvl 9+ 中的 camera.open() 不应该默认打开后置摄像头吗?
  • 您是否调试过您的应用程序崩溃或在哪一行发生崩溃............
  • 在更高级别更改 API 后,应用程序可以在模拟器上运行,但一直在手机中
  • 那么您是否检查过您是否在清单中添加了所需的权限,或者检查您的手机是否存在一些技术问题,请检查其他应用上的相同应用......
猜你喜欢
  • 2012-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-03
相关资源
最近更新 更多