3

我一直在为Android 6开发一个应用程序部件,它的工作原理是每次广播接收器接收到一个onUpdate时,它都会在更新RemoteView之前检查权限,并使用适当的内容,比如说“权限失踪“或任何它应该有的。是否有Android应用程序窗口小部件权限更改的监听器?

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

如果我然后通过触发一个onUpdate来测试widget是否仍然在模拟器中工作,果然它不再工作。只要我再次切换权限,就会生成一个新的进程ID,并且该小组件仍处于活动状态并再次运行。

现在我的问题是,有没有办法捕捉到权限的变化?奇怪的是,当它根据Studio被认为是“死”的时候,这个小部件在主屏幕上仍然“活着”(因为权限发生变化,没有错误出现).../

回答

0

对,我想我已经想通了这个问题...

当用户进入手机的设置>应用程序>应用程序>权限然后撤消权限,最终会终止应用程序的进程 - 或者实际上它可能会被暂停,因为只要您再次授予权限,同一进程(同一个PID)就会再次生效。

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

那么,解决方法?

在调用super.onReceive()之前,获取AppWidgetManager的新实例并手动将这些小部件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); 

} 

我不知道为什么谷歌不具备的权限撤销听众说实话=/

0

我不是当然,如果那就是你正在寻找的东西,但我使用这段代码来检查权限。如果权限被拒绝,下次您使用该应用程序(我的情况下可穿戴应用程序),它会再次要求许可。

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

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更换线Manifest.permission.RECORD_AUDIO。(你的许可)

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

希望我可以帮助你

Birki

+0

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

相关问题