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?
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.
À partir d'Unity 2018, vous devez implémenter le IPostGenerateGradleAndroidProject
interface 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);
}
}
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);
}