19

画面を強制的に回転できるアプリはたくさんあります。アプリが別の向きで表示されることを明示的に望んでいる場合でも、それらは機能します。現在、加速度計の回転システムの設定を無効にして、好みの向きを設定しています。アプリはこれをオーバーライドできます。

アプリの要求された向きをオーバーライドできるアプリの 1 つを次に示します。

https://play.google.com/store/apps/details?id=nl.fameit.rotate&hl=en

4

4 に答える 4

25

カグロニックの答えを試しましたが、うまくいきませんでした。少しいじった後、最終的にはシステムオーバーレイウィンドウを使用して機能し、すべて不要であることがわかったLayoutParamsを削除しました。これが私の最終的な解決策です:

orientationChanger = new LinearLayout(this);
// Using TYPE_SYSTEM_OVERLAY is crucial to make your window appear on top
// You'll need the permission android.permission.SYSTEM_ALERT_WINDOW
WindowManager.LayoutParams orientationLayout = new WindowManager.LayoutParams(WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY, 0, PixelFormat.RGBA_8888);
// Use whatever constant you need for your desired rotation
orientationLayout.screenOrientation = ActivityInfo.SCREEN_ORIENTATION_SENSOR;

// Optional: Replace "Context" with "Service" when used in a service
WindowManager wm = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE);
wm.addView(orientationChanger, orientationLayout);
orientationChanger.setVisibility(View.VISIBLE);

これに基づいてリリースしたアプリで私の成功を見ることができます: Force Dock Rotation .

于 2013-02-13T20:49:59.090 に答える
15

余談ですが、サポートされていないアプリで強制することなく、画面の向きをグローバルに変更することもできます. (この質問はアプリの設定を上書きすることに関するものであることは知っていますが、これは依然として有用であり、ほとんど関連性のある情報です。)

  1. AndroidManifest.xml のシステム設定 ( WRITE_SETTINGS)へのアクセスを許可します。

    <uses-permission android:name="android.permission.WRITE_SETTINGS" />
    
  2. 輸入Settings

    import android.provider.Settings;
    
  3. Android 画面の自動回転が無効になっていることを確認する

    Settings.System.putInt(
        getContentResolver(),
        Settings.System.ACCELEROMETER_ROTATION,
        0
    );
    
  4. 必要な設定に設定します。これは定数USER_ROTATIONの 1 つでなければなりません。これらの値は、デバイスの自然な向き (横向きまたは縦向き) からの画面の回転を表します。ROTATION_

    Settings.System.putInt(
        getContentResolver(),
        Settings.System.USER_ROTATION,
        Surface.ROTATION_0 //Or a different ROTATION_ constant
    );
    

USER_ROTATIONアプリが実行されていない場合やアンインストールされている場合でも、変更は保持されることに注意してください。私の記憶が正しければ、ユーザーは自動回転を手動で無効にしてから有効にすることで、この値をリセットできます。

于 2014-11-12T20:06:48.220 に答える
15

これは、非表示のシステム ダイアログを作成することで実行できます。その一種のハックですが、機能するのに十分クレイジーです。

    wm = (WindowManager) content.getSystemService(Service.WINDOW_SERVICE);

    orientationChanger = new LinearLayout(content);
    orientationChanger.setClickable(false);
    orientationChanger.setFocusable(false);
    orientationChanger.setFocusableInTouchMode(false);
    orientationChanger.setLongClickable(false);

    orientationLayout = new WindowManager.LayoutParams(
            LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT,
            windowType, WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
                    | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
            PixelFormat.RGBA_8888);

    wm.addView(orientationChanger, orientationLayout);
    orientationChanger.setVisibility(View.GONE);

    orientationLayout.screenOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
    wm.updateViewLayout(orientationChanger, orientationLayout);
    orientationChanger.setVisibility(View.VISIBLE);
于 2013-02-01T20:17:31.293 に答える
5

システム ビューを作成する

View常に他のアプリケーションの上に表示される非表示を作成します。Viewは独自の方向設定を指定できるため、ビューの方向を使用して、基になるビューとアプリケーションの方向をオーバーライドできます。

オプション

これを実現するために使用できるいくつかの異なるビュー タイプを認識していますが、それぞれに独自の欠点があります。

  1. システムオーバーレイウィンドウ ( TYPE_SYSTEM_OVERLAY)

    SYSTEM_ALERT_WINDOW許可が必要です。(以下をAndroidManifest.xmlに追加します。)

    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
    
  2. トーストウィンドウ ( TYPE_TOAST)

    MIUI V8 を除いて、許可は必要ありません。

    一部のウィンドウ タイプでは表示されないため、それらの向きは影響を受けない可能性があります。

指示

  1. を作成しますView
  2. を作成しますWindowManager.LayoutParams
    1. type上記で選択した値に設定します。
    2. オーバーラップしたときに機能しないアプリケーションの問題を防ぐために、そのwidthおよびをゼロにします。height(たとえば、Android では、ウィンドウがその上にある場合にアクセシビリティ サービスを有効にしようとしても、[OK] ボタンを押すことができません。)
    3. screenOrientation必要な向きの値に設定します。

実装
public class ScreenOrientationEnforcer {

    private final View view;
    private final WindowManager windows;

    public ScreenOrientationEnforcer(Context context) {
        windows = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
        view = new View(context);
    }

    public void start() {
        WindowManager.LayoutParams layout = generateLayout();
        windows.addView(view, layout);
        view.setVisibility(View.VISIBLE);
    }

    public void stop() {
        windows.removeView(view);
    }

    private WindowManager.LayoutParams generateLayout() {
        WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams();

        //So we don't need a permission or activity
        //Note that this won't work on some devices running MIUI
        layoutParams.type = WindowManager.LayoutParams.TYPE_TOAST;

        //Just in case the window type somehow doesn't enforce this
        layoutParams.flags =
            WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
            | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE;

        //Prevents breaking apps that detect overlying windows enabling
        //(eg UBank app, or enabling an accessibility service)
        layoutParams.width = 0;
        layoutParams.height = 0;

        //Try to make it completely invisible
        layoutParams.format = PixelFormat.TRANSPARENT;
        layoutParams.alpha = 0f;

        //The orientation to force
        layoutParams.screenOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;

        return layoutParams;
    }

}
使用法
ScreenOrientationEnforcer screenOrientationEnforcer
    = new ScreenOrientationEnforcer(context);

//Force screen orientation
screenOrientationEnforcer.start();

//Stop forcing screen orientation
screenOrientationEnforcer.stop();

短所

  • 私の経験から、アプリがクラッシュしたり強制終了されたりしても、ビューが持続する可能性があります。デバイスを再起動すると、これを回避できるようです。

参考文献

于 2015-04-26T06:28:59.717 に答える