我的应用要求Gmail应用(不是Android版)需要在Froyo或Gingerbread上达到2.3.6或更高版本; Honeycomb和ICS 4.0.5或更高版本。
另外,我使用“com.google.android.gm.permission.READ_CONTENT_PROVIDER”权限。我认为上述权限要么未授予,要么不适用于较旧的Gmail应用版本。
如果设备已安装最新的Gmail应用,我的应用效果很好。但是,如果用户先安装我的应用,然后更新Gmail应用,我的应用就会失败。
这是Logcat:
使用较旧的Gmail应用推出:
08-14 16:13:12.370 E/DatabaseUtils(22386): java.lang.SecurityException: Permission Denial: reading com.google.android.gm.provider.PublicContentProvider uri content://com.google.android.gm/_____@gmail.com/labels from pid=22456, uid=10113 requires com.google.android.gm.permission.READ_CONTENT_PROVIDER
安装最新的gmail应用后推出:
08-14 16:14:17.105 W/PackageManager( 1974): Not granting permission com.google.android.gm.permission.READ_CONTENT_PROVIDER to package com.ellevsoft.gmailunread because it was previously installed without
我知道最简单的解决方案是卸载我的应用并重新安装
我想让用户轻松一点。有没有办法重新申请许可?是否有广播接收器来检测Gmail应用是否正在更新(安装)并再次请求权限?
谢谢。
答案 0 :(得分:2)
不,你不能这样做。 Android(PacakgeManagerService
)只会授予您知道的权限。它只知道已安装的应用程序的权限。其他一切都被忽略了。您可以做的最好的事情是检查已安装的Gmail版本并指示人员更新它,然后重新安装您的应用。顺便说一下,这个许可是公开的吗?我不认为Gmail允许第三方应用程序再读取其数据,他们很久以前就改变了这一点。
答案 1 :(得分:0)
在活动的onCreate中使用此代码,您可以在每次用户启动安装了Gmail版本的应用时请求:
final int version_GB = 236;
final int version_ICS = 405;
try
{
PackageInfo pInfo = getPackageManager().getPackageInfo("com.google.android.gm", 0);
int version = Integer.parseInt(pInfo.versionName.replace(".", ""));
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB && version >= version_ICS)
{
// Version 4.0.5 or higher on HONEYCOMB or higher
}
else if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.FROYO && version >= version_GB)
{
// Version 2.3.6 or higher on FROYO or higher
}
}
catch (NameNotFoundException e)
{
// not installed...
}
请务必首先检查较新的Android版本,然后转到旧版本。