在Unity中禁用平板电脑或大屏幕支持?

时间:2016-03-29 15:42:19

标签: android xml unity3d apk

在Unity中为Android构建时,如何禁用平板电脑或大屏幕支持?

我在播放器设置中看不到任何选项。

另外,我已经看到了这个问题:Android: Disable to install app on tablets

我正在使用Unity构建我的APK,因此我不知道如何编辑我的AndroidManifest.xml文件。

2 个答案:

答案 0 :(得分:0)

您可以通过在Assets / Plugins / Android文件夹中放置一个自定义AndroidManifest.xml供Unity使用。

如果您制作Android版本,则此文件的基本副本(可用作创建自定义版本的起点)位于Temp / StagingArea中。请注意,退出Unity时会删除此目录!

答案 1 :(得分:0)

由于这个答案很旧,这里有一点更新:

自 Unity 2019.3 起,support-screens 节点位于 LauncherManifest.xml 中,其属性不能被自定义属性覆盖。你会遇到合并冲突。

看看基础知识: https://docs.unity3d.com/Manual/android-manifest.html

所以,我做了什么: 临时构建文件夹中有 10 多个 mainfest xml 文件,很难弄清楚要操作哪个才能在最终的 AndroidManifest.xml 中获得正确的设置。所以我写了一个小脚本,使用 IPostGenerateGradleAndroidProject 接口并更改所有适当的节点。然后我删除了不必要的东西,这就是结果:

using System.Collections.Generic;
using System.IO;
using UnityEditor.Android;
using UnityEngine;

public class ChangeSupportedScreens : IPostGenerateGradleAndroidProject
{
    public int callbackOrder { get { return 0; } }
    private List<string> _androidManifestPaths = new List<string>
    {
        "Temp/gradleOut/launcher/src/main",
        "Temp/gradleOut/unityLibrary/src/main",
    };

    private const string ANDROID_MANIFEST_FILENAME = "AndroidManifest.xml";

    public void OnPostGenerateGradleAndroidProject(string _)
    {
        foreach (var manifestPath in _androidManifestPaths)
        {
            var androidManifestPath = GetAndroidManifestPath(manifestPath);
            if (File.Exists(androidManifestPath))
            {
                var androidManifestXML = File.ReadAllText(androidManifestPath);
                androidManifestXML = ReplaceValue(androidManifestXML, "largeScreens", "true", "false");
                androidManifestXML = ReplaceValue(androidManifestXML, "xlargeScreens", "true", "false");

                File.WriteAllText(androidManifestPath, androidManifestXML);
            }
            else
            {
                Debug.LogError($"Error: File {androidManifestPath} not found");
            }
        }
    }

    private static string ReplaceValue(string content, string key, string oldValue, string newValue)
        => content.Contains(key) ? content.Replace($"{key}=\"{oldValue}\"", $"{key}=\"{newValue}\"") : content;

    private static string GetAndroidManifestPath(string path)
    {
        var separator = Path.DirectorySeparatorChar;
        var manifestPath = path.Replace('/', separator);
        return Path.GetFullPath(Path.Combine(Application.streamingAssetsPath, $"..{separator}..{separator}{manifestPath}", ANDROID_MANIFEST_FILENAME));
    }
}

希望这会有所帮助。我在 apktool 的帮助下仔细检查了结果,以查看打包的 APK AndroidManifest.xml 中发生了什么。 当然,如果常用方法(在 Plugins/Android 中使用自己的 AndroidManifest.xml 不适合您),您可以使用此剪辑来覆盖其他值。

免责声明:

  1. 在 Windows Unity 编辑器上使用
  2. 我知道将字符串解析为 XML 文档可能会更好。我把它留给别人。