2017-01-30 10 views
2

Статус: еще не решенаЕдинство GearVR избавиться от «с просьбой разрешить ...»

Проблема

После того, как я построить и установить приложение с GearVR он спрашивает по умолчанию:

XXX запрашивает разрешение на доступ к фотографиям, мультимедиа и файлам на вашем устройстве. Позволять?

Разрешить/Запретить

мне не нужно мое приложение для доступа к любому из тех, кто выше. Как я могу избавиться от этого программно?

Edit 1

кажется, что Unity автоматически добавляет READ_EXTERNAL_STORAGE в любой комплекции по какой-то причине. Зачистка из разрешения не помогает в более новых версиях Unity, как сборка завершается с сообщением:

Невозможно объединить андроид манифестов ...

Edit 2

В OVRPlugin причины этот вопрос и на данный момент.

https://forum.unity3d.com/threads/how-to-remove-android-permission-read_external_storage.429369/

форумы Unity говорят, что это вряд ли исправить. Может быть, есть еще некоторые обходные пути?

Редактировать 3

Oculus работает над этим, мы должны получить исправление в феврале

https://forums.oculus.com/developer/discussion/42465/is-android-permission-read-external-storage-a-must-when-using-unity#latest

ответ

1

я натыкаюсь на это некоторое время назад, и до сих пор не знаю, почему 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).

Надеюсь, что это помогает,

+0

Спасибо за хорошо разработанный ответ! Позвольте мне проверить и сказать, работает ли он. – igorpavlov

+0

Не работает. Сбой сборки с сообщением «Невозможно объединить манифеста Android». – igorpavlov

+0

Вам необходимо изменить соответствие 'minSDKVersion' в настройках сборки (извините, забыл об этом). – Kardux