В онлайн-документации для PowerManager не упоминается об этом, но последний исходный код (версия 24 API 1) имеет то, что выглядит, должно быть решением этого вопрос:
String ACTION_LIGHT_DEVICE_IDLE_MODE_CHANGED
= "android.os.action.LIGHT_DEVICE_IDLE_MODE_CHANGED"
boolean isLightDeviceIdleMode()
В теории, можно просто зарегистрировать код в качестве приемника для намерения и проверить текущее значение функции. Некоторые, выкапывающие dumpsys activity broadcasts
, показывают, что намерение действительно отправляется при изменении состояния легкой дозы.
Однако последний SDK Platform (API 24 редакция 2) не имеет эти символы в нем - я получаю ошибку компиляции (и некоторые тыкать с javap
и jar
показывает, что они на самом деле нет). Приобретая Google, нам говорят, что это намеченный дизайн.
Существует работа, которая заключается в том, чтобы жестко закодировать одну и ту же строку, упомянутую выше, а затем использовать отражение для вызова той же функции, которая была бы вызвана в API. Пример:
/**
* Check if the device is currently in the Light IDLE mode.
*
* @param context The application context.
* @return True if the device is in the Light IDLE mode.
*/
public static boolean isLightDeviceIdleMode(final Context context) {
boolean result = false;
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
if (pm != null) {
// result = pm.isLightDeviceIdleMode();
try {
Log.d(TAG, "Trying reflection for isLightDeviceIdleMode");
Field pmServiceField = pm.getClass().getDeclaredField("mService");
pmServiceField.setAccessible(true);
Object pmService = pmServiceField.get(pm);
Method isLightDeviceIdleMode = pmService.getClass().getDeclaredMethod("isLightDeviceIdleMode");
isLightDeviceIdleMode.setAccessible(true);
result = (Boolean) isLightDeviceIdleMode.invoke(pmService);
} catch (NoSuchFieldException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e) {
Log.e(TAG, "Reflection failed for isLightDeviceIdleMode: " + e.toString());
} catch (RemoteException re) {
Log.e(TAG, "Remote exception checking isLightDeviceIdleMode: " + e.toString());
}
}
return result;
}
Я больше не занимаюсь Android, поэтому я не могу проверить, что это работает, но выглядит разумно, поэтому я перехожу к принятому ответу. Если кто-то сталкивается с проблемой, он всегда может вернуться к моему ответу. – TrevorWiley