2011-11-28 44 views
1

一直在做一些Android權限研究,並且運行了一個應用程序 - 根據AndroidManifest.xml文件 - 僅聲明WRITE_EXTERNAL_STORAGE作爲權限。 Android Market僅報告此情況。使用aapt工具轉儲uses-permission,它也只報告一個權限。PackageManager和AndroidManifest.xml報告不同的用途 - 權限

然而,在代碼運行在Android設備(或仿真器)上,執行以下操作:

PackageManager pm = getPackageManager(); 
List<PackageInfo> pkgList = pm.getInstalledPackages(PackageManager.GET_PERMISSIONS | PackageManager.GET_SIGNATURES); 

... 

PackageInfo p = pkgList.get(i); // where i is the index of the apk in question 
String[] perms = p.requestedPermissions; 

我得到2個權限此APK,READ_PHONE_STATE和一個在清單中,WRITE_EXTERNAL_STORAGE。查看「管理應用程序」屏幕並選擇詳細信息還顯示額外的READ_PHONE_STATE權限。

是否存在Android Manifest中不需要的權限可以/隱含的情況(在代碼中,由feature use等等)?或換句話說,爲什麼aapt返回一組權限,並且getPackageManager().getPackageInfo() API返回另一組?

編輯:

與「越多越好」的字詞進行搜索發現我一直在尋找的答案:Android permissions: Phone Calls: read phone state and identity

總之,隨着SDK的早期版本編譯的APK沒有繼承自由一些權限...

回答

1

據我所知,權限必須始終在清單中明確設置。

如果應用程序需要訪問受權限保護的功能,則必須聲明它需要具有清單中元素的權限。然後,當應用程序安裝在設備上時,安裝程​​序會通過檢查簽署應用程序證書的權限並在某些情況下詢問用戶來確定是否授予請求的權限。如果授予權限,則應用程序可以使用受保護的功能。如果沒有,那麼訪問這些功能的嘗試只會在沒有任何通知給用戶的情況下失敗。

source

你所看到的,我相信不同的是由於權限的protectionLevel屬性。任何設置爲「正常」的權限都不需要由用戶確定,以便它們只顯示在「詳細信息」部分中。