将应用程序更新为 Marshmallow 或 Nougat

Posted

技术标签:

【中文标题】将应用程序更新为 Marshmallow 或 Nougat【英文标题】:Update app to Marshmallow or Nougat 【发布时间】:2017-07-11 13:44:47 【问题描述】:

我的应用程序以 Lollipop 为目标,在安装时授予权限。 然后我的目标是牛轧糖(我跳过了 Marshmallow,因为我去年没有时间)所以我必须在安装后立即在运行时创建权限请求。没关系,这花了我一些时间,但应用程序会毫无问题地要求他们,并且如果没有被授予,则行为正确。

但是,我的问题是: 我有成千上万的用户安装了该应用程序,现在,更新后他们被要求再次授予权限,即使他们在更新之前已经被授予。结果是我每天都在失去很多用户。他们认为该应用程序正在请求新的权限。我很难向他们解释这些权限是在更新之前授予的,并且该应用程序并不“危险”,事实上,其中许多用户已经使用该应用程序多年,但现在他们只是不信任。

所以,我的问题是:我可以以某种方式回滚吗? 我可以让 Playstore 尊重更新前已经授予的权限吗? 我了解运行时权限应该适用于新安装,而不是更新。我认为谷歌在这里(再次)做错了。

【问题讨论】:

【参考方案1】:

我不这么认为。我同意,这很痛苦,但谷歌想要的正是摆脱在安装时授予权限然后不再询问的方案。

恕我直言,您可以做的最好的事情是稍微控制一下情况并检测是否在启动时授予权限,如果没有,则将用户引导到一个花哨的活动,在那里您告诉用户您对谷歌的不满, 并且他/她需要再次授权权限以确保他/她自己的安全等...

你可以使用这样的东西

    /**
     * Check the application has Permissions
     *
     * @param context App context
     * @return Whether
     */

   static boolean hasPermissions(Context context, String[] permissions) 
        for (String p : permissions) 
            if (ActivityCompat.checkSelfPermission(context, p) != PackageManager.PERMISSION_GRANTED)
                return false;
        
        return true;
    

然后查询任意权限:

boolean hasMyPermissions = hasPermissions (context, 
            android.Manifest.permission.READ_CONTACTS,
            android.Manifest.permission.ACCESS_FINE_LOCATION,
            android.Manifest.permission.ACCESS_COARSE_LOCATION,
            android.Manifest.permission.CALL_PHONE,
            android.Manifest.permission.READ_EXTERNAL_STORAGE
    );

  if (!hasMyPermissions) 

       // open a cool activity / fragment / etc with graphics, fancy text, etc.. then
       // ask the user for permissions
        ActivityCompat.requestPermissions(context, permissions, PERMISSIONS_REQUEST_CODE);

  

你会在onRequestPermissionsResult收到回调:

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) 
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == PERMISSIONS_REQUEST_CODE) 
        // permissions: Same String[] with your req permissions
        // grantresults: wether each individual permission has been granted or not
    

【讨论】:

谢谢,但您没有理解问题所在。我在 50000 台设备上安装了我的应用程序。它的目标是棒棒糖。然后我对其进行了修改,将其设置为针对 Nougat 并在运行时请求权限。它运行良好,但问题是它要求对那些已安装的 50000 个设备的权限。因为一旦更新,该应用程序没有授予权限,因此它会要求它们。这使得许多用户不喜欢该应用程序,因为他们认为该应用程序正在请求新的权限。用户不记得第一次安装时授予了哪些权限。 我了解您的问题。不幸的是,没有解决方案(afaik)。我建议您通过显示自定义 UI 并通知您的用户以某种方式控制重新授予的权限。否则,告诉你的用户降级到 Lollipop :( 所以,正如我所说,谷歌这次(再次)做出了一个糟糕的决定

以上是关于将应用程序更新为 Marshmallow 或 Nougat的主要内容,如果未能解决你的问题,请参考以下文章

使用 Marshmallow 模式过滤 sqlalchemy 表更新

flask-marshmallow:仅当方法为 PUT 时如何将所有字段标记为可选

marshmallow: 简化Python对象系列化

棉花糖升级后,appwidget listview 行未更新或加载

AndroidHttpClient 和 HttpGet API 在 Android 6.0 Marshmallow (API 23) 中已弃用

如何以编程方式打开 Android 6.0 (Marshmallow) 上特定应用的权限屏幕?