2017-01-30 61 views
2

状态:没有解决团结GearVR摆脱“请求许可......”

问题

一次我构建和安装与GearVR一个应用程序,它要求默认:

XXX正在请求访问设备上的照片,媒体和文件的权限。允许?

允许/拒绝

我不需要我的应用程序访问任何与上面。我怎样才能摆脱这个编程?

编辑1

看来,统一自动添加READ_EXTERNAL_STORAGE任何编译出于某种原因。剔除权限不统一新版本帮助作为构建失败,与消息:

无法合并的Android清单...

编辑2

的OVRPlugin原因这个问题和目前。

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

团结论坛上说,这是不可能修复。也许还有一些解决方法?

编辑3

Oculus公司正在研究它,我们应该在二月

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

回答

1

我偶然发现此接受修复前一段时间,仍然不知道为什么统一建立索要这些权限。反正摆脱他们,你可以使用编辑器脚本作为一种解决方法:(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文件放在自己的
  • 编辑清单为“删除”不必要的权限
  • 保存到/安卓/插件/
  • 有正确设置清单
进行第二次构建

权限删除背后的想法是将最大API级别设置为较低级别,权限将不可用(请注意,在此API级别,权限必须为)。

希望这有助于

+0

感谢您一个很好的设计答案!让我测试并告诉你它是否有效。 – igorpavlov

+0

它不起作用。构建失败,并显示消息“无法合并android清单”。 – igorpavlov

+0

您需要在您的构建设置中更改匹配的'minSDKVersion'(对不起,忘了它)。 – Kardux