我有自定义相机应用程序.当我将手机旋转90度时,相机预览工作正常.但是当我将手机快速旋转180度时,相机预览会颠倒过来.有没有解决方案……

这是我的代码如下:

public class CustomCameraActivity 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 = "CustomCamera";
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(CustomCameraActivity.this,camera);
    }
};

到surfaceCreated():

orientationListener.enable();

到surfaceDestroyed():

orientationListener.disable();

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

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

android – 旋转手机快速180度,相机预览颠倒的更多相关文章

  1. canvas中普通动效与粒子动效的实现代码示例

    canvas用于在网页上绘制图像、动画,可以将其理解为画布,在这个画布上构建想要的效果。本文详细的介绍了粒子特效,和普通动效进行对比,非常具有实用价值,需要的朋友可以参考下

  2. H5混合开发app如何升级的方法

    本篇文章主要介绍了H5混合开发app如何升级的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  3. canvas学习和滤镜实现代码

    这篇文章主要介绍了canvas学习和滤镜实现代码,利用 canvas,前端人员可以很轻松地、进行图像处理,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  4. localStorage的过期时间设置的方法详解

    这篇文章主要介绍了localStorage的过期时间设置的方法详解的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  5. 详解HTML5 data-* 自定义属性

    这篇文章主要介绍了详解HTML5 data-* 自定义属性的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  6. HTML5的postMessage的使用手册

    HTML5提出了一个新的用来跨域传值的方法,即postMessage,这篇文章主要介绍了HTML5的postMessage的使用手册的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  7. 教你使用Canvas处理图片的方法

    本篇文章主要介绍了教你使用Canvas处理图片的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  8. ios – Swift语言:如何调用SecRandomCopyBytes

    从Objective-C,我可以这样做:在Swift中尝试这个时,我有以下内容:但我得到这个编译器错误:data.mutableBytes参数被拒绝,因为类型不匹配,但我无法弄清楚如何强制参数.解决方法这似乎有效:

  9. 使用Firebase iOS Swift将特定设备的通知推送到特定设备

    我非常感谢PushNotifications的帮助.我的应用聊天,用户可以直接向对方发送短信.但是如果没有PushNotifications,它就没有多大意义.它全部设置在Firebase上.如何将推送通知从特定设备发送到特定设备?

  10. ios – NSData to Data swift 3

    如何将此代码转换为使用Swift3数据?

随机推荐

  1. bluetooth-lowenergy – Altbeacon库无法在Android 5.0上运行

    昨天我在Nexus4上获得了Android5.0的更新,并且altbeacon库停止了检测信标.似乎在监视和测距时,didEnterRegion和didRangeBeaconsInRegion都没有被调用.即使RadiusNetworks的Locate应用程序现在表现不同,一旦检测到信标的值,它们就不再得到更新,并且通常看起来好像信标超出了范围.我注意到的一点是,现在在logcat中出现以下行“B

  2. android – react-native动态更改响应者

    我正在使用react-native进行Android开发.我有一个视图,如果用户长按,我想显示一个可以拖动的动画视图.我可以使用PanResponder实现这一点,它工作正常.但我想要做的是当用户长按时,用户应该能够继续相同的触摸/按下并拖动新显示的Animated.View.如果您熟悉Google云端硬盘应用,则它具有类似的功能.当用户长按列表中的任何项目时,它会显示可拖动的项目.用户可以直接拖

  3. android – 是否有可能通过使用与最初使用的证书不同的证书对其进行签名来发布更新的应用程序

    是否可以通过使用与最初使用的证书不同的证书进行签名来发布Android应用程序的更新?我知道当我们尝试将这样的构建上传到市场时,它通常会给出错误消息.但有没有任何出路,比如将其标记为主要版本,指定市场中的某个地方?解决方法不,你不能这样做.证书是一种工具,可确保您是首次上传应用程序的人.所以总是备份密钥库!

  4. 如何检测Android中是否存在麦克风?

    ..所以我想在让用户访问语音输入功能之前检测麦克风是否存在.如何检测设备上是否有麦克风.谢谢.解决方法AndroidAPI参考:hasSystemFeature

  5. Android – 调用GONE然后VISIBLE使视图显示在错误的位置

    我有两个视图,A和B,视图A在视图B上方.当我以编程方式将视图A设置为GONE时,它将消失,并且它正下方的视图将转到视图A的位置.但是,当我再次将相同的视图设置为VISIBLE时,它会在视图B上显示.我不希望这样.我希望视图B回到原来的位置,这是我认为会发生的事情.我怎样才能做到这一点?编辑–代码}这里是XML:解决方法您可以尝试将两个视图放在RelativeLayout中并相对于彼此设置它们的位置.

  6. android – 获得一首歌的流派

    我如何阅读与歌曲相关的流派?我可以读这首歌,但是如何抓住这首歌的流派,它存放在哪里?解决方法检查此代码:

  7. android – 使用textShadow折叠工具栏

    我有一个折叠工具栏的问题,在展开状态我想在文本下面有一个模糊的阴影,我使用这段代码:用:我可以更改textColor,它可以工作,但阴影不起作用.我为阴影尝试了很多不同的值.是否可以为折叠文本投射阴影?

  8. android – 重用arm共享库

    我已经建立了armarm共享库.我有兴趣重用一个函数.我想调用该函数并获得返回值.有可能做这样的事吗?我没有任何头文件.我试过这个Android.mk,我把libtest.so放在/jni和/libs/armeabi,/lib/armeabi中.此时我的cpp文件编译,但现在是什么?我从objdump知道它的名字编辑:我试图用这个android.mk从hello-jni示例中添加prebuild库:它工作,但libtest.so相同的代码显示以下错误(启动时)libtest.so存在于libhello-j

  9. android – 为NumberPicker捕获键盘’Done’

    我有一个AlertDialog只有一些文本,一个NumberPicker,一个OK和一个取消.(我知道,这个对话框还没有做它应该保留暂停和恢复状态的事情.)我想在软键盘或其他IME上执行“完成”操作来关闭对话框,就像按下了“OK”一样,因为只有一个小部件可以编辑.看起来处理IME“Done”的最佳方法通常是在TextView上使用setonEditorActionListener.但我没有任何Te

  10. android – 想要在调用WebChromeClient#onCreateWindow时知道目标URL

    当我点击一个带有target=“_blank”属性的超链接时,会调用WebChromeClient#onCreateWindow,但我找不到新的窗口将打开的新方法?主页url是我唯一能知道的东西?我想根据目标网址更改应用行为.任何帮助表示赞赏,谢谢!

返回
顶部