画面を強制的に回転できるアプリはたくさんあります。アプリが別の向きで表示されることを明示的に望んでいる場合でも、それらは機能します。現在、加速度計の回転システムの設定を無効にして、好みの向きを設定しています。アプリはこれをオーバーライドできます。
アプリの要求された向きをオーバーライドできるアプリの 1 つを次に示します。
https://play.google.com/store/apps/details?id=nl.fameit.rotate&hl=en
画面を強制的に回転できるアプリはたくさんあります。アプリが別の向きで表示されることを明示的に望んでいる場合でも、それらは機能します。現在、加速度計の回転システムの設定を無効にして、好みの向きを設定しています。アプリはこれをオーバーライドできます。
アプリの要求された向きをオーバーライドできるアプリの 1 つを次に示します。
https://play.google.com/store/apps/details?id=nl.fameit.rotate&hl=en
カグロニックの答えを試しましたが、うまくいきませんでした。少しいじった後、最終的にはシステムオーバーレイウィンドウを使用して機能し、すべて不要であることがわかった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 .
余談ですが、サポートされていないアプリで強制することなく、画面の向きをグローバルに変更することもできます. (この質問はアプリの設定を上書きすることに関するものであることは知っていますが、これは依然として有用であり、ほとんど関連性のある情報です。)
AndroidManifest.xml のシステム設定 ( WRITE_SETTINGS
)へのアクセスを許可します。
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
輸入Settings
import android.provider.Settings;
Android 画面の自動回転が無効になっていることを確認する
Settings.System.putInt(
getContentResolver(),
Settings.System.ACCELEROMETER_ROTATION,
0
);
必要な設定に設定します。これは定数USER_ROTATION
の 1 つでなければなりません。これらの値は、デバイスの自然な向き (横向きまたは縦向き) からの画面の回転を表します。ROTATION_
Settings.System.putInt(
getContentResolver(),
Settings.System.USER_ROTATION,
Surface.ROTATION_0 //Or a different ROTATION_ constant
);
USER_ROTATION
アプリが実行されていない場合やアンインストールされている場合でも、変更は保持されることに注意してください。私の記憶が正しければ、ユーザーは自動回転を手動で無効にしてから有効にすることで、この値をリセットできます。
これは、非表示のシステム ダイアログを作成することで実行できます。その一種のハックですが、機能するのに十分クレイジーです。
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);
View
常に他のアプリケーションの上に表示される非表示を作成します。View
は独自の方向設定を指定できるため、ビューの方向を使用して、基になるビューとアプリケーションの方向をオーバーライドできます。
これを実現するために使用できるいくつかの異なるビュー タイプを認識していますが、それぞれに独自の欠点があります。
システムオーバーレイウィンドウ ( TYPE_SYSTEM_OVERLAY
)
SYSTEM_ALERT_WINDOW
許可が必要です。(以下をAndroidManifest.xmlに追加します。)
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
トーストウィンドウ ( TYPE_TOAST
)
MIUI V8 を除いて、許可は必要ありません。
一部のウィンドウ タイプでは表示されないため、それらの向きは影響を受けない可能性があります。
TYPE_PRIORITY_PHONE
)TYPE_DREAM
)TYPE_KEYGUARD_DIALOG
、TYPE_KEYGUARD_SCRIM
)View
。WindowManager.LayoutParams
。
type
上記で選択した値に設定します。width
およびをゼロにします。height
(たとえば、Android では、ウィンドウがその上にある場合にアクセシビリティ サービスを有効にしようとしても、[OK] ボタンを押すことができません。)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();
PhoneWindowManager.windowTypeToLayerLw
PhoneWindowManager.checkAddPermission