是否有 Android 应用程序小部件权限更改的侦听器?

Is there a listener for Android app widget permission changes?

我一直在为 Android6 开发一个应用程序小部件,它的工作原理是每次广播接收器收到 onUpdate 时,它​​都会在使用适当的内容更新 RemoteView 之前检查权限,例如作为一条消息说,"permissions missing" 或它应该有的任何内容。

但是,我注意到如果我通过“系统”>“应用”>“权限”禁用我的应用所需的任何权限,该进程在 Studio 中会被标记为 "dead"。

如果我随后通过触发 onUpdate 来测试小部件是否仍然在模拟器中工作,果然它不再工作了。一旦我重新打开权限,就会生成一个新的进程 ID,并且小部件会再次运行。

现在我的问题是,有没有办法捕获权限的变化?由于权限更改 =/

我不确定这是否正是您要查找的内容,但我使用此代码来检查权限。如果权限被拒绝,下次您使用该应用程序(在我的例子中是可穿戴应用程序)时,它会再次请求权限。

我在一个额外的class中使用了这个函数,所以也许你应该修改它以适应它。

int permissionCheck = ContextCompat.checkSelfPermission(mainActivity,
                Manifest.permission.RECORD_AUDIO);

        if (permissionCheck != 0) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                mainActivity.requestPermissions(new String[]{Manifest.permission.RECORD_AUDIO,
                        Manifest.permission.INTERNET}, REQUEST_RECORD_AUDIO_PERMISSION);
            }
        }

你还必须声明一个 final 变量

private final int REQUEST_RECORD_AUDIO_PERMISSION=1;

您必须将行 Manifest.permission.RECORD_AUDIO 替换为 Manifest.permission。(您的许可)

如果你想经常检查权限 - 在需要权限之前制作一个方法并在你的代码中使用它。

希望能帮到你

比尔基

好的,我想我已经找到问题了...

当用户进入 phone 的设置 > 应用程序 > 应用程序 > 权限然后撤销权限时,它最终会终止应用程序的进程 - 或者它实际上可能会在某个地方暂停,因为一旦你再次授予权限,相同的进程(相同的 PID)再次存活。

因此,小部件 ID 丢失,因此在收到广播时不会调用 onUpdate(),并且无法更新已添加到主屏幕的所有小部件。

那么,解决方法是什么?

获取 AppWidgetManager 的新实例,并在调用 super.onReceive() 之前手动将这些小部件 ID 放回 Intent 中。然后您将能够再次访问所有小部件实例并相应地更新它们。

@Override
public void onReceive(Context c, Intent i) {

    String action = i.getAction();
    if ( action.equals(AppWidgetManager.ACTION_APPWIDGET_UPDATE) ) {
        ComponentName thiswidget = new ComponentName(c,     BroadcastHandler.class);
         AppWidgetManager am = AppWidgetManager.getInstance(c);
         int[] ids = am.getAppWidgetIds(thiswidget);
         i.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, ids);

        // either handle the permission change at this point or in onUpdate()
    }

    super.onReceive(c,i);

}

老实说,我不知道为什么 Google 没有权限被撤销的侦听器 =/