是否有 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 没有权限被撤销的侦听器 =/
我一直在为 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 没有权限被撤销的侦听器 =/