Hallo Community
Weil ich auf meinem Galaxy S9 ein Prepaid-Surf-Abo gelöst habe und unterwegs gelegentlich vergesse, die Mobile Daten auszuschalten, was mein Surf-Konto plündert, möchte ich eine App schreiben, die mir genau dann eine Notification (oben links) anzeigt, wenn "Mobile Daten" eingeschaltet ist. Es ist mir als Anfänger gelungen, als Teillösung eine App zu schreiben, die beim Ausführen diese Notification anzeigt, wenn "Mobile Daten" eingeschaltet ist, bzw. löscht, wenn nur WLAN eingeschaltet ist. Aber ich scheitere daran, jetzt daraus eine selbständige App zu machen, die das Gewünschte liefert, auch weil ich bis jetzt in meinem Leben nur zwei Apps mit je einer einzigen Klasse geschrieben habe. Vielleicht kann mir aber der eine Profi eine oder mehrere der folgenden Fragen beantworten, die auch nicht in meinem Lehrbuch behandelt werden. Danke für jeden Tipp, insbesondere auch Hinweise, wo und wie ich mich zu diesen Themen schlau machen kann ...
1) Vermute ich richtig, dass die beste Form für meine Idee ein Service wäre, der unsichtbar permanent im Hintergrund läuft? Wenn ja: Ich habe noch nie einen Service geschrieben, gibts irgend wo eine einfachere Anleitung/ein Beispiel?
2) Kann meine App die Aktionen "Mobile Daten ein" bzw. "Mobile Daten aus" abfangen, so dass meine App entsprechend mit der Notification reagieren kann, oder muss meine App selber z.B. jede Sekunden testen, ob "Mobile Daten" ein- oder ausgeschaltet ist?
3) Um jede Sekunde einen Code auszuführen, habe ich im Internet folgende Lösung gefunden. Aufruf der Klasse "Test" in der MainActivity OnCreate-Methode mittels
Und hier die Klasse "Test" (erzeugt alle Sekunden einen Pieps):
public class Test extends TimerTask {
public Test() {
Timer timer = new Timer();
timer.scheduleAtFixedRate(this, 0, 1000);
}
public void run(){
ToneGenerator toneGen1 = new ToneGenerator(AudioManager.STREAM_MUSIC, 100);
toneGen1.startTone(ToneGenerator.TONE_CDMA_PIP,150);
}
public static void main(String[] args) {
new Test();
}
}
Alles anzeigen
Das funktioniert, führt aber nach ca. 20 Repetitionen zu einem Absturz. Warum? Speicherproblem? Aus dem Logcat werde ich nicht klug:
11-12 16:31:12.910 6308-6376/my.apps1.tfvrb W/AudioTrack: AUDIO_OUTPUT_FLAG_FAST denied by server; frameCount 1920 -> 1920
11-12 16:31:12.911 6308-6376/my.apps1.tfvrb I/AudioTrack: FastTrack denied resize maxNoti fc 960, new 960, enable throttle
11-12 16:31:12.911 6308-6376/my.apps1.tfvrb D/AudioTrack: Client defaulted notificationFrames to 960 for frameCount 1920
11-12 16:31:13.050 6308-7223/my.apps1.tfvrb D/AudioTrack: stop() called with 7680 frames delivered
11-12 16:31:13.910 6308-6376/my.apps1.tfvrb E/AudioTrack: AudioFlinger could not create track, status: -12
11-12 16:31:13.913 6308-6376/my.apps1.tfvrb E/ToneGenerator: AudioTrack(0x7cf2cb8c00) set failed with error -12
ToneGenerator init failed
11-12 16:31:13.917 6308-6376/my.apps1.tfvrb E/AndroidRuntime: FATAL EXCEPTION: Timer-0
Process: my.apps1.tfvrb, PID: 6308
java.lang.RuntimeException: Init failed
at android.media.ToneGenerator.native_setup(Native Method)
at android.media.ToneGenerator.<init>(ToneGenerator.java:863)
at my.apps1.tfvrb.Test.run(Test.java:74)
at java.util.TimerThread.mainLoop(Timer.java:555)
at java.util.TimerThread.run(Timer.java:505)
Alles anzeigen
4) Der folgende Code für das Erzeugen/Löschen der Notification funktioniert, wenn ich ihn in der MainActivity in der onCreate-Methode schreibe. Wenn ich diesen Code aber in die obige Klasse "Test" anstelle des Pieps von Zeile 9/10 schreibe, erhalte ich Fehler:
Zeile 1: getApplicationContext() cannot resolve method
Zeile 3 und 19: getSystemService(this.NOTIFICATION_SERVICE) cannot resolve method
Zeile 10: MainActivity.this not an enclosing class
Auch da weiss ich leider nicht, wie ich das abändern muss, damit der Code in der Klasse "Test" anstelle des Pieps läuft.
if (Settings.Global.getInt(getApplicationContext().getContentResolver(), "mobile_data", 0) == 1) {
NotificationManager notificationManager = (NotificationManager) getSystemService(this.NOTIFICATION_SERVICE);
String channelId = "mobile_datenverbindung";
CharSequence channelName = "Mobile Datenverbindung";
int importance = NotificationManager.IMPORTANCE_LOW;
NotificationChannel notificationChannel = new NotificationChannel(channelId, channelName, importance);
notificationManager.createNotificationChannel(notificationChannel);
int notifyId = 1;
Notification notification = new Notification.Builder(MainActivity.this)
.setContentTitle("ACHTUNG! Mobile Datenverbindung ist an!")
.setSmallIcon(R.drawable.tfvrbklein)
.setChannelId(channelId)
.build();
notificationManager.notify(notifyId, notification);
} else {
NotificationManager notificationManager = (NotificationManager) getSystemService(this.NOTIFICATION_SERVICE);
String channelId = "mobile_datenverbindung";
NotificationChannel notificationChannel = notificationManager.getNotificationChannel(channelId);
notificationManager.deleteNotificationChannel(channelId);
}
Alles anzeigen
Danke an alle, die sich bis hierher durchgekämpft haben!