AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Cross-Platform-Entwicklung Android AlarmManager periodisch einen Event bekommen

Android AlarmManager periodisch einen Event bekommen

Ein Thema von Kostas · begonnen am 23. Jul 2018 · letzter Beitrag vom 2. Aug 2018
Antwort Antwort
knaeuel

Registriert seit: 2. Jul 2007
110 Beiträge
 
Delphi 10.3 Rio
 
#1

AW: Android AlarmManager periodisch einen Event bekommen

  Alt 27. Jul 2018, 13:03
Mit dem Tipp (russische Anleitung "Erstellen einer Java-BroadcastReceiver-Klasse für Delphi") habe ich leider leichte Probleme. Ich habe die dort abgedruckte batch-Datei fast in jeder zeile angepasst, damit es lauffähig ist.

Probleme habe ich nun bei Schritt 3 in der Batch-Datei:
Code:
REM @echo off
 
setlocal
 
REM Pfad zum Android SDK
if x%ANDROID% == x set ANDROID=C:\Users\Public\Documents\Embarcadero\Studio\19.0\CatalogRepository\AndroidSDK-2433_19.0.29899.2631

REM Pfad zum Java-Compiler
set JAVAC_DIR="C:\Program Files\Java\jdk1.8.0_60\bin"

REM Pfad zur Android-Plattform
set ANDROID_PLATFORM=%ANDROID%\platforms\android-22

set DX_LIB=%ANDROID%\build-tools\22.0.1\lib

set EMBO_DEX="C:\Program Files (x86)\Embarcadero\Studio\19.0\lib\android\debug\classes.dex"

set PROJ_DIR=%CD%

echo ==========================================================================================
echo.
echo  1. Compiling the Java service activity source files
echo.
mkdir output 2> nul
mkdir output\classes 2> nul
%JAVAC_DIR%\javac -verbose -Xlint:deprecation -cp %ANDROID_PLATFORM%\android.jar -d "output\classes" "src\com\MNCClasses\AlarmReceiver.java"
 
echo ==========================================================================================
echo.
echo  2. Creating jar containing the new classes
echo.
mkdir output\jar 2> nul
%JAVAC_DIR%\jar cvf %PROJ_DIR%\output\jar\MNCClasses_classes.jar -C output\classes com\MNCClasses\AlarmReceiver.class
 
echo ==========================================================================================
echo.
echo  3. Converting from jar to dex...
echo.
mkdir output\dex 2> nul
java -jar %DX_LIB%\dx.jar --dex --verbose --output=output\dex\MNCClasses_classes.dex --positions=lines output\jar\MNCClasses_classes.jar
REM erzeugt Fehler: com.android.dx.cf.iface.ParseException: bad class file magic (cafebabe) or version (0034.0000)
 
echo ==========================================================================================
echo.
echo Merging dex files
echo.com.android.dx.merge.DexMerger
java -cp %DX_LIB%\dx.jar com.android.dx.merge.DexMerger %PROJ_DIR%\output\dex\classes.dex %PROJ_DIR%\output\dex\MNCClasses_classes.dex %EMBO_DEX%
 
echo Tidying up
echo.
rmdir /s /q output\classes
del output\dex\test_classes.dex
rmdir /s /q output\jar
 
echo ==========================================================================================
echo Now we have the end result, which is output\dex\classes.dex
 
:Exit
 
endlocal
pause
die aktuelle Zeile (unter Schritt 3)
Code:
java -jar %DX_LIB%\dx.jar --dex --verbose --output=output\dex\MNCClasses_classes.dex --positions=lines output\jar\MNCClasses_classes.jar
lautete ursprünglich so:
Code:
call %DX_LIB%\dx.jar --dex --verbose --output=output\dex\MNCClasses_classes.dex output\jar\MNCClasses_classes.jar
mit call kann das doch nicht funzen, oder? damit führt man doch batch-Dateien oder exe oder vergleichbares von Windows aus. Oder gibt es in Java eine call.exe? wenn ja, dann nicht in meiner installation. Egal. Ich vermute, dass der Aufruf mit "java -jar ..." korrekt ist.

Nichtsdestotrotz erzeugt dieser Aufruf immer nur eine Fehlermeldung, die auch schon oben in der Batch-Datei angerissen ist. Die vollständige Meldung lautet:
Code:
processing archive output\jar\MNCClasses_classes.jar...
ignored resource META-INF/MANIFEST.MF
processing com/MNCClasses/AlarmReceiver.class...

UNEXPECTED TOP-LEVEL EXCEPTION:
com.android.dx.cf.iface.ParseException: bad class file magic (cafebabe) or version (0034.0000)
        at com.android.dx.cf.direct.DirectClassFile.parse0(DirectClassFile.java:472)
        at com.android.dx.cf.direct.DirectClassFile.parse(DirectClassFile.java:406)
        at com.android.dx.cf.direct.DirectClassFile.parseToInterfacesIfNecessary(DirectClassFile.java:388)
        at com.android.dx.cf.direct.DirectClassFile.getMagic(DirectClassFile.java:251)
        at com.android.dx.command.dexer.Main.processClass(Main.java:704)
        at com.android.dx.command.dexer.Main.processFileBytes(Main.java:673)
        at com.android.dx.command.dexer.Main.access$300(Main.java:83)
        at com.android.dx.command.dexer.Main$1.processFileBytes(Main.java:602)
        at com.android.dx.cf.direct.ClassPathOpener.processArchive(ClassPathOpener.java:284)
        at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:166)
        at com.android.dx.cf.direct.ClassPathOpener.process(ClassPathOpener.java:144)
        at com.android.dx.command.dexer.Main.processOne(Main.java:632)
        at com.android.dx.command.dexer.Main.processAllFiles(Main.java:510)
        at com.android.dx.command.dexer.Main.runMonoDex(Main.java:280)
        at com.android.dx.command.dexer.Main.run(Main.java:246)
        at com.android.dx.command.dexer.Main.main(Main.java:215)
        at com.android.dx.command.Main.main(Main.java:106)
...while parsing com/MNCClasses/AlarmReceiver.class

1 error; aborting
Google hat mich bereits darauf gebracht, dass dies in irgendeiner Form ein Versionskonflikt im Java oder mit Android Versionen sein kann. Aber das hilft mir im Moment wenig. Hat irgendein Java-Profi eine Ahnung, was ich tun kann?

Aktuell scheint Delphi die Android-Platform in der Version 22 zu nutzen und das SDK in Version 2433_19.0.29899.2631, sofern das nicht eine von Delphi erzeugte Nummer ist. Das Java Development Kit trägt die Versionnummer 1.8.0_60

Falls jemand helfen kann und noch weitere Infos erforderlich sind, bitte einfach fragen!
Wolfgang
  Mit Zitat antworten Zitat
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.117 Beiträge
 
Delphi 12 Athens
 
#2

AW: Android AlarmManager periodisch einen Event bekommen

  Alt 27. Jul 2018, 14:51
Hi,

brauchst du alles nicht.
In der Demo siehst du unsere Lösung.

-Die App hat zwei aufgaben:
a) nach dem Beenden soll sie sich selbst neu starten.
b) erzeuge alle 10 Sekunden einen Event über den AlarmManager.

Gruß Kostas
Angehängte Dateien
Dateityp: zip SelfStarter.zip (3,3 KB, 78x aufgerufen)
  Mit Zitat antworten Zitat
knaeuel

Registriert seit: 2. Jul 2007
110 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: Android AlarmManager periodisch einen Event bekommen

  Alt 2. Aug 2018, 09:01
heißen Dank! ich schaus mir direkt mal an

edit: habs mir gerade angesehen. Ich hab ein neues Projet erstellt und die miterzeugte Haupt-Unit einfach durch dein Main.pas/Main.fmx ersetzt.

Ein paar Dinge sind mir aber noch unklar. Wie ist das geplante Verhalten der App?

Beispiele:

Ich starte die App, nehme beide Häkchen aus den Checkboxes weg. Dann warte ich den letzten noch geplanten Alarm ab. Jetzt klicke ich auf Alarm. Nach 10 Sekunden taucht der Alarm im Log auf.

Jetzt klicke ich wieder auf Alarm und minimiere die App. Nach 10 Sekunden tut sich erstmal nichts. Bringe ich die App wieder in den Vordergrund, sehe ich im Log, dass die App das Event empfangen hat. Allerdings wurde sie nicht in den Vordergrund gebracht.
Frage 1: Sollte das so sein?

Jetzt klicke ich wieder auf Alarm und beende die App diesmal. Nach 10 Sekunden tut sich nichts. Starte ich die App wieder, sehe ich nur die mitgeloggten Ereignisse (willTerminate fürs beenden und FinishedLaunching für das manuelle neustarten).
Frage 2: Sollte die App vom System gestartet werden, sobald der Alarm ausgelöst wird oder nicht?

In jedem Fall soll die App nach 30 Sekunden neu starten und das klappt bei mir auch nicht.


Ich schaue gerade, ob es an Berechtigungen (Projektoptionen Delhpi) liegen könnte.
Welche Berechtigungen werden benötigt?

"Alarm festlegen" - war bisher aus und trotzdem hat es ja zumindest teilweise funktioniert. ich schalts an.
"Kalender lesen"/"Kalender schreiben" - sind standardmäßig an. ich lasse es an. (ka, obs was damit zu tun hat)
"Sticky Intents als Broadcast senden" - ist standardmäßig aus. Ich schalte es mal ein.
"Tastensperre deaktivieren" - Standard aus, ich schalts ein.
"Wakelock" - standard aus, ich schalts ein.
Frage 3: Hast du noch irgendwelche anderen Dinge eingestellt oder Berechtigungen gesetzt oder sonst irgendwas?

Vielen Dank nochmal!
Wolfgang

Geändert von knaeuel ( 2. Aug 2018 um 13:15 Uhr)
  Mit Zitat antworten Zitat
knaeuel

Registriert seit: 2. Jul 2007
110 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: Android AlarmManager periodisch einen Event bekommen

  Alt 2. Aug 2018, 13:41
kleiner Nachtrag: soeben habe ich festgestellt, dass die App doch neu startet - aber erst nach 3 Minuten und nicht nach 30 Sekunden. Und siehe da, der Aufruf lautet ja auch "AppRestartIncSecondes(180);", wobei dann natürlich nicht der Defaultwert von 30 Sekunden genutzt wird
Wolfgang
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:36 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz