天天看點

google play安裝後打開Fc或點選下載下傳時Crash

本文主要介紹google play fc, java.lang.securityexception: invalid value for is_public_api: null異常的解決方法及具體原因。

google play安裝後打開Fc或點選下載下傳時Crash
google play安裝後打開Fc或點選下載下傳時Crash

那麼就順便介紹下解決的方法吧@三星。

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權限進行靜默安裝,而隻有系統應用具有該權限。