android - SensorLandscape 的调用方式

标签 android configuration android-camera android-sensors android-mediarecorder

我有一个应用程序,我只想在横向模式下运行(例如横向或反向横向),因此我在 list 中使用sensorLandscape。

我的问题在这里: 我还有一个正在工作的录像机(例如使用相机)。现在,我在准备相机时设置显示方向,但问题是,如果我更改方向,则更改会保留(预览是颠倒的)。使用传感器景观时,我如何知道 UI 何时更改。我尝试过使用 onConfigurationCanged() 但不幸的是我需要让应用程序在前蜂窝设备(主要是 Gingerbread )和后蜂窝设备(果冻 bean )上运行。

因为为了正确调用 onConfigurationChanged,我需要将目标 api 设置为 8,但传感器景观仅适用于 9+。我需要将其设置为 8,因为在旧的 api 中,您需要将 screenSize 添加到“configChanges”中,否则它将不会被调用。所以这些调用之间存在很多不兼容性。

现在背景已经完成,你们知道我已经尝试过什么了。我的问题是 如何知道我的方向何时发生变化(回调或其他),以便我可以更改相机显示方向?

提前谢谢您。

最佳答案

我已经想出了如何完成这件事。这是一个迂回的方式,但它是: 设置传感器管理器和定位传感器

public class ActivityRecordVideo extends ActivityBase implements SensorEventListener
{

private SensorManager mSensorManager;
private Sensor mOrientation;

@Override
public void onCreate(Bundle savedInstanceState)
{
    mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
    mOrientation = mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
}

public void onAccuracyChanged(Sensor arg0, int arg1) {
    // TODO Auto-generated method stub

}

public void onSensorChanged(SensorEvent event) {
    int rotation = getWindowManager().getDefaultDisplay().getRotation();

    if(camId != -1 && currentDisplayRotation != rotation)
    {
        if(!isRecording)
            setCameraOrientation(camId, cameraRecorder);
    }

}

我还在 onResume() 中设置了监听器,并在 onPause() 中删除它们。

这允许相机方向与其他所有内容一起翻转(例如,在反向横向时,所有 View 与相机预览一起处于反向横向)

还决定显示 setCameraOrientation 代码,它是 Android 开发人员代码的精简版本

private void setCameraOrientation(int camId, Camera camera)
{
    CameraInfo info = new CameraInfo();
    Camera.getCameraInfo(camId, info);

    currentDisplayRotation = getWindowManager().getDefaultDisplay().getRotation();
    int degrees = 0;
    switch(currentDisplayRotation)
    {
    case Surface.ROTATION_0: degrees = 0; break;
    case Surface.ROTATION_90: degrees = 90; break;
    case Surface.ROTATION_180: degrees = 180; break;
    case Surface.ROTATION_270: degrees = 270; break;
    }

    int result;
    result = (info.orientation + degrees) % 360;
    result = (360 - result) % 360;  //compensate for mirror effect

    if(Build.VERSION.SDK_INT < 14)
        camera.stopPreview();
    camera.setDisplayOrientation(result);
    if(Build.VERSION.SDK_INT < 14)
        camera.startPreview();
}

希望这对其他人有帮助

关于android - SensorLandscape 的调用方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14652058/

相关文章:

javascript - 从相机拍摄的图像未保存到画廊

android - Android 内存调试教程或示例

java - Log4j2 使用 {} 反对使用 %d 或 %s

java - 是否可以使用 Guice 中的 Multibinder 根据应用程序配置构建动态集?

configuration - 配置 log4net 根据级别将错误发送到不同的appender

Android Camera - 从服务在后台运行

android - 如何在android中获取Camera2 API的当前曝光

android - AlarmManager 在 MIUI 上不起作用(谁知道还有哪里)

android - Android 中的自定义字体泄漏内存

java - 安卓.view.InflateException : Binary XML file line #87: Error inflating class TextView