Android   发布时间:2022-04-28  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了android – 旋转手机快速180度,相机预览颠倒大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我有自定义相机应用程序.当我将手机旋转90度时,相机预览工作正常.但是当我将手机快速旋转180度时,相机预览会颠倒过来.有没有解决方案……

这是我的代码如下:

public class CustomcatameraActivity extends Activity implements
    SurfaceHolder.CallBACk {

Camera camera;
SurfaceView surfaceView;
SurfaceHolder surfaceHolder;
Boolean previewing = false;
LayoutInflater controlInflater = null;
private Sensor mOrientaion1;
int cameraId = 0;
public final String TAG = "Customcatamera";
private SensoRMANager sensoRMANager;

@Override
public void onCreate(Bundle savedInstanceStatE) {
    super.onCreate(savedInstanceStatE);

    requestWindowFeature(Window.FEATURE_NO_titlE);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);

    setContentView(R.layout.main);

    context = this;

    sensoRMANager = (SensoRMANager) getSystemservice(SENSOR_serviCE);
    mOrientaion1 = sensoRMANager.getDefaultSensor(Sensor.TYPE_ORIENTATION);

    // setrequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

    imageView = (ImageView) findViewById(R.id.imgError);

    getWindow().setFormat(PixelFormat.UNKNowN);
    surfaceView = (SurfaceView) findViewById(R.id.camerapreview);
    surfaceHolder = surfaceView.getHolder();
    surfaceHolder.addCallBACk(this);
    surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

    controlInflater = LayoutInflater.from(getBaseContext());
    View viewControl = controlInflater.inflate(R.layout.custom,null);
    LayoutParams layoutParamsControl = new LayoutParams(
            LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT);

    Button btn1 = (Button) viewControl.findViewById(R.id.button01);
    Button btn2 = (Button) viewControl.findViewById(R.id.button02);

    btn1.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {
            // Toast.makeText(context,"1111111111111111111111111",// Toast.LENGTH_SHORT).show();
            camera.takePicture(null,null,mPicturE);

            Constant.rotationValueForCamera = Constant.rotationValue;
        }
    });

    btn2.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {
            // Toast.makeText(context,"22222222222222222222222222",// Toast.LENGTH_SHORT).show();
            Log.e("0 imagePickerStatus",Constant.imagePickerStatus + "");

            Constant.imagePickerStatus = 0;

            Log.e("0 imagePickerStatus",Constant.imagePickerStatus + "");

            finish();
        }
    });

    this.addContentView(viewControl,layoutParamsControl);

    int ot = getresources().getConfiguration().orientation;

    if (Configuration.oRIENTATION_LANDSCAPE == ot) {
        imageView.setVisibility(View.GONE);
        Log.e("ori1111","land");
    } else {
        imageView.setVisibility(View.VISIBLE);
        Log.e("ori111","port");
    }
}

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);

    // checks the orientation of the screen
    if (newConfig.orientation == Configuration.oRIENTATION_LANDSCAPE) {
        // Toast.makeText(this,"landscape",Toast.LENGTH_SHORT).show();
        findViewById(R.id.button01).setVisibility(View.VISIBLE);
        findViewById(R.id.button02).setVisibility(View.VISIBLE);
        imageView.setVisibility(View.GONE);
        Log.e("ori","land");
    } else if (newConfig.orientation == Configuration.oRIENTATION_PORTraiT) {
        // Toast.makeText(this,"porTrait",Toast.LENGTH_SHORT).show();
        findViewById(R.id.button01).setVisibility(View.INVISIBLE);
        findViewById(R.id.button02).setVisibility(View.INVISIBLE);
        imageView.setVisibility(View.VISIBLE);
        Log.e("ori","port");
    }
}

public String getPollDeviceAttitude() {

    return Constant.rotationValueForCamera;
}

private SensorEventListener sensorEventListener = new SensorEventListener() {

    public void onAccuracyChanged(Sensor sensor,int accuracy) {

    }
};

protected void onPause() {
    super.onPause();

    sensoRMANager.unregisterListener(sensorEventListener);

}

@Override
public void onResume() {
    super.onResume();

    sensoRMANager.registerListener(sensorEventListener,sensoRMANager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),SensoRMANager.SENSOR_DELAY_NORMAL);
    sensoRMANager.registerListener(sensorEventListener,sensoRMANager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD),sensoRMANager.getDefaultSensor(Sensor.TYPE_ORIENTATION),SensoRMANager.SENSOR_DELAY_NORMAL);

    if (Constant.isCapturedOk) {
        Constant.isCapturedOk = false;

        finish();
    }

}

PictureCallBACk mPicture = new PictureCallBACk() {
    @Override
    public void onPictureTaken(byte[] data,Camera camera) {

        Log.e("Camrera","22222222222222222");
        BitmapFactory.options bfo = new BitmapFactory.options();
        bfo.inDither = false;
        // bfo.inJustDecodeBounds = true;
        bfo.inPurgeable = true;
        bfo.inTempStorage = new byte[16 * 1024];

        Intent intent = new Intent(context,PreviewActivity.class);
        // intent.putExtra("data",data);
        Bitmap bitmapPicture = BitmapFactory.decodeByteArray(data,data.length,bfo);
        Matrix matrix = new Matrix();
        if (Constant.result == 180) {
            matrix.postRotate(270);
        }
        if (Constant.result == 270) {
            matrix.postRotate(180);
        }
        int height = bitmapPicture.getHeight();
        int width = bitmapPicture.getWidth();
        Bitmap scaledBitmap = Bitmap.createScaledBitmap(bitmapPicture,height,width,truE);
        Bitmap rotatedBitmap = Bitmap.createBitmap(scaledBitmap,scaledBitmap.getWidth(),scaledBitmap.getHeight(),matrix,truE);
        ByteArrayOutputStream blob = new ByteArrayOutputStream();
        Log.e("Camrera1","22222222222222222");
        rotatedBitmap.compress(CompressFormat.JPEG,50 /* ignored for PNG */,blob);
        byte[] bitmaPDAta = blob.toByteArray();
        Constant.imageData = bitmaPDAta;
        Log.e("Camrera2","22222222222222222");
        startActivity(intent);

    }
};
@Override
public void surfaceChanged(SurfaceHolder holder,int format,int width,int height) {
    if (previewing) {
        camera.stopPreview();
        previewing = false;
    }

    if (camera != null) {
        try {
            camera.setPreviewDisplay(holder);
            camera.startPreview();
            setCameraDisplayOrientation(this,cameraId,camera);
            previewing = true;
        } catch (Exception E) {
            e.printStackTrace();
        }
    }
}

public static void setCameraDisplayOrientation(Activity activity,int cameraId,android.hardware.Camera camera) {
    android.hardware.Camera.CameraInfo info = new android.hardware.Camera.CameraInfo();
    android.hardware.Camera.getCameraInfo(cameraId,info);
    int rotation = activity.getWindowManager().getDefaultDisplay()
            .getRotation();
    int degrees = 0;
    switch (rotation) {
    case Surface.ROTATION_0:
        degrees = 0;
        Constant.result = 0;
        break;
    case Surface.ROTATION_90:
        degrees = 90;
        Constant.result = 90;
        break;
    case Surface.ROTATION_180:
        degrees = 180;
        Constant.result = 180;
        break;
    case Surface.ROTATION_270:
        degrees = 270;
        Constant.result = 270;
        break;
    }

    int result;
    if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
        result = (info.orientation + degrees) % 360;
        result = (360 - result) % 360; // compensate the mirror
    } else { // BACk-facing
        result = (info.orientation - degrees + 360) % 360;
    }
    camera.setDisplayOrientation(result);
}

@Override
public void surfaceCreated(SurfaceHolder holder) {
    camera = Camera.open();
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
    camera.stopPreview();
    camera.release();
    camera = null;
    previewing = false;
}

@Override
protected void onStop() {
    super.onStop();

    Log.e("Tab","Stoping");
}

@Override
public Boolean onKeyDown(int keyCode,KeyEvent event) {

    if (keyCode == KeyEvent.KEYCODE_BACK) {

        return true;

    }
    return super.onKeyDown(keyCode,event);

}

}

解决方法

您可以使用 OrientationEventListener触发重新计算相机旋转.

添加到您的活动:

private OrientationEventListener orientationListener = null;

到onCreate():

orientationListener = new OrientationEventListener(this) {
    public void onOrientationChanged(int orientation) {
        setCameraDisplayOrientation(CustomcatameraActivity.this,camera);
    }
};

到surfaceCreated():

orientationListener.enable();

到surfaceDestroyed():

orientationListener.disable();

现在,它几乎可以工作.要使setCameraDisplayOrientation()更健壮,

>添加相机检查!= null>如果自上次调用函数后结果发生更改,则仅调用camera.setDisplayOrientation(result)(或执行任何繁重的操作).

大佬总结

以上是大佬教程为你收集整理的android – 旋转手机快速180度,相机预览颠倒全部内容,希望文章能够帮你解决android – 旋转手机快速180度,相机预览颠倒所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。