2

を設定して、カメラのプレビュー中に自動回転を無効にするカメラアプリを作成していますandroid:screenOrientation="nosensor"。ただし、写真を撮ったときの電話の回転を知りたいです。 getResources().getConfiguration().orientation縦向き、横向き、または正方形のみを返すだけで、十分に具体的ではありません。 getWindowManager().getDefaultDisplay().getRotation()画面はデフォルトの向きに強制されるため、常に 0です。自動回転がオンになっている場合、その値を取得するにはどうすればよいですか?

4

4 に答える 4

6

これは少し詳細ですが、向きの変化を追跡するのにうまく機能しました。カメラのインテントを開いて写真を撮ったときに、写真の向きを取得するために使用しました。次に、写真の向きがわかりました。明らかにフォト ライブラリでは機能しませんが、exif 情報を使用できます。恐ろしいことに、Samsung Galaxy S3 と S4 がカメラからの exif 方向データを返していないことを発見しました。

//keep a history
private int [] _orientationHistory = new int[5];
private int _orientationIndex;
private int _highestIndex = -1;
private int _currentOrientation;

//essentially compute the mode of the data. This could be improved
protected int getOrientation()
{
    if (_highestIndex < 0) return 0;

    Arrays.sort(_orientationHistory);
    return _orientationHistory[_highestIndex / 2];
}

OrientationEventListener _imageViewOrientationListener = new            
              OrientationEventListener(getContext(), SensorManager.SENSOR_DELAY_NORMAL) {
public void onOrientationChanged(int angle) {
        //angle comes in 360 degrees, convert that to a 0-3 rotation
        //Get the angle in 90 degree increments, 0,90,180,270 
        //with 45 degrees tolerance in each direction (straight up is 0) 
        //this is the same as the data coming from getWindowManager().getDefaultDisplay().getRotation()

        angle = angle + 45;
        if (angle > 360) angle = angle - 360;
        int orientation = angle / 90;

        //I use a history in order to smooth out noise 
        //and don't start sending events about the change until this history is filled
        if (_orientationIndex > _highestIndex) {
            _highestIndex = _orientationIndex;
        }
        _orientationHistory[_orientationIndex] = orientation;
        _orientationIndex ++;

        if (_orientationIndex == _orientationHistory.length) {
            _orientationIndex = 0;
        }

        int lastOrientation = _currentOrientation;
        //compute the orientation using above method
        _currentOrientation = getOrientation();

        if (_highestIndex == _orientationHistory.length - 1 && lastOrientation != _currentOrientation) {
            //enough data to say things changed
            orientationChanged(lastOrientation, _currentOrientation);
        }
    }
};

次に、このリスナーを有効にするには、次のコード行を追加します。

if (_imageViewOrientationListener != null) {
     _imageViewOrientationListener.enable();
}

最後に、メソッド orientationChanged() を追加し、向きが変わったときに更新を受け取ります。私が行ったように必要な場合は、カメラ アクティビティを開いたときにこの情報の記録を開始します。向きが縦向きから横向きなど、別のものに反転した場合は、その期間に撮影された写真が、記録した回転の変化であると想定できます。 .

protected void orientationChanged(int lastOrientation, int currentOrientation) {
    Log.d(getClass().getSimpleName(), "Orientation changed to " + currentOrientation + " from " + lastOrientation);
}
于 2013-07-12T19:17:22.277 に答える
1

変更された構成を聞くことができます

<activity
...
            android:configChanges="orientation|screenSize"
...

onConfigurationChanged() では、必要な向き (縦向きなど) を強制できますが、向きの変更に関する情報を取得できます。

@Override
public void onConfigurationChanged(Configuration newConfig) {
    //get new configuration orientation from newConfig.orientation
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}

android:screenOrientation="portrait" を使用しないでください。ユーザーが向きを変更すると、onConfigurationChanged が呼び出されます。

于 2013-04-08T06:51:36.147 に答える
1

アクティビティで使用できます

@Override
public void onConfigurationChanged(Configuration newConfig) {    //this method return you latest configuration
    // TODO Auto-generated method stub
    super.onConfigurationChanged(newConfig);
//  newConfig.orientation  //Using this you will able to get orientation of device
}

このメソッドは、デバイス構成を変更した後に呼び出します。

于 2013-04-08T05:29:42.347 に答える
0

デバイスの向きが変わったときに SensorManager からの通知を受け取るために、このクラスを使用します。

于 2013-04-08T05:09:55.627 に答える