3

我的应用需要 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 应用程序是否正在更新(安装)并再次请求权限?

谢谢你。

4

2 回答 2

2

不,你不能那样做。Android ( PacakgeManagerService) 只会授予您它知道的权限。它只知道来自已安装应用程序的权限。其他一切都被忽略。您可以做的最好的事情是检查已安装的 Gmail 版本并指示人们对其进行更新,然后重新安装您的应用程序。顺便说一句,这个权限是公开的吗?我认为 Gmail 不再允许第三方应用程序读取其数据,他们在很久以前就改变了这一点。

于 2013-08-27T02:02:06.853 回答
0

使用 Activity 的 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 版本,然后再转到较旧的版本。

于 2013-08-25T01:06:54.083 回答