根据不同的渠道设置AndroidManifest中Activity的屏幕旋转方向

6
有没有办法在gradle的build.config中动态设置AndroidManifest中的activity screenOrientation?
我需要一个允许旋转的flavor,和一个只支持竖屏的flavor。
我已经阅读了http://tools.android.com/tech-docs/new-build-system/user-guide/manifest-merger,但它们的示例似乎仅适用于普通字符串标签。
我尝试了两种方法。
使用gradle的manifestPlaceholders: build.gradle:
productFlavors {
  flavorRotation {
    manifestPlaceholders = [ROTATION_PREF: "unspecified"]
  }
  flavorNoRotation {
    manifestPlaceholders = [ROTATION_PREF: "portrait"]
  }
}

使用 AndroidManifest.xml:

...
  <activity android:name=".ui.ActivityName"
    android:screenOrientation="${ROTATION_PREF}"/>
...

这似乎不起作用,没有错误提示,但旋转在构建“flavorNoRotation”时未锁定到纵向


并尝试使用gradle的resValue: build.gradle:

productFlavors {
  flavorRotation {
    resValue "string", "orientation", "unspecified"
  }
  flavorNoRotation {
    resValue "string", "orientation", "portrait"
  }
}

带有清单文件:
...
<activity android:name=".ui.ActivityName"
  android:screenOrientation="@string/orientation"/>
...

这种方式可以成功构建,但是当我尝试将其安装到设备时,Android Studio会显示“安装失败,错误消息为INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION。如果存在apk的现有版本,则卸载该版本,然后重新安装可能会解决此问题。”
点击“确定”仅会在事件日志中显示“安装APK时出错”。
所以,是否有一种方法可以在不同的构建类型/风味之间具有不同的方向?
我更喜欢避免在BaseActivity中以编程方式执行此操作。
抱歉,我尝试了一些操作后发现我之前尝试的第一种方法确实可行。可能是我之前在自己的设备上安装了错误的版本。唯一的问题是,Android Studio会在“android:screenOrientation =“$ {ROTATION_PREF}”属性上发出警告,说找不到它,尽管它可以正常构建和工作。感谢回答的尝试。

我遇到了类似的问题,但我的情况是尝试使用@string资源来调整launchMode,它可以成功构建而没有任何错误,但安装会出现INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION并且永远无法成功安装。 - chubao
1
@DavidCheung 请尝试我所使用的第一种方法。我已经使用launchmode进行了尝试,它可以编译并成功安装。例如,在build.gradle中:manifestPlaceholders = [LAUNCHMODE:"singleTop"] 然后在AndroidManifest中:<activity ... android:launchMode="${LAUNCHMODE}" /> 当我尝试使用字符串资源时,我遇到了与您相同的问题。 - jesobremonte
5个回答

1

是的,有一种方法可以在build.gradle级别上配置每个风味的方向,而且它确实非常容易,但可能会有点混淆,因为大多数人会尝试使用字符串资源,因为方向在清单中定义为“字符串”,但在幕后实际上是一个整数。

使用OP风味,将如下所示:

productFlavors {
  flavorRotation {
    // 0 = unspecified
    resValue "integer", "orientation", "0"
  }
  flavorNoRotation {
    // 1 = portrait
    resValue "integer", "orientation", "1"
  }
}

您可以在此源代码中查看预定义的值(搜索ORIENTATION_UNSPECIFIED以找到第一个定义)。
然后,我们在清单文件中使用Gradle提供的整数资源:
<activity android:name=".ui.ActivityName"
    ...
    android:screenOrientation="@integer/orientation">
    ...
</activity>

0

将源文件分离

例如) .../src/flavorRotation/res/values/strings.xml

<string name="orientation">未指定</string>

.../src/main/res/values/strings.xml

<string name="orientation">竖屏</string>


0
1-Create screen.xml file inside res/values folder and code

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="screen_type">phone</string>
</resources>

2-In your activity inside onCreate() after setContentView() check device type

//checking tablets and phones
String screenType = getResources().getString(R.string.screen_type); if (screenType.equals("7-inch-tablet") || screenType.equals("10-inch-tablet")) {

 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

} else {

   setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
} 

希望这能有所帮助。


1
这并没有回答问题。原帖作者想要从他的gradle文件中实现这个。 - se_bastiaan

0
不是那样的。我所做的是创建一个“父”活动类,在其中检查您想要使用的布局类型,就像这样:(只需确保您在子活动中首先调用super)在这里,您可以检查构建版本。
public class DaddyActivity extends Activity {

   @Override
   protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // set landscape or portrait
        if (getResources().getBoolean(R.bool.landscape)) {
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        } else {
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        }
    }
}

它寻找只有一个布尔值的XML:landscape。这是普通屏幕的XML:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <bool name="landscape">false</bool>
</resources>

0

最好的方法是在gradle中添加2个flavor,然后为“portrait” flavor创建同名目录并复制清单文件,然后将screenOrientation添加到portrait中。

在应用程序gradle中添加以下内容:

flavorDimensions "default"
productFlavors {
    any {
        applicationIdSuffix ".any"
    }

    portrait {
        applicationIdSuffix ".portrait"
    }
}

Add dir name "portrait" instead landscape as shown in image

然后在竖屏目录下的新清单文件中,在活动下添加以下内容

        android:screenOrientation="portrait"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接