2017-01-30 59 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