2015-01-07 5 views
6

В настоящее время у меня есть периодическая проблема, когда я получаю IllegalArgumentException, когда звоню Activity.startLockTask(). В моем приложении установлено приложение владельца устройства, которое позволило моему пакету автоматически подключаться.Activity.startLockTask() иногда бросает IllegalArgumentException

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

Код:

if (dpm.isLockTaskPermitted(getPackageName())) { 
    super.startLockTask(); 
} 

Logcat:

java.lang.IllegalArgumentException: Invalid task, not in foreground 
    at android.os.Parcel.readException(Parcel.java:1544) 
    at android.os.Parcel.readException(Parcel.java:1493) 
    at android.app.ActivityManagerProxy.startLockTaskMode(ActivityManagerNative.java:5223) 
    at android.app.Activity.startLockTask(Activity.java:6163) 

Вопрос в том, что мое приложение должно периодически перезапускается. Таким образом, мы освобождаем, завершаем работу и начинаем ее с новой задачи, а затем выходим из нашего процесса. Когда активность возвращается, он пытается закрепить себя - иногда это работает - иногда это не так. Я верю, что, как мы перезапускаем, вероятно, причина, по которой выбрано исключение, но это не имеет значения, так как новая активность IS на переднем плане и сосредоточена на ОС.

После того, как действие не удалось выполнить, он будет продолжать сбой, если он попытается: если я сижу и пытаюсь выполнить задачу каждые 5 секунд, она будет продолжать сбой каждый раз. Я пробовал закрепление в onCreate, onWindowFocusChanged, onResume и onStart.

Кто-нибудь знает, в чем проблема?

Для справки:
Line 8853: https://android.googlesource.com/platform/frameworks/base/+/android-5.0.2_r1/services/core/java/com/android/server/am/ActivityManagerService.java

+0

Использование '' mFocusedActivity' в ActivityManagerService', кажется, подразумевает, что 'onWindowFocusChanged (истина)' в действительности правильное место, чтобы сделать это. Отказ от ответственности: я еще не пытался использовать функцию блокировки задачи. –

+0

Если вы подозреваете, каким образом вы перезагружаетесь, чтобы быть проблемой, возможно, вы могли бы перезагрузиться более упорядоченным образом? Свяжите службу, которая выполняется в отдельном процессе. Передайте ему «Binder», созданный в основном процессе. Попросите основной процесс разблокировать задачу, закончить и выйти. Попросите службу дождаться уведомления о смерти объекта, прежде чем пытаться возобновить свою деятельность. –

+1

Это в основном то, что мы делаем.Я собираюсь создать простое приложение и посмотреть, могу ли я заставить его делать то же самое. – Randy

ответ

5

У меня такая же проблема, я не нашел правильное решение еще. Но это то, что я сейчас делаю.

Handler handler = new Handler(Looper.getMainLooper()); 
handler.postDelayed(new Runnable() { 
    @Override 
    public void run() { 
     try { 
      if (dpm.isLockTaskPermitted(getPackageName())) { 
       super.startLockTask(); 
      } 
     }catch (Exception exception) { 
      Log.v("KioskActivity","startLockTask - Invalid task, not in foreground"); 
     } 
    } 
},1500); 

кажется, что приложение запрашивает блокировку еще не получил фокус, даже несмотря на то, onWindowFocusChanged увольняют. Задерживая вызов startLocktask, он будет работать. Как бы там ни было небольшое время, когда приложение не будет закреплено/заблокировано. Я решил это с помощью некоторых дополнительных мер безопасности (у меня есть длинная служба в фоновом режиме, которая предотвращает выпадение теней уведомлений и закрывает окно настроек, если оно открыто).

К тому же, вам удалось решить эту проблему адекватным образом?

0

Я имел эту проблему и решить ее с помощью логики, взятую из ответов на этот пост: How can you tell when a layout has been drawn?

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

Пример кода (Поместите это в OnCreate метод):

> findViewById(R.id.your_view).post(new Runnable() { 
>    @Override 
>    public void run() { 
> 
>     // Run pinning code here 
>    } 
>   }); 

 Смежные вопросы

  • Нет связанных вопросов^_^