本文主要介紹google play fc, java.lang.securityexception: invalid value for is_public_api: null異常的解決方法及具體原因。
那麼就順便介紹下解決的方法吧@三星。
1、異常資訊:
很多第三方android rom去掉google play後,使用者從第三方應用市場下載下傳google play安裝後打開fc或點選下載下傳時crash
異常資訊如下:
1
2
3
4
5
6
7
8
9
writing exception to parcel
java.lang.securityexception: invalid value for is_public_api: null
at com.android.providers.downloads.downloadprovider.enforceallowedvalues(downloadprovider.java:942)
at com.android.providers.downloads.downloadprovider.checkinsertpermissions(downloadprovider.java:856)
at com.android.providers.downloads.downloadprovider.insert(downloadprovider.java:550)
at android.content.contentprovider$transport.insert(contentprovider.java:205)
at android.content.contentprovidernative.ontransact(contentprovidernative.java:148)
at android.os.binder.exectransact(binder.java:367)
at dalvik.system.nativestart.run(native method)
或
點選展開代碼
2、解決方法:
一種方法是将google play apk從/data/app移到/system/app,這樣就是系統應用了,不過現實很多使用者不會這種操作且不能讓使用者這樣操作,而應系統自己解決。系統解決方法為修改
frameworks/base/services/java/com/android/server/pm/packagemanagerservice.java類的
private void grantpermissionslpw(packageparser.package pkg, boolean replace)函數,
修改如下:
com.android.vending特殊處理
其中// trinea begin和// trinea end為新增部分,表示将包名com.android.vending(google play包名)且簽名正确的應用設定為允許,将在後面改變其簽名為系統簽名當作系統應用處理。
3、具體原因:
究其原因是因為第三方rom去掉google play後,使用者從市場下載下傳google play後安裝并不會當作系統應用處理。
第一個異常原因是非系統應用無法擁有android.permission.access_download_manager權限,而在downloadprovider的insert函數中會調用checkinsertpermissions檢查資料庫操作權限,代碼如下:
10
11
12
13
14
15
16
17
private void checkinsertpermissions(contentvalues values) {
if (getcontext().checkcallingorselfpermission(downloads.impl.permission_access)
== packagemanager.permission_granted) {
return;
}
getcontext().enforcecallingorselfpermission(android.manifest.permission.internet,
"internet permission is required to use the download manager");
// ensure the request fits within the bounds of a public api request
// first copy so we can remove values
values = new contentvalues(values);
// check columns whose values are restricted
enforceallowedvalues(values, downloads.impl.column_is_public_api, boolean.true);
……
裡面會有一系列的權限認證,上面異常即因為google play的downloads.impl.column_is_public_api為空,不滿足為true的條件。
把google play當作系統應用處理後擁有downloads.impl.permission_access權限,在最開始檢查時即滿足而退出。
第二個異常是因為google play安裝程式時使用到了android.permission.install_packages權限進行靜默安裝,而隻有系統應用具有該權限。