Unity GearVR 摆脱"requesting permission..."



状态:尚未解决

问题

一旦我用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

我不久前偶然发现了这一点,但仍然不确定为什么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[]。要获得权限名称列表,您可以在此处查看)

它的作用是:

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

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

希望这有帮助,

相关内容

  • 没有找到相关文章

最新更新