3

Я работаю над виджетами приложений для Android 6 и как он работает, так это то, что каждый раз, когда Broadcast Receiver получает onUpdate, он проверяет разрешения перед обновлением RemoteView с соответствующим содержимым, таким как сообщение «Разрешения» отсутствует "или что бы это ни предполагалось.Есть ли у слушателя изменения разрешения виджета для приложений Android?

Тем не менее, я заметил, что если я отключу любое разрешение, которое требуется моему приложению через System> App> Permissions, процесс будет помечен как «мертвый» в Studio.

Если я затем проверяю, работает ли виджет в эмуляторе, запуская onUpdate, достаточно уверен, что он больше не работает. Как только я снова включу разрешения, будет создан новый идентификатор процесса, и виджет будет жив и снова будет работать.

Теперь, мой вопрос: есть ли способ зафиксировать это изменение в разрешениях? Странно, что виджет по-прежнему «жив» на главном экране, когда он предположительно «мертв» в соответствии с Studio (без ошибок, которые, похоже, ...) из-за изменений разрешений =/

ответ

0

Да, я думаю, что я понял, проблему ...

Когда пользователь переходит в настройках> Приложения> приложения> права на телефоне а затем отменяет права доступа, это приводит к уничтожению процесса приложения - или его можно фактически приостановить, потому что как только вы снова дадите разрешение, тот же процесс (тот же PID) снова будет жив.

В результате этого идентификаторы виджетов теряются, поэтому onUpdate() не вызывается при получении широковещательной передачи, и все виджеты, которые были добавлены на главный экран, не могут быть обновлены.

Итак, обходной путь?

Извлеките новый экземпляр AppWidgetManager и вручную поместите эти идентификаторы виджетов обратно в Intent перед вызовом super.onReceive(). Затем вы сможете снова получить доступ ко всем экземплярам виджета и соответствующим образом обновить их.

@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 не имеет права доступа отозван слушатель быть честными =/

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.RECORD_AUDIO с Manifest.permission. (Ваше разрешение)

Если вы хотите часто проверять разрешение - использовать метод и использовать его в коде перед тем, как требуется разрешение.

Надежда я мог бы помочь вам

Birki

+0

Проблема заключается в том, что происходит после того, как разрешения предоставляются.Если я вручную отключу разрешения с помощью настроек телефона, виджет приложения перестанет работать на главном экране, и процесс покажется мертвым без ошибок - вот что я пытаюсь поймать = / – Ken