Android:重新请求权限

Android:重新请求权限,android,permissions,gmail,Android,Permissions,Gmail,我的应用程序要求Gmail应用程序(非Android版本)必须在Froyo或Gingerbread上达到2.3.6或更高版本;蜂窝和ICS上的4.0.5或更高版本 此外,我使用“com.google.android.gm.permission.READ\u CONTENT\u PROVIDER”权限。我相信以上许可要么不被授予,要么不适用于较旧的Gmail应用程序版本 如果设备已经安装了最新的Gmail应用程序,我的应用程序运行良好。但是,如果用户先安装我的应用程序,然后更新Gmail应用程序,

我的应用程序要求Gmail应用程序(非Android版本)必须在Froyo或Gingerbread上达到2.3.6或更高版本;蜂窝和ICS上的4.0.5或更高版本

此外,我使用“com.google.android.gm.permission.READ\u CONTENT\u PROVIDER”权限。我相信以上许可要么不被授予,要么不适用于较旧的Gmail应用程序版本

如果设备已经安装了最新的Gmail应用程序,我的应用程序运行良好。但是,如果用户先安装我的应用程序,然后更新Gmail应用程序,我的应用程序将失败

这是日志:
使用较旧的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
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...
}

我知道最简单的解决方案是卸载我的应用程序,然后重新安装。
我想让用户更容易使用。有没有办法重新申请许可?是否有broadcastreceiver来检测Gmail应用程序是否正在更新(安装)并再次请求许可


谢谢。

使用“活动创建”中的此代码,您可以在用户每次启动安装了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
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版本,然后再转到较旧的版本。

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

感谢您提供检查Gmail应用程序版本的代码。然而,我“真正”想知道的是重新请求permission。因为即使在Gmail应用程序更新之后,我的应用程序仍然失败。它是在未经许可的情况下安装的。您可以确认,以前由多个应用程序使用的非官方内容提供商已不再适用于外部应用程序,但您可以使用一个官方只读内容提供商。它的限制更大,不授予您访问电子邮件内容的权限,但这是使用上述权限的权限。有关Gmail API的更多详细信息,请阅读以下内容:A那一个,它只显示标签和计数。很高兴听到它仍然有效:)