2

横向きモード (横向きまたは逆向きなど) でのみ実行したいアプリケーションがあるため、マニフェストで sensorLandscape を使用しています。

私の問題はここにあります:ビデオレコーダーも動作しています(たとえば、カメラを使用しています)。カメラを準備するときにディスプレイの向きを設定するようになりましたが、向きを変更するとその変更が残る(プレビューが上下逆になる)という問題があります。センサー ランドスケープを使用している場合、UI がいつ変更されたかを知るにはどうすればよいですか。onConfigurationCanged() を使用してみましたが、残念ながら、ハニカム前のデバイス (主にジンジャーブレッド) とハニカム後のデバイス (ジェリービーン) の両方でアプリを実行する必要があります。

onConfigurationChanged を適切に呼び出すには、ターゲット API を 8 のように設定する必要がありますが、センサー ランドスケープは 9 以降でしか使用できません。古いAPIでは、「configChanges」にscreenSizeを追加する必要があるため、8に設定する必要があります。そうしないと、呼び出されません。したがって、これらの呼び出しには、相互に多くの非互換性があります。

バックグラウンドが完了したので、皆さんは私がすでに試したことを知っています。私の質問は、カメラのディスプレイの向きを変更できるように、向きが変わったとき (コールバックなど) を知るにはどうすればよいですか?

前もって感謝します。

4

1 に答える 1

3

私はこれを行う方法を考え出しました。これは回り道ですが、ここにあります:センサーマネージャーと方向センサーをセットアップします

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() でリスナーを削除します。

これにより、カメラの向きを他のすべてのものと反転させることができます (たとえば、逆の横向きの場合、すべてのビューがカメラのプレビューとともに逆の横向きになります)。

また、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();
}

うまくいけば、これは他の人を助けるでしょう

于 2013-02-04T15:43:34.130 に答える