更改Android主屏幕方向?
我有一个设备,显然有东西与方向打破,因为重新启动后,大约一个小时,它会旋转屏幕响应方向的变化 - 然后它会停止响应,无论是在“桌面“级别和应用程序级别。更改Android主屏幕方向?
所以,我发现Change Screen Orientation programmatically using a Button,我想我可以创建一个“图标按钮”的应用程序,当按下时,不会运行一个新的应用程序,而是试图改变方向。
“图标/按钮”应用程序的框架是Lock screen (it.reyboz.screenlock)的副本。我张贴在依据这个项目 - 但因为它是很难有默认的文件夹(文件和二进制文件)的要点,这是你可以用它来获取代码的程序:
git clone https://gist.github.com/e6422677cababc17526d0cb57aceb76a.git dl_archive_git
cd dl_archive_git
bash run-me-to-unpack.sh
# check upacked dir:
tree rotate-btn-droid
cd rotate-btn-droid/
# change your SDK path (ASDKPATH) in buildme.sh, and then:
bash buildme.sh
# if your java install is not in the path, then call the last command with JAVA_HOME prepended:
# JAVA_HOME=/path/to/jdkXXX bash buildme.sh
基本上,我米只是努力做到以下几点在MainActivity.java
:
Display display = ((WindowManager) getSystemService(WINDOW_SERVICE)).getDefaultDisplay();
int orientation = display.getOrientation();
// OR: orientation = getRequestedOrientation(); // inside an Activity
switch(orientation) {
case Configuration.ORIENTATION_PORTRAIT:
setRequestedOrientation (Build.VERSION.SDK_INT < 9 ?
ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE :
ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
break;
case Configuration.ORIENTATION_LANDSCAPE:
setRequestedOrientation (Build.VERSION.SDK_INT < 9 ?
ActivityInfo.SCREEN_ORIENTATION_PORTRAIT :
ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT);
break;
}
...然而,没事的时候我点击应用图标,然后运行该代码发生。
所以,我的问题是 - 原则上可能强制在“桌面”级别上更改设备方向?如果是这样,它是否依赖于Android版本(可能是供应商品牌) - 以及如何?
只是好奇,所以尝试了Sam's solution并做出了一些改变:
会需要这个权限在Manifest
权限<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
而且这个权限是一个危险的权限,但如果你要安装的应用程序从Play商店你不用担心这一点。
我做了一个窗口服务是这样的:
public class MyServiceNew extends Service {
private View view;
public MyServiceNew() {
}
@Override
public IBinder onBind(Intent intent) {
throw new UnsupportedOperationException("Not yet implemented");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
int flag = intent.getExtras().getInt("Flag");
WindowManager.LayoutParams layout;
if (flag == 1) {
layout = generateLayoutLandscape();
} else {
layout = generateLayoutPortrait();
}
WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
wm.addView(view, layout);
return super.onStartCommand(intent, flags, startId);
}
private WindowManager.LayoutParams generateLayoutPortrait() {
Toast.makeText(this, "Port", Toast.LENGTH_LONG).show();
view = new View(this);
WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
PixelFormat.TRANSPARENT);
params.alpha = 0f;
params.width = 0;
params.height = 0;
//The orientation to force
params.screenOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
return params;
}
private WindowManager.LayoutParams generateLayoutLandscape() {
Toast.makeText(this, "Land", Toast.LENGTH_LONG).show();
view = new View(this);
WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
PixelFormat.TRANSPARENT);
params.alpha = 0f;
params.width = 0;
params.height = 0;
//The orientation to force
params.screenOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
return params;
}
}
从你的活动而发展确保包含ACTION_MANAGE_OVERLAY_PERMISSION
;您再也不需要担心通过Google Play Store
安装应用程序的用户。这里使用下面的代码允许上述M器件权限:
public void requestSystemAlertPermission(int requestCode) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M)
return;
final String packageName = getPackageName();
final Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + packageName));
startActivityForResult(intent, requestCode);
}
现在刚开始你的服务,并通过为纵向或横向 演员我使用1景观和2肖像
Intent intentLand = new Intent(SoNew.this, MyServiceNew.class);
intentLand.putExtra("Flag", 2); //or change 1 for Port
startService(intentLand);
希望这会有所帮助:)
我不确定它是否可能在设备级cuz如果你按照[this here](https://developer.android.com/reference/android/app/Activity.html#setRequestedOrientation( int))它清楚地说明它会改变希望的方向只有 – shadygoneinsane
有一个解决方法[这里](http://*.com/a/14654302/5134647),如果你的设备API是18或以下,你可以使用[this here](http:// *.com/a/26895627/5134647) – shadygoneinsane
谢谢@shadygoneinsane - 将确保我检查解决方法;如果有任何工作会报告回来 – sdaau