google play安装后打开Fc或点击下载时Crash

本文主要介绍google play fc, java.lang.SecurityException: Invalid value for is_public_api: null异常的解决方法及具体原因

今天@互联网的那些事转发了三星行货S3手机居然压根儿就不能打开google play商店的问题,会发现很多rom都有这个问题。

google play安装后打开Fc或点击下载时Crashgoogle 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检查数据库操作权限,代码如下:

1

2

3

4

5

6

7

8

9

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权限进行静默安装,而只有系统应用具有该权限。

上一篇:Sqlite插入或更新


下一篇:android.os.BadParcelableException: ClassNotFoundException when unmarshalling