Android:重新请求权限

时间:2013-08-20 15:40:48

标签: android permissions gmail

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

谢谢。

2 个答案:

答案 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版本,然后转到旧版本。