更改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版本(可能是供应商品牌) - 以及如何?

+1

我不确定它是否可能在设备级cuz如果你按照[this here](https://developer.android.com/reference/android/app/Activity.html#setRequestedOrientation( int))它清楚地说明它会改变希望的方向只有 – shadygoneinsane

+1

有一个解决方法[这里](http://*.com/a/14654302/5134647),如果你的设备API是18或以下,你可以使用[this here](http:// *.com/a/26895627/5134647) – shadygoneinsane

+0

谢谢@shadygoneinsane - 将确保我检查解决方法;如果有任何工作会报告回来 – sdaau

只是好奇,所以尝试了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); 

希望这会有所帮助:)