я натыкаюсь на это некоторое время назад, и до сих пор не знаю, почему Unity строит просят тех разрешений , Во всяком случае, чтобы избавиться от них, вы можете использовать скрипт редактор в качестве обходного пути: (. PERMISSIONS_NAMES_TO_DELETE
быть string[]
имен разрешений на удаление Чтобы получить разрешения список имен вы можете посмотреть here)
protected void BuildAPKCustom(string buildPath)
{
bool manifestFileExists = false;
if(File.Exists(Path.Combine(Application.dataPath, "Plugins/Android/AndroidManifest.xml")))
{
manifestFileExists = true;
File.Copy(Path.Combine(Application.dataPath, "Plugins/Android/AndroidManifest.xml"), Path.Combine(Application.dataPath, "Plugins/Android/tmpManifestFile.xml"));
File.Delete(Path.Combine(Application.dataPath, "Plugins/Android/AndroidManifest.xml"));
}
string[] levels = new string[EditorSceneManager.sceneCount];
for (int i = 0; i < levels.Length; i++)
{
levels[i] = EditorSceneManager.GetSceneAt(i).path;
}
BuildPipeline.BuildPlayer(levels, buildPath, BuildTarget.Android, BuildOptions.None);
XNamespace android = "http://schemas.android.com/apk/res/android";
string generatedXMLFilePath = Path.Combine(Application.dataPath, "../Temp/StagingArea/AndroidManifest.xml");
XDocument doc = XDocument.Load(generatedXMLFilePath);
IEnumerable<XElement> permissionElements = doc.Root.Elements("uses-permission");
foreach(XElement permission in permissionElements)
{
int potentialIndex = PERMISSIONS_NAMES_TO_DELETE.IndexOf(permission.Attribute(android + "name").Value.Replace("android.permission.", ""));
if(potentialIndex >= 0)
{
UnityEngine.Debug.Log("Permission deleted : " + PERMISSIONS_NAMES_TO_DELETE[potentialIndex]);
permission.Remove();
}
}
XElement overwritenPermission;
for(int i = 0; i < PERMISSIONS_NAMES_TO_DELETE.Length; i++)
{
overwritenPermission = new XElement("uses-permission");
overwritenPermission.Add(new XAttribute(android + "name", "android.permission." + PERMISSIONS_NAMES_TO_DELETE[i]));
overwritenPermission.Add(new XAttribute(android + "maxSdkVersion", "18"));
doc.Element("manifest").Add(overwritenPermission);
}
if(!Directory.Exists(Path.Combine(Application.dataPath, "Plugins/Android")))
{
Directory.CreateDirectory(Path.Combine(Application.dataPath, "Plugins/Android"));
}
doc.Save(Path.Combine(Application.dataPath, "Plugins/Android/AndroidManifest.xml"));
BuildPipeline.BuildPlayer(levels, buildPath, BuildTarget.Android, BuildOptions.None);
if(manifestFileExists)
{
File.Delete(Path.Combine(Application.dataPath, "Plugins/Android/AndroidManifest.xml"));
File.Copy(Path.Combine(Application.dataPath, "Plugins/Android/tmpManifestFile.xml"), Path.Combine(Application.dataPath, "Plugins/Android/AndroidManifest.xml"));
File.Delete(Path.Combine(Application.dataPath, "Plugins/Android/tmpManifestFile.xml"));
}
Process.Start(Path.GetDirectoryName(buildPath));
}
Что это делает:
- получить предыдущий AndroidManifest.xml файл (если он существует) в /Android/Plugins/, скопируйте его во временный и удалите его
- выполните первую сборку, чтобы Unity сгенерировал AndroidManifest .XML файл на своем собственном
- редактировать манифест «удалить» ненужные разрешения
- сохранить отредактированный манифест /Android/Плагины/
- выполнить вторую сборку с правильно установить манифеста
Идея удаления разрешения заключается в том, чтобы установить максимальный уровень API на такой низкий уровень, разрешения не будут использоваться (обратите внимание, что на этом уровне API существует разрешение MUST).
Надеюсь, что это помогает,
Спасибо за хорошо разработанный ответ! Позвольте мне проверить и сказать, работает ли он. – igorpavlov
Не работает. Сбой сборки с сообщением «Невозможно объединить манифеста Android». – igorpavlov
Вам необходимо изменить соответствие 'minSDKVersion' в настройках сборки (извините, забыл об этом). – Kardux