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

是否有Android应用程序小部件权限更改的侦听器?,android,android-widget,android-6.0-marshmallow,smartphone,Android,Android Widget,Android 6.0 Marshmallow,Smartphone,我一直在为Android 6开发一个应用程序小部件,它的工作原理是,每次广播接收器收到onUpdate时,它都会检查权限,然后再使用适当的内容更新RemoteView,比如一条消息,上面写着“权限缺失”或它应该具有的任何内容 但是,我注意到,如果我通过System>app>permissions禁用我的应用程序所需的任何权限,该进程将在Studio中标记为“死” 如果我随后通过触发onUpdate来测试小部件在模拟器中是否仍然工作,那么肯定它不再工作了。一旦我重新打开权限,就会生成一个新的进程I

我一直在为Android 6开发一个应用程序小部件,它的工作原理是,每次广播接收器收到onUpdate时,它都会检查权限,然后再使用适当的内容更新RemoteView,比如一条消息,上面写着“权限缺失”或它应该具有的任何内容

但是,我注意到,如果我通过System>app>permissions禁用我的应用程序所需的任何权限,该进程将在Studio中标记为“死”

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


现在我的问题是,有没有一种方法可以捕获权限的更改?奇怪的是,这个小部件在主屏幕上仍然是“活动的”,而Studio认为它应该是“死的”(似乎没有抛出错误…),因为权限更改=/

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

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

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);
            }
        }
此外,还必须声明一个最终变量

private final int REQUEST_RECORD_AUDIO_PERMISSION=1;
您必须将行Manifest.permission.RECORD\u AUDIO替换为Manifest.permission。(您的权限)

如果您想经常检查权限-在需要权限之前,创建一个方法并在代码中使用它

希望我能帮助你


Birki

是的,我想我已经解决了问题

当用户进入手机的设置>应用程序>应用程序>权限,然后撤销权限时,它最终会终止应用程序的进程-或者它实际上可能在某个地方被挂起,因为一旦您再次授予权限,相同的进程(相同的PID)就会再次激活

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

那么,解决办法是什么

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

@覆盖
接收时公共无效(上下文c,意图i){
String action=i.getAction();
if(action.equals(AppWidgetManager.action\u APPWIDGET\u UPDATE)){
ComponentName thiswidget=新组件名(c,BroadcastHandler.class);
AppWidgetManager am=AppWidgetManager.getInstance(c);
int[]id=am.getAppWidgetId(thiswidget);
i、 putExtra(AppWidgetManager.EXTRA_APPWIDGET_id,id);
//此时或在onUpdate()中处理权限更改
}
super.onReceive(c,i);
}

老实说,我不知道谷歌为什么没有被撤销的权限=/

问题在于权限被授予后会发生什么。如果我通过手机设置手动关闭权限,应用程序小部件将停止在主屏幕上工作,并且该过程显示为死机,没有错误-这就是我试图捕捉的=/