有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java摄像头活动不工作,设置参数失败

在启动应用程序时,我正在尝试打开相机活动。 也就是说,当我启动应用程序时,它会通过前置摄像头捕捉图像。 然而,当我启动应用程序时,我发现了一个错误。 我实际上是在尝试运行从github获得的代码;然而,它只是强制重新启动应用程序

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.安卓myway.demo.capturecameraimage, PID: 5697
java.lang.RuntimeException: setParameters failed
  at 安卓.hardware.Camera.native_setParameters(Native Method)
  at 安卓.hardware.Camera.setParameters(Camera.java:1966)
  at com.安卓myway.demo.capturecameraimage.CameraView.surfaceChanged(CameraView.java:140)
  at 安卓.view.SurfaceView.updateWindow(SurfaceView.java:634)
  at 安卓.view.SurfaceView$3.onPreDraw(SurfaceView.java:161)
  at 安卓.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:944)
  at 安卓.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2205)
  at 安卓.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1250)
  at 安卓.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6311)
  at 安卓.view.Choreographer$CallbackRecord.run(Choreographer.java:871)
  at 安卓.view.Choreographer.doCallbacks(Choreographer.java:683)
  at 安卓.view.Choreographer.doFrame(Choreographer.java:619)
  at 安卓.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:857)
  at 安卓.os.Handler.handleCallback(Handler.java:751)
  at 安卓.os.Handler.dispatchMessage(Handler.java:95)
  at 安卓.os.Looper.loop(Looper.java:241)
  at 安卓.app.ActivityThread.main(ActivityThread.java:6217)
  at java.lang.reflect.Method.invoke(Native Method)
  at com.安卓.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
  at com.安卓.internal.os.ZygoteInit.main(ZygoteInit.java:755)

摄影师。爪哇

public class CameraView extends Activity implements SurfaceHolder.Callback, OnClickListener{
    private static final String TAG = "CameraTest";
    Camera mCamera;
    boolean mPreviewRunning = false;

    @SuppressWarnings("deprecation")
    public void onCreate(Bundle icicle){
        super.onCreate(icicle);
        Log.e(TAG, "onCreate");

        getWindow().setFormat(PixelFormat.TRANSLUCENT);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setContentView(R.layout.cameraview);
        ImageView img = (ImageView) findViewById(R.id.blankImage);

        if(CaptureCameraImage.isBlack)
            img.setBackgroundResource(安卓.R.color.black);
        else
            img.setBackgroundResource(安卓.R.color.white);

        mSurfaceView = (SurfaceView) findViewById(R.id.surface_camera);
        mSurfaceView.setOnClickListener(this);
        mSurfaceHolder = mSurfaceView.getHolder();
        mSurfaceHolder.addCallback(this);
        mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState){
        super.onRestoreInstanceState(savedInstanceState);
    }


    Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() {

        public void onPictureTaken(byte[] data, Camera camera) {
            // TODO Auto-generated method stub
            if (data != null){
                //Intent mIntent = new Intent();
                //mIntent.putExtra("image",imageData);

                mCamera.stopPreview();
                mPreviewRunning = false;
                mCamera.release();

                try{
                    BitmapFactory.Options opts = new BitmapFactory.Options();
                    Bitmap bitmap= BitmapFactory.decodeByteArray(data, 0, data.length,opts);
                    bitmap = Bitmap.createScaledBitmap(bitmap, 300, 300, false);
                    int width = bitmap.getWidth();
                    int height = bitmap.getHeight();
                    int newWidth = 300;
                    int newHeight = 300;

                    // calculate the scale - in this case = 0.4f
                    float scaleWidth = ((float) newWidth) / width;
                    float scaleHeight = ((float) newHeight) / height;

                    // createa matrix for the manipulation
                    Matrix matrix = new Matrix();
                    // resize the bit map
                    matrix.postScale(scaleWidth, scaleHeight);
                    // rotate the Bitmap
                    matrix.postRotate(-90);
                    Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0,
                            width, height, matrix, true);
                    CaptureCameraImage.image.setImageBitmap(resizedBitmap);

                }catch(Exception e){
                    e.printStackTrace();
                }
                //StoreByteImage(mContext, imageData, 50,"ImageName");
                //setResult(FOTO_MODE, mIntent);
                setResult(585);
                finish();
            }
        }
    };

    protected void onResume(){
        Log.e(TAG, "onResume");
        super.onResume();
    }

    protected void onSaveInstanceState(Bundle outState){
        super.onSaveInstanceState(outState);
    }

    protected void onStop(){
        Log.e(TAG, "onStop");
        super.onStop();
    }

    @TargetApi(9)
    public void surfaceCreated(SurfaceHolder holder){
        Log.e(TAG, "surfaceCreated");
        mCamera = Camera.open(CaptureCameraImage.cameraID);
    }

    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
        Log.e(TAG, "surfaceChanged");

        // XXX stopPreview() will crash if preview is not running
        if (mPreviewRunning){
            mCamera.stopPreview();
        }

        Camera.Parameters p = mCamera.getParameters();
        p.setPreviewSize(300, 300);

        if(CaptureCameraImage.cameraID == 0){
            String stringFlashMode = p.getFlashMode();
            if (stringFlashMode.equals("torch"))
                p.setFlashMode("on"); // Light is set off, flash is set to normal 'on' mode
            else
                p.setFlashMode("torch");
        }

        mCamera.setParameters(p);
        try{
            mCamera.setPreviewDisplay(holder);
        }catch (Exception e){
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        mCamera.startPreview();
        mPreviewRunning = true;
        mCamera.takePicture(null, mPictureCallback, mPictureCallback);
    }

    public void surfaceDestroyed(SurfaceHolder holder) {
        Log.e(TAG, "surfaceDestroyed");
        //mCamera.stopPreview();
        //mPreviewRunning = false;
        //mCamera.release();
    }

    private SurfaceView mSurfaceView;
    private SurfaceHolder mSurfaceHolder;

    public void onClick(View v) {
        // TODO Auto-generated method stub
        mCamera.takePicture(null, mPictureCallback, mPictureCallback);
    }

}

摄影师。爪哇

public class CaptureCameraImage extends Activity {

    public static int cameraID = 0;
    public static boolean isBlack = true;
    public static ImageView image;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activitycapturecameraimage);
        image = (ImageView) findViewById(R.id.imgView);
    }

    public void onFrontClick(View v){
        RadioButton rdbBlack = (RadioButton) findViewById(R.id.rdb_black);
        if(rdbBlack.isChecked()){
            isBlack = true;
        }else{
            isBlack = false;
        }
        cameraID = 1;
        Intent i = new Intent(CaptureCameraImage.this,CameraView.class);
        startActivityForResult(i, 999);
    }

    public void onBackClick(View v){
        RadioButton rdbBlack = (RadioButton) findViewById(R.id.rdb_black);
        if(rdbBlack.isChecked()){
            isBlack = true;
        }else{
            isBlack = false;
        }
        cameraID = 0;
        Intent i = new Intent(CaptureCameraImage.this,CameraView.class);
        startActivityForResult(i, 999);
    }

}

共 (1) 个答案

  1. # 1 楼答案

    尽管有些设备支持任意预览尺寸,但有些设备不支持。因此,你必须在你的surfaceChanged方法上这样做

    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
        Camera.Parameters param = camera.getParameters();
        List<Camera.Size> previewSizes = param.getSupportedPreviewSizes();
        Camera.Size ps = // .... select a previewSize 
        param.setPreviewSize(ps.width, ps.height);
        camera.setParameters(param);
        camera.startPreview();
    }
    

    look here