【问题标题】:Unity GearVR get rid of "requesting permission..."Unity GearVR 摆脱“请求权限...”
【发布时间】:2017-04-06 22:36:07
【问题描述】:

状态:尚未解决

问题

一旦我使用 GearVR 构建并安装了一个应用程序,它就会默认询问:

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

允许/拒绝

我不需要我的应用程序来访问上述任何内容。如何以编程方式摆脱这种情况?

编辑 1

Unity 似乎出于某种原因自动将 READ_EXTERNAL_STORAGE 添加到任何构建中。删除权限在较新版本的 Unity 中无济于事,因为构建失败并显示以下消息:

无法合并 android 清单...

编辑 2

OVRPlugin 导致了这个问题,目前。

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

Unity 论坛说它不太可能修复。也许还有一些解决方法?

编辑 3

Oculus 正在努力,我们应该会在 2 月收到修复

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

【问题讨论】:

    标签: android unity3d permissions gear-vr


    【解决方案1】:

    我前段时间偶然发现了这一点,但仍然不确定为什么 Unity 构建要求这些权限。无论如何,要摆脱它们,您可以使用编辑器脚本作为解决方法:

    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));
    }
    

    PERMISSIONS_NAMES_TO_DELETE 是要删除的权限名称的string[]。要获取权限名称列表,您可以查看here

    它的作用是:

    • /Android/Plugins/文件夹中获取之前的AndroidManifest.xml文件(如果存在的话),复制到一个临时文件夹中并删除
    • 执行第一次构建,让 Unity 自行生成 AndroidManifest.xml 文件
    • 编辑清单以“删除”不必要的权限
    • 将编辑的清单保存到/Android/Plugins/
    • 使用正确设置的清单执行第二次构建

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

    希望对你有帮助,

    【讨论】:

    • 感谢您精心设计的答案!让我测试并告诉你它是否有效。
    • 它不起作用。构建失败并显示消息“无法合并 android 清单”。
    • 您需要在构建设置中更改匹配的minSDKVersion(抱歉忘记了)。
    猜你喜欢
    • 2021-12-18
    • 2020-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-29
    • 1970-01-01
    相关资源
    最近更新 更多