web-dev-qa-db-fra.com

Utiliser un fichier manifeste et une autorisation personnalisés dans Unity?

Im essaye actuellement de programmer un petit jeu pour Android avec Unity3D. Parce que je veux une barre d'état visible, j'ai modifié le manifeste Android dans le dossier du projet (C:\Users\Public\Documents\Unity Projects\ProjectName\Temp\StagingArea) comme ceci:

<application Android:theme="Theme.Light.NoTitleBar" Android:icon="@drawable/app_icon" Android:label="@string/app_name" Android:debuggable="false" Android:isGame="true" Android:banner="@drawable/app_banner">

Mais chaque fois que je génère l'APK, l'unité change le Android Manifeste en ceci:

<application Android:theme="@style/UnityThemeSelector" Android:icon="@drawable/app_icon" Android:label="@string/app_name" Android:debuggable="false" Android:isGame="true" Android:banner="@drawable/app_banner">

Unity3D change-t-il mes manifestes modifiés à chaque fois?

10
genaray

Vous modifiez le mauvais fichier AndroidManifest. Ce AndroidManifest de <ProjectName>\Temp\StagingArea vous modifiez est généré par l'unité chaque fois que vous construisez votre projet.

Pour utiliser un fichier AndroidManifest personnalisé, vous devez placer votre fichier AndroidManifest personnalisé dans <ProjectName>Assets\Plugins\Android.

1.Accédez à <UnityInstallationDirecory>\Editor\Data\PlaybackEngines\AndroidPlayer\Apk, Copiez le AndroidManifest.xml fichier dans votre <ProjectName>Assets\Plugins\Android

2.Ouvrez le fichier manifeste copié depuis <ProjectName>Assets\Plugins\Android et ajoutez votre manifeste.

Dans votre cas particulier, ajoutez <application Android:theme="Theme.Light.NoTitleBar" Android:icon="@drawable/app_icon" Android:label="@string/app_name" Android:debuggable="false" Android:isGame="true" Android:banner="@drawable/app_banner"> à elle. Enregistrez, créez et exécutez.

Unity utilisera désormais ce fichier AndroidManifest. Si vous obtenez un plantage ou tout autre problème, Unity ne veut pas que vous changiez cela.

18
Programmer

À partir d'Unity 2018, vous devez implémenter le IPostGenerateGradleAndroidProjectinterface qui vous permettra de modifier le Android manifeste après que Unity l'ait produit. Dans le code ci-dessous, je ont ajouté des méthodes pour définir l'autorisation du microphone, définir l'accélération matérielle et définir le thème de votre application (remplacez SetMicrophonePermission() par votre méthode préférée, qui est appelée lorsque Unity appelle OnPostGenerateGradleAndroidProject()).

Ajoutez le code suivant à Assets/Editor/ModifyUnityAndroidAppManifestSample.cs

using System.IO;
using System.Text;
using System.Xml;
using UnityEditor.Android;

public class ModifyUnityAndroidAppManifestSample : IPostGenerateGradleAndroidProject
{

    public void OnPostGenerateGradleAndroidProject(string basePath)
    {
        // If needed, add condition checks on whether you need to run the modification routine.
        // For example, specific configuration/app options enabled

        var androidManifest = new AndroidManifest(GetManifestPath(basePath));

        androidManifest.SetMicrophonePermission();

        // Add your XML manipulation routines

        androidManifest.Save();
    }

    public int callbackOrder { get { return 1; } }

    private string _manifestFilePath;

    private string GetManifestPath(string basePath)
    {
        if (string.IsNullOrEmpty(_manifestFilePath))
        {
            var pathBuilder = new StringBuilder(basePath);
            pathBuilder.Append(Path.DirectorySeparatorChar).Append("src");
            pathBuilder.Append(Path.DirectorySeparatorChar).Append("main");
            pathBuilder.Append(Path.DirectorySeparatorChar).Append("AndroidManifest.xml");
            _manifestFilePath = pathBuilder.ToString();
        }
        return _manifestFilePath;
    }
}


internal class AndroidXmlDocument : XmlDocument
{
    private string m_Path;
    protected XmlNamespaceManager nsMgr;
    public readonly string AndroidXmlNamespace = "http://schemas.Android.com/apk/res/Android";
    public AndroidXmlDocument(string path)
    {
        m_Path = path;
        using (var reader = new XmlTextReader(m_Path))
        {
            reader.Read();
            Load(reader);
        }
        nsMgr = new XmlNamespaceManager(NameTable);
        nsMgr.AddNamespace("Android", AndroidXmlNamespace);
    }

    public string Save()
    {
        return SaveAs(m_Path);
    }

    public string SaveAs(string path)
    {
        using (var writer = new XmlTextWriter(path, new UTF8Encoding(false)))
        {
            writer.Formatting = Formatting.Indented;
            Save(writer);
        }
        return path;
    }
}


internal class AndroidManifest : AndroidXmlDocument
{
    private readonly XmlElement ApplicationElement;

    public AndroidManifest(string path) : base(path)
    {
        ApplicationElement = SelectSingleNode("/manifest/application") as XmlElement;
    }

    private XmlAttribute CreateAndroidAttribute(string key, string value)
    {
        XmlAttribute attr = CreateAttribute("Android", key, AndroidXmlNamespace);
        attr.Value = value;
        return attr;
    }

    internal XmlNode GetActivityWithLaunchIntent()
    {
        return SelectSingleNode("/manifest/application/activity[intent-filter/action/@Android:name='Android.intent.action.MAIN' and " +
                "intent-filter/category/@Android:name='Android.intent.category.LAUNCHER']", nsMgr);
    }

    internal void SetApplicationTheme(string appTheme)
    {
        ApplicationElement.Attributes.Append(CreateAndroidAttribute("theme", appTheme));
    }

    internal void SetStartingActivityName(string activityName)
    {
        GetActivityWithLaunchIntent().Attributes.Append(CreateAndroidAttribute("name", activityName));
    }


    internal void SetHardwareAcceleration()
    {
        GetActivityWithLaunchIntent().Attributes.Append(CreateAndroidAttribute("hardwareAccelerated", "true"));
    }

    internal void SetMicrophonePermission()
    {
        var manifest = SelectSingleNode("/manifest");
        XmlElement child = CreateElement("uses-permission");
        manifest.AppendChild(child);
        XmlAttribute newAttribute = CreateAndroidAttribute("name", "Android.permission.RECORD_AUDIO");
        child.Attributes.Append(newAttribute);
    }
}
11
pale bone

pour les autorisations d'exécution Unity, j'ai écrit cette fonction pour ajouter la boîte de dialogue des autorisations de saut (comme https://docs.unity3d.com/Manual/Android-manifest.html )

par exemple

<manifest>
    <application>
        <meta-data Android:name="unityplayer.SkipPermissionsDialog" Android:value="true" />

Voici le code:

internal void SetSkipPermissionsDialog()
{
    var manifest = SelectSingleNode("/manifest");
    var application = manifest.SelectSingleNode("application");
    XmlElement child = CreateElement("meta-data");
    application.AppendChild(child);
    XmlAttribute newAttribute = CreateAndroidAttribute("name", "unityplayer.SkipPermissionsDialog");
    child.Attributes.Append(newAttribute);
    newAttribute = CreateAndroidAttribute("value", "true");
    child.Attributes.Append(newAttribute);
}
0
linojon