android - Unity GearVR 去掉 "requesting permission..."

标签 android unity-game-engine permissions gear-vr

状态:尚未解决

问题

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

XXX is requesting permission to access photos, media and files on your device. Allow?

Allow / Deny

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

编辑 1

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

Unable to merge android manifests...

编辑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

最佳答案

我前段时间偶然发现了这个,但仍然不确定为什么 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 文件
  • 编辑 list 以“删除”不必要的权限
  • 将编辑后的 list 保存到/Android/Plugins/
  • 使用正确设置的 list 执行第二次构建

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

希望这对您有所帮助,

关于android - Unity GearVR 去掉 "requesting permission...",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41929160/

相关文章:

android - 为什么用户会在基于摩托罗拉 DROID android 的手机上报告小文本?

android - ConnectivityManager.CONNECTIVITY_ACTION 在 API >= 14 中断开网络连接?

c# - 协程停止工作

DatabaseError 无法打开数据库文件

android - -webkit-overflow-scrolling :touch 有多少支持

android - 从 firebase 存储下载时加密文件?

c# - Unity 编辑器脚本 - 使用 MouseOver 获取游戏对象

unity-game-engine - 复制可编写脚本的对象

linux - CentOS上无法删除用户目录

安卓 6.0 getLastKnowLocationPermission