Hallo zusammen,
3 Tage lang versuche ich nun schon folgendes Problem zu lösen:
Meine App soll eine SlideShow per WebView auf einem Android laufen lassen. Diese soll zu einer bestimmten Uhrzeit starten und später wieder den Monitor in den Lock-Modus wechseln. Dies soll täglich passieren. Das meiste davon funktioniert auch schon nur halt das "Täglich wiederholen" läuft nicht wie es soll.
Folgende Code Auszüge sollen verdeutlichen wie ich dies umgesetzt habe.
private void setupSleepDevice(int houre, int minute){
Calendar calNow = Calendar.getInstance();
Calendar calSet = (Calendar) calNow.clone();
calSet.set(Calendar.HOUR_OF_DAY, houre);
calSet.set(Calendar.MINUTE, minute);
calSet.set(Calendar.SECOND, 0);
calSet.set(Calendar.MILLISECOND, 0);
if (calSet.compareTo(calNow) <= 0){
calSet.add(Calendar.DATE, 1);
}
Intent intent = new Intent(getBaseContext(), SleepReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(getBaseContext(), 0, intent, 0);
alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
alarmManager.setRepeating(AlarmManager.RTC,calSet.getTimeInMillis(),120000,pendingIntent);
}
// erzeugen eines Kalendertermines und damit verbundenen Intent an WakeReceiver zum entsperren des Devices
private void setupWakeDevice(int houre, int minute){
Calendar calNow = Calendar.getInstance();
Calendar calSet = (Calendar) calNow.clone();
calSet.set(Calendar.HOUR_OF_DAY, houre);
calSet.set(Calendar.MINUTE, minute);
calSet.set(Calendar.SECOND, 0);
calSet.set(Calendar.MILLISECOND, 0);
if (calSet.compareTo(calNow) <= 0){
calSet.add(Calendar.DATE, 1);
}
Intent intent = new Intent(getBaseContext(), WakeReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(getBaseContext(), 0, intent, 0);
alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,calSet.getTimeInMillis(),120000,pendingIntent);
}
Alles anzeigen
Die dazu gehörigen receiver Klassen sehen wie folgt aus:
public class SleepReceiver extends BroadcastReceiver {
private Context context;
@Override
public void onReceive(Context k1, Intent k2) {
// TODO Auto-generated method stub
context = k1;
Log.e(DataSource.class.getSimpleName(), "Device wird ins bett geschickt");
//Toast.makeText(k1, "SleepAndLock", Toast.LENGTH_LONG).show();
sleepAndLock();
}
private void sleepAndLock(){
ComponentName devAdminReceiver; // this would have been declared in your class body
// then in your onCreate
DevicePolicyManager mDPM = (DevicePolicyManager)context.getSystemService(Context.DEVICE_POLICY_SERVICE);
devAdminReceiver = new ComponentName(context, SleepReceiver.class);
boolean admin = mDPM.isAdminActive(devAdminReceiver);
if (admin) mDPM.lockNow();
else Toast.makeText(context, "no Admin", Toast.LENGTH_LONG).show();
}
}
Alles anzeigen
public class WakeReceiver extends BroadcastReceiver {
private Context context;
@Override
public void onReceive(Context k1, Intent k2) {
// TODO Auto-generated method stub
context = k1;
Log.e(DataSource.class.getSimpleName(), "Device wird aufgeweckt");
wakeAndRelease();
}
private void wakeAndRelease(){
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wakeLock = pm.newWakeLock((PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP), "TAG");
wakeLock.acquire();
KeyguardManager keyguardManager = (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE);
KeyguardManager.KeyguardLock keyguardLock = keyguardManager.newKeyguardLock("TAG");
keyguardLock.disableKeyguard();
}
}
Alles anzeigen
Zu guter letzt das Manifest:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.sirseni.simpleandroidwebviewexample">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme">
<activity
android:name=".MainActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name=".SleepReceiver" android:process=":remote" android:permission="android.permission.BIND_DEVICE_ADMIN">
<meta-data
android:name="android.app.device_admin"
android:resource="@xml/admin"/>
<intent-filter>
<action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
</intent-filter>
</receiver>
<receiver android:name=".WakeReceiver" android:process=":remote" />
</application>
</manifest>
Alles anzeigen
Schön wäre es wenn es jetzt gar nicht geht oder komplett aber nö ne nein... es geht unregelmäßig.
Hier is die Ausgabe aus meinem Log:
08-09 20:52:45.705 9721-9721/com.sirseni.simpleandroidwebviewexample:remote E/DataSource: Device wird ins bett geschickt
08-09 20:53:00.105 9721-9721/com.sirseni.simpleandroidwebviewexample:remote E/DataSource: Device wird aufgeweckt
08-09 20:54:00.035 9721-9721/com.sirseni.simpleandroidwebviewexample:remote E/DataSource: Device wird ins bett geschickt
08-09 20:56:01.755 9721-9721/com.sirseni.simpleandroidwebviewexample:remote E/DataSource: Device wird aufgeweckt
08-09 20:56:01.905 9721-9721/com.sirseni.simpleandroidwebviewexample:remote E/DataSource: Device wird ins bett geschickt
08-09 20:58:02.695 9721-9721/com.sirseni.simpleandroidwebviewexample:remote E/DataSource: Device wird aufgeweckt
08-09 20:58:02.875 9721-9721/com.sirseni.simpleandroidwebviewexample:remote E/DataSource: Device wird ins bett geschickt
08-09 20:59:25.765 9721-9721/com.sirseni.simpleandroidwebviewexample:remote E/DataSource: Device wird aufgeweckt
08-09 21:00:03.575 9721-9721/com.sirseni.simpleandroidwebviewexample:remote E/DataSource: Device wird ins bett geschickt
08-09 21:02:04.015 9721-9721/com.sirseni.simpleandroidwebviewexample:remote E/DataSource: Device wird aufgeweckt
08-09 21:02:04.165 9721-9721/com.sirseni.simpleandroidwebviewexample:remote E/DataSource: Device wird ins bett geschickt
08-09 21:04:05.085 9721-9721/com.sirseni.simpleandroidwebviewexample:remote E/DataSource: Device wird aufgeweckt
08-09 21:04:05.245 9721-9721/com.sirseni.simpleandroidwebviewexample:remote E/DataSource: Device wird ins bett geschickt
08-09 21:05:46.395 9721-9721/com.sirseni.simpleandroidwebviewexample:remote E/DataSource: Device wird aufgeweckt
08-09 21:06:05.855 9721-9721/com.sirseni.simpleandroidwebviewexample:remote E/DataSource: Device wird ins bett geschickt
Alles anzeigen
In der Ausgabe kann man sehen das es mal geht, dann mal wieder nicht und zwischen durch auch mal zu falschen Zeiten?!?! Eigentlich soll es (zu test zwecken) jede Minute den zustand wechseln.
Ich verstehe einfach nicht woran es liegt. Ich habe es schon auf allen erdenklichen weisen probiert. Seit KitKat werden wohl alle Repeatings in Form von "setInexactRepeating" ausgeführt. Also hab ich es auch mal mit einem Handler versucht wo in der Run() Funktion "alarmManager.setExact(AlarmManager.RTC, calSetSleep.getTimeInMillis(), pendingIntentSleep);" gestanden hat.
...kein erfolg...
Ich habe alle Constanten versucht, wie ELAPSED_REALTIME etc.
...kein erfolg...
Als Vorlage wie man den AlarmManager nutzt habe ich z.B. folgenden Link benutzt https://www.sitepoint.com/sche…background-tasks-android/
Ich habe aber auch schon so ziemlich alle anderen Seiten zu dem Thema besucht aber egal wie ich es drehe und wende...kein Erfolg
Ich hoffe ihr könnt mir weiter helfen.
Beste Grüße,
Jerome