resizable Widget

  • Antworten:37
Danie
  • Forum-Beiträge: 42

27.07.2016, 22:35:38 via Website

Hallo,

ich würde gern ein resizable Widget erstellen. Das Widget selbst habe ich hinbekommen - es wird auch unter den Widgets gelistet.
Allerdings habe ich so meine Schwierigkeiten mit dem Layout!

Vom Style würde ich es gerne wie das android Interne Power Widget haben.
Ich meine das Widget, wo man WLAN/Bluetooth usw. ein und ausschalten kann. Der Zustand wird dann angezeigt, indem unten ein Feld blau- und das Icon weiß aufgefüllt wird.

Meine Frage ist nun: Wie ist das realisiert? Mit Bildern oder gibt es hierfür schon etwas fertiges? Ich müsste Bilder einfügen, da ich eigene Icons habe!

Vermutlich ist es mal wieder einfacher, aber ich wills wieder zu kompliziert machen :/

Danke!
Gruß Danie

Antworten
swa00
  • Forum-Beiträge: 3.704

27.07.2016, 22:51:26 via Website

Hallo Danie,

a) du hast in deinem Layout ja ein Imageview oder ein Imagebutton.

b) dann nimmst du dir ein Handle darauf
z.b. ImageView myIView = (ImageView) findViewById(R.id.myIViewimLayout);

c) dann hast du dir unter /res/drawable images hinterlegt ( z.b. myimage_ein.png / myimage_aus.png)

und wenn du beides gemacht hast , kannst du z.B. das Image setzen mit

if (a == foo)
myIView.setImageRescource(R.drawable.myimage_ein);
else
myIView.setImageRescource(R.drawable.myimage_aus);

— geändert am 27.07.2016, 22:56:16

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
Danie
  • Forum-Beiträge: 42

28.07.2016, 00:23:21 via Website

Hallo,

habe es eben - leider ohne Erfolg - so getestet:

  1. In "/res/drawable" hab ich "toggle_selector.xml" erstellt:

    <?xml version="1.0" encoding="utf-8"?> 
    <selector xmlns:android="h ttps://schemas.android.com/apk/res/android">
         <item android:drawable="@drawable/toggle_on" android:state_checked="true"/>
         <item android:drawable="@drawable/toggle_off" android:state_checked="false"/>
    </selector>
    
  2. den Selector als Background an den ToggleButton binden:

     <ToggleButton
        android:id="@+id/ToggleButton1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/toggle_selector"
        android:textOff=""
        android:textOn="" />
    

Leider funktioniert das so garnicht. Er sagt mir nur "error loading widget".

System-Info:
Odroid C1+ running Android 4.2.2 (API Level 17)

Kann es sein, dass ToggleButtons für Widgets generell nicht unterstützt werden?
Selbst wenn ich nur den Toggle Button im Layout einfüge - also "as it is" - bekomme ich den Fehler!
Lösch ich den Button komplett raus, passt wieder alles...

Ist der Ansatz falsch oder kann das so klappen?

Wie sieht das eigenlich mit der Größe/Auflösung der .png´s aus? (Aktuell 80x80px, 32bit color depth)

Gruß Daniel

— geändert am 28.07.2016, 00:25:55

Antworten
swa00
  • Forum-Beiträge: 3.704

28.07.2016, 06:06:36 via Website

Hallo Daniel,

nimm doch einfach mal einen ganz normalen Imagebutton und toggle selbst .

Image : die Größe der Images kannst du frei wählen , sollen halt nicht zu exorbitant sein.

Siehe Beispiel.

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
Danie
  • Forum-Beiträge: 42

28.07.2016, 19:18:21 via Website

Hallo,

werde ich mal veruchen!
Nochwas: Der Button soll nur beim druck eines anderen Buttons im Widget wieder "realesed" werden. War der Button vorher schon gedrückt, soll erneutes drücken den state nicht auf Off setzen...
Ich möchte damit später ein Relais (über arduino) ansteuern, dass die Eingangsquelle des Verstärkers wechselt.

Wie macht man das am dümmsten? Auch mit Selector?

Noch eine Frage: Seekbars kann ich innerhalb des Widgets auch vergessen...gibt es da eine andere Lösung für?

Gruß Daniel

Antworten
swa00
  • Forum-Beiträge: 3.704

28.07.2016, 20:47:33 via Website

Auch mit Buttons...

Reagiere auf den Klick , ändere jeweils die IMages..

Das was du machen willst ist ein "FlipFlop" .....

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
Danie
  • Forum-Beiträge: 42

28.07.2016, 21:42:45 via Website

Hallo,

ich möchte vorerst mal das layout machen. Leider bekomme ich den Farbton vom Power Widget nicht nachgeblidet!
Was hat das für einen Farbcode? Dieses grau möchte ich haben, weil es einfach zum Rest des OS passt.

Ist das Power Widget mit Bilder gemacht oder kann man das auf dem Sytsem nachbilden?

Mein Plan wäre jetzt:
1. Background erstellen und in LinearLayout einfügen
2. Wenn Button getoggelt -> Bild_on anzeigen ... bei Button off -> Background anzeigen?

Mir fehlt irgendwie ein sinnvoller Ansatz!

Gruß Daniel

Antworten
swa00
  • Forum-Beiträge: 3.704

28.07.2016, 21:56:31 via Website

Daniel,

ich würde dir erst einmal empfehlen, mit einer Standard App mit den Grundlagen der Android-Programmierung
zu experementieren, bevor du mit einem Widget beginnst.

In dieser App setzt du dir erst mal zwei Buttons und arbeitest dich in die Funktionsweise von Layout, Farben und
Reagieren auf Clicks ein ..

Erst dann kannst du dich an Widgets trauen.

Farbcode : mach einen screenshot , füge es in ein Grafikprogramm ein und ermittel dann den HEX Code deiner Wunschfarbe.

— geändert am 29.07.2016, 00:44:13

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
Danie
  • Forum-Beiträge: 42

28.07.2016, 23:54:31 via Website

Hallo,

leider hast du recht - ich dachte ich komm mit meinen - vorwiegend im µC und C++ Bereich - gesammleten Erfahrungen schnell in Java voran. Leider ist dem doch nicht so :/

Da ich sehr gerne mit Büchern lerne: Könnt ihr mir hier ein Buch empfehlen?
Ich möchte sowohl java als auch Android lernen. Gibt es da ein "Standard" Werk schlechthin?
Oder erst Java lernen, dann mit Android starten?

Mit Java habe ich wie gesagt keine Erfahrungen. Ganz ohne Vorkenntnisse gehe ich aber auch nicht in den "Kampf". Zahlensysteme, C++ Basics (vorwiegend Atmel µC / Arduino) besitze ich.

Vielen Dank!
Gruß Daniel

Antworten
swa00
  • Forum-Beiträge: 3.704

29.07.2016, 00:27:14 via Website

Hallo Daniel ,

ich komme auch aus der C++ Ecke und mache das seit über 20 Jahren hauptberuflich und in Selbständigkeit.

Ich denke schon , dass du die notwendige Basis hast - du musst halt bei Java nicht besonders umdenken.

Einige Sonderheiten hat aber Android /resp Java schon und ich sitze manchmal heute noch hier und verzweifle,
weil ich halt überwiegend in C++ programmiere und in einigen Sachen komplett umdenken muss.

Globale statische Variablen sind z.b. bei Android nicht gerne gesehen , im Gegensatz zu reinem C.
Der Aufbau der GUI ist auch gewöhnungsbedürftig und vor allem muss man sich vorher mit der Eigenart des Betriebssystems auseinander setzen und verstehen , was im Hintergrund passiert. (z.b LifeCycle)
Die bei C/C++ gerne eingesetzten Getter und Setter sollten wiederum bei Android aus PerformanceGründen nicht
eingesetzt werden usw usw.

Gehst du da wie ein normales C Program ran , wirst du im Punkto Instabilität leider ein wahres Wunder erleben.

Aber du brauchst halt Zeit , wie bei jeder neuen Plattform auch.

Habe mal was für dich gegoogelt , sieht auf den ersten Blick recht fundiert aus
http://www.programmierenlernenhq.de/android-app-programmieren-tutorial/

— geändert am 29.07.2016, 00:38:19

Liebe Grüße - Stefan
[ App - Entwicklung ]

Gelöschter Account

Antworten
Danie
  • Forum-Beiträge: 42

29.07.2016, 19:39:29 via Website

Hallo,

gibt es auch eine Anleitung mit Eclipse oder ist das im Grund sowieso "identisch"?

Ich hatte heute das Glück von meinem Kollegen (Fachinformatiker Ausbilder) einige Scripte zum Thema Java-Programmierung zu bekommen :)
Ist mehr eine Art Lernkurs, wie ich es auch schon in den Elektro Berufen genießen drufte! Damit bin ich zumindest immer gut zurecht gekommen.
Mal sehen was mir das so bringt!

Gruß Daniel

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

29.07.2016, 19:45:53 via Website

Im Gunde gleich aber ich rate dir installiere direkt AndroidStudio.
Da hast du keinerlei Probleme im gegensatz zu eclipse. Auserdem ist unklar wielange Google Eclipse noch unterstützt. Noch ein vorteil ost Gradle mit welchem du externe Lib einfach einbinden und Updaten kannst.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Danie
  • Forum-Beiträge: 42

30.07.2016, 12:16:35 via Website

Hallo,

der Grund warum ich zu Eclipse bin ist eigentlich nur der, dass ich für die Odroid C2 Platform ein Eclipseprojekt gefunden habe, dass das Ansteuern der GPIO Pins extrem vereinfacht. Wenn sich diese Lib auch mit Android Studio verwendet lässt, hätte ich auch kein Problem mit Android Studio!

Programmieren muss ich ohnehin bei beiden IDE´s können...daher lern ich erstmal und sehe dann, welche IDE am besten zu mir passt.

Gruß Daniel

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

30.07.2016, 12:18:08 via App

AndroidStudio kann auch eclipse einbinden. Das ist kein Problem.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Danie
  • Forum-Beiträge: 42

01.08.2016, 22:39:40 via Website

Hallo,

so ich mache Vortschritte :)

Jetzt steh ich aber vor einem anderen Problem.
Wie fange ich an?

Und zwar:
Ich muss einige Sachen dauerhaft abfragen (Polling). Unter anderem einen Schlüsselschalter, der den "KeylockManager" abschalten soll, wenn der Schlüssel "eingesteckt" ist!

Außerdem soll noch eine App kreiert werden, die ein paar Einstellungen ermöglicht...
Jetzt ist das Problem, dass die App auch beendet werden könnte -> Wie stelle ich das an?
Gleiches gilt für die Widgets. Die werden innerhalb der App erzeugt und abgefragt. Was passiert nun, wenn die App beendet wird?
Es soll alles weiterhin funktionieren. Die App wird nur zum Einstellen einiger Parameter benötigt...

Wie kann man sowas realiseren?

Gruß Daniel

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

01.08.2016, 22:53:08 via Website

In das Package kannst du ja noch eine Application(Activity) einfügen, welche für die Einstellungen gut ist, das geht alles in einem Projekt und ist auch das einfachste.
Wenn alles weiterhin abgefragt sein soll auch wenn App zu oder widget nicht aktualisiert (da nciht angezeigt), dafür nimst du am besten einen BackgroundServcie der dir die Daten in einem bestimmten Intervall abfragt und dann bereitstellt oder gleich verarbeitet.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Danie
  • Forum-Beiträge: 42

01.08.2016, 23:00:09 via Website

Wie jetzt? :D

Also: Ich habe eine App die für Einstellungen gut ist. In dieser erzeuge ich dann den BackgroundService. Dieser läuft auch weiter, wenn die eigentliche App zu ist?
Kann ich dann auch auf Libs, die innerhalb der App sind weiterhin nutzen? In meinem Fall wäre das ein Interrupt.
Das Widget wird auch angezeigt, wenn die App zu ist? Auch hier sollen Änderungen möglich sein, wenn die App beendet wurde!

Zu den Intervallen:
Welcher Intervall ist hier sinnvoll? Wenn ich einen Schalter abfrage, müsste ich schon minmum alle 100ms abfragen! Das kommt doch fast einem dauerhaft laufendem Prozess gleich? Dies sollte man ja strickt vermeiden!?

Hab es leider noch nicht ganz begriffen! :(

— geändert am 01.08.2016, 23:00:51

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

02.08.2016, 00:00:05 via App

Also Background Service läuft auch wenn die App zu ist ( wenn alles ruchtig eingestellt!)
Pollen ist so eine sache. 100ms würde gehen ist aber nicht ganz nach dem Konzept und belastet den Akku stark.
Eigentlich brauchst du ein externes Gerät dass dir eine Zustandsänderung per Push o.ä. zukommen lässt..
Ansonsten abfragen und verarbeiten und ja Lubs sind auch verfügbar ist ja nicht so als würden die nur für Activities funktionieren

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Danie
  • Forum-Beiträge: 42

02.08.2016, 09:45:11 via Website

Hallo,

wäre es hier sinnvoll, evtl. einen Arduino mit der Auswertung des Schalters und der anderen Aufgaben zu nutzen?
Die Frage ist: Wie bekomme ich das dann zum Android Gerät übertragen? Ich habe ein Serielle Schnittstelle und natürlich USB.
So muss Android doch auch permanent die serielle Schnittstellle / USB überwachen?
Oder gibt es dafür eine Art Interrupt auf den man reagieren kann?

Was meinst du mit Lubs? Loops, also Schleifen? :D

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

02.08.2016, 10:30:52 via App

Lubs=Libs; einfacher Tippfehler ;)
Eigentlich brauchst du ein Gerät dass dir den Schalter überwacht und eine Push (fcm o.ä.) schickt. Da das schlecht geht kannst du es ja per Bluetooth machen bei permanenter Verbindung hast du ja auch eine art push.

— geändert am 02.08.2016, 10:31:18

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
swa00
  • Forum-Beiträge: 3.704

02.08.2016, 10:42:45 via Website

Nur so ein Gedankengang :
(Selbst schon mehrfach realisiert (Raspberry)

a) TCP-Socket-Server (c++) auf den Arduino & ggf. WLAN Accesspoint (Edimax)
b) TCP Client inside App

Dann könntest du Pushen und Pollen nach herzenslust

— geändert am 02.08.2016, 11:04:02

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

02.08.2016, 10:49:39 via Website

Das stimmt, nur geht eine dauerhafte TCP Verbindung auch auf den Akku, abe das lässt sich in diesem Fall wahrscheinlich sowieso nicht vermeiden.

— geändert am 02.08.2016, 10:49:47

LG Pascal //It's not a bug, it's a feature. :) ;)

Danie

Antworten
swa00
  • Forum-Beiträge: 3.704

02.08.2016, 10:53:18 via Website

Sehe ich auch so.
Sein Stromverbrauch hängt von dem ab , was er wirklich tut.

Er könnte in der Richtung Ardunio -> App natürlich auch noch einen TCP-Server auf App seite implementieren (anderer Port)
Das simple "listen" auf dem Socket wäre stromsparender.

— geändert am 02.08.2016, 10:58:06

Liebe Grüße - Stefan
[ App - Entwicklung ]

Danie

Antworten
Danie
  • Forum-Beiträge: 42

02.08.2016, 20:03:12 via Website

Hallo,

mal grob zu den Vorgaben:
Ich habe einen Odroid C2. Auf dem Läuft Android 5.1.1.

Der Odroid ist sowas wie der Raspberry Pi nur leistungsfähiger und für Android geeignet.
Ich möchte eine Art Bedienterminal realiseren. Die Bedienung erfolgt mittels App und den Widgets.

Der Schlüsselschalter soll dazu dienen, die Locksperre an und abzuschalten (um unbefugte fernzuhalten).
Eingabe des Musters oder des Codes soll weiterhin funktionieren.

Außerdem wird evtl. noch ein paar Taster an den GPIO Pin gehängt, die dann bestimmt Funktionen ausführen sollen.
Zusätzlich werden noch Befehle über RS232 empfangen.
Ich brauche also einen Service, der sowohl GPIO´s als auch die UART überwacht.

Das mit dem TCP Server scheint mir zu kompliziert - ich habe doch GPIO´s...kann I²C und UART nutzen.
Es muss doch möglich sein, die Signale vom Arduino in den Odroid zu bekommen bzw. einfach nur den Odroid zu verwenden?

Eine Abfrage über einen Service, der vom Alarmmanager sagen wir alle 10ms ausgeführt wird geht nicht?
Wird das System dann instabil/langsam oder steigt "nur" der Stromverbrauch?
Was passiert mit dem Service, wenn der Lockscreen aktiv wird?
Stromsparen ist jetzt erstmal zweitranig, da das Teil an einer Autobatterie (+ irgendwann Solarzelle) hängen wird!

Gruß Daniel

— geändert am 02.08.2016, 20:21:49

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

02.08.2016, 20:21:34 via Website

Das geht per:
Seriell,
Bluetooth,
Usb( Seriell)
Du musst den Adruino halt irgendwie mit dem Handy verbinden können.

LG Pascal //It's not a bug, it's a feature. :) ;)

Danie

Antworten
swa00
  • Forum-Beiträge: 3.704

02.08.2016, 20:36:05 via Website

Hallo Daniel,

nun , nimms mir nicht übel , aber so langsam verstehe ich es nicht mehr :-)

Du hast z.b einen Ardunio mit dem du alle Überwachungen , Messungen usw durchführst.
Mach da ein Standard abgespecktes Linux drauf - Images gibt es genug.

Dann weis ich ja nicht wie deine Umgebung ist, ich schätze mal , dein Ardunio ist irgendwie im Netz.
(Völlig schnuppe ob per WLAN oder LAN - vergib feste IP's auf allen Devices)

Eingangs hast du erklärt , du bist des C/C++ mächtig - ergo kannst du GPIO/RS232 und was auch immer auf
dem Ding abfragen, setzen , ändern und wenn es nur die Überwachung der Klospülung ist.
(Das Netz von voll von C/C++ Beipielen)

Wäre das mal geschafft, baust du dir auch da rein eine TCP - Client und ServerKlasse auch in C/C++.
(Das Netz ist voll von C/C++ Beispielen)

Was soll denn daran aufwendig sein , dann deine Smartphone App via Netz mit dem Ardunio kommunizieren zu lassen ??

Wenn es hochkommt ist der Ardunio/Raspberry innerhalb einer halben stunde incl der gesamten Complier-Binaries aufgesetzt.
C/C++ source drauf , make ausführen und schon wackelt das Ding

Nimms mir auch nicht übel : aber es erweckt den Eindruck , dass Du "hinten" anfängst.
Eines ist fakt : du wirst an der Einarbeitung mit ANdroid-Programmierung NICHT vorbeikommen.
(Siehe original-thema diese Threads)
Dass du dir jetzt schon Gedanken um den Service / resp LiveCycle auf dem Smartphone machst - ist
absolut verfrüht ...
Diese Fragen/Antworten ergeben sich von selbst , wenn es soweit ist.

Bring das Ganze erst mal in Laborversion zum Laufen. Erst dann kannst du dran schrauben.

— geändert am 02.08.2016, 21:09:43

Liebe Grüße - Stefan
[ App - Entwicklung ]

DaniePascal P.

Antworten
Danie
  • Forum-Beiträge: 42

02.08.2016, 20:43:48 via Website

Hallo,

zugegeben, sehr verwirrend das ganze!

ich versuche, es rein auf dem Odroid mit dem Android OS laufen zu lassen. Dieser hat ja schon GPIO´s ect...daher wäre der Arduino hier total überflüssig.
Nur muss ich es eben hinbekommen, die GPIO´s dauerhaft und unabhängig von der App zu überwachen.
Daher die Frage mit dem Service...

Antworten
swa00
  • Forum-Beiträge: 3.704

02.08.2016, 20:53:52 via Website

Der Odroid mit Android ist ein Exot - deshalb hast du auch jetzt die Probleme.

Für dauerhafte Überwachungen/Messungen ist das allerbeste immer ein nacktes Linux System OHNE GUI
dass mit maximal 70-100 mA vor sich hindöst, bis was passiert.

Android hat nun mal die Eigenschaft , alles das abzuschiessen , was nicht benötigt wird .
Es ist ein GUI orientiertes DAU-Betriebsystem und nicht für Messtechnik gedacht.
Man kann hier und da ein paar Klammergriffe machen und in die Trickkiste greiffen - aber für dein Vorhaben der dauerhaften Überwachung (besonders im 10 ms Poll bereich) ist das System eindeutig falsch.

Android selbst greifft von sich aus selbst in seine Trickkiste, um dich an polling-Verfahren zu hindern und nun möchtest du hingehen und genau dieses "Feature" wieder umgehen ??
Du bist definitv auf dem falschen Dampfer - versuche nicht krampfhaft etwas zu basteln , was nicht richtig funktionieren wird .

P.S. Ein paar Klicks auf den "Danke" Button bei Pascal , wären angebracht .. der kniet sich nämlich auch sehr tief in dein Problem rein ... - Bringt dich bestimmt nicht um :-)

— geändert am 03.08.2016, 07:58:56

Liebe Grüße - Stefan
[ App - Entwicklung ]

DaniePascal P.

Antworten
Danie
  • Forum-Beiträge: 42

03.08.2016, 08:01:13 via Website

Guten Morgen zusammen!

Ich möchte aus einem Grund Android verwenden: Das GUI :D.
Es ist evtl. auch etwas falsch rübergekommen. Ich möchte keinesfalls Messaufgaben damit realisieren!
Lediglich Buttons, die von mir aus mit 100-500ms verzögert eine Aktion ausführen (Toast / eine App starten).

Am besten wäre es natürlich Interrupt gesteuert.
Nur hab ich hier keinerlei Erfahrung. Ich müsste den Service immer nur starten, wenn ein Taster gedrück wurde. Dann führ ich den Service aus, der sich am Ende selbst killt und auf den nächsten Interrupt wartet.
Wie ich das auf anderen Systemen realisiere, ist nicht das Problem nur meine fehlende Android Erfahrung steht mir hier eben gewaltig im Weg.

Parallel bin ich natürlich dabei, einige Anfänger Tutorials durch zu arbeiten.

Gruß Daniel

Antworten
swa00
  • Forum-Beiträge: 3.704

03.08.2016, 08:17:55 via Website

Moin Daniel,

dann machen wir jetzt mal ein Reset. Die ganze Zeit kam hier an , dass du Messaufgaben durchführen müsstest.
Oben schreibst du nämlich , dass du im 10 ms Verfahren einen Alarmtrigger starten möchtest

Eine Abfrage über einen Service, der vom Alarmmanager sagen wir alle 10ms ausgeführt wird geht nicht?

Ergo hast du uns schon hier aufs Glatteis geführt.

Es wäre jetzt erst einmal angebracht , dass du genau erklärst , was du denn , nachdem du einen Button gedrückt hast, passieren soll. Bitte Schritt für Schritt - nicht das , was irgendwann mal sein soll

Willst du GPIOS abfragen ? willst du eine Loop laufen lassen und eine Zeitlang werte auslesen ?
Was willst du GENAU machen ???

Ich bin mir nämlich nicht sicher , ob du einen Service benötigst

— geändert am 03.08.2016, 08:23:48

Liebe Grüße - Stefan
[ App - Entwicklung ]

Danie

Antworten
Danie
  • Forum-Beiträge: 42

03.08.2016, 08:32:52 via Website

Moin,

durch halbwissen, einige google Suchen hab ich das mit dem BackgroundService gefunden.
Entschuldigung dafür!

Also nochmal an den Anfang!
Mein Plan ist im Grunde:
Schlüsselschalter hängt an einem GPIO-Pin. Dieser Schalter soll - abhängig vom Zustand - den KeyguardManager ein- und auschalten. Damit bei eingestecktem Schlüssel kein Lockscreen bzw. am besten nur der "Slide" Lockscreen erscheint.

Außerdem muss ich mit einem GPIO ein Mosfet steuern, dass meinen Touchscreen stromlos schaltet, da das Backlight sonst die ganze Zeit anbleiben würde. Dimmen wäre natürlich auch nicht verkehrt (Monitor lässt sich über RS232 Befehle steuern)
Das ist im Grunde erstmal alles. Wenn das funktioniert, kommen evtl. noch Sachen dazu.
Aber vorerst will ich mal das Grundsystem stehen haben.
Dazu zählen für mich der Monitor (optimal mit Dimmen des Backlights) und das Ein- bzw. Abschalten des Keyguard Managers.

Auf das mit dem Service bin ich eigentlich nur gekommen, weil ich eben wollte das es auch ohne die App weiterläuft.
Sprich App beendet -> Abfrage von Schlüsselschalter und Ein/Ausschalten/Dimmen des ext. Monitors funktioniert weiterhin.

Wenn noch weitere Informationen benötigt werden, bitte bescheid sagen!

Ich möchte übrigens folgende Lib verwenden: http://makeithappend.org/de/archives/2538

Gruß Daniel

— geändert am 03.08.2016, 08:34:56

Antworten
swa00
  • Forum-Beiträge: 3.704

03.08.2016, 08:56:28 via Website

Hallo Daniel,

na das sind schon mehr Infos, um dir Helfen zu können :-)

Ich kenne die Library nicht, habe nur eben quer gelesen und ich habe auch noch nie GPIOS unter Android abgefragt.
Interessant : In der Beschreibung wird kein Wort über den Servicebetrieb verloren , ich gehe einmal davon aus, dass diese Lib auch hoffentlich in Services/Processes verwendbar ist .

Gehen wir einmal davon aus , so gäbe es Ansatzmöglichkeiten:
.
.
Alternative A
Du baust Dir für die (kontinuierliche) Abfrage deiner GPIOS's mit der Lib einen Service, der am besten beim Booten
(Broadcast) gestartet wird.

Dieser Service wird dann eine zeitlang aufrecht erhalten , bevor er von Android abgeschossen werden kann .
Wann das sein wird, kann ich Dir nicht beantworten , hängt von deinem C2 in Verbindung mit Android ab ...
Also bitte evt. selbst ermitteln.

Um diesen DauerTot zu vermeiden, kann man diesen Service selbst beenden lassen (stopSelf) und mittels AlarmManager triggern. Dies kann aber unter Android nicht im Millisekunden-Bereich geschehen , sondern eher im 2-5 Sekunden-Bereich.

Umgangsprachlich Jojo oder Heartbeat genannt.

http://informationideas.com/news/2012/03/06/how-to-keep-an-android-service-running/

Es wird also sein , dass in der Leerlaufphase ( die 2-5 Sekunden) keine Reaktion auf die GPIO's erfolgt.
.
.

Alternative B
Du kannst aber auch mit Background-Processes arbeiten

http://www.vogella.com/tutorials/AndroidServices/article.html
.
.

Nächster Schritt :
Hast du dann im Service/Process den Zustand "Schlüsselschalter-ein", kannst du wieder alles mögliche machen:
Deine App wieder zum Leben erwecken (Intent), die dann den Keyguard steuert und deinen Bildschirm einschaltet (Mosfet).
(oder auch direkt aus dem Service - musst du ausprobieren - aber so wenig wie Möglich in den Service packen !!)

Lebt deine App wieder (OnResume/OnCreate) , kannst du wieder nach Herzenslust wurschteln
.

Hier solltest du nach Möglichkeit alles messtechnische in einem AsyncTask laufen lassen - (AUCH im Service)
https://developer.android.com/reference/android/os/AsyncTask.html

Hinweis : Loops/TimeTasks - auch im AsyncTask unter 150ms Luft, sind unter Android nicht zu empfehlen !

Die GPIO zustände, die der Service/Process ermittelt , könntest du dann per Broadcast/Receiver an die App schicken
.
.

Noch ne Idee : Keine Standard App bauen , sondern eine FullScreen-Launcher-App mit Tasten - dann brauchst du keine
Keyguard. (Wenns eh das Einizge ist , was auf dem C2 bedienbar sein soll)

.
.

P.S Ohne dich de-motivieren zu wollen : für diese oben genannten alternativen und die restliche Vorgehensweise , ist natürlich leider fundiertes Wissen in Java/Android Voraussetzung.
Aus diesem Grunde kam ich auf die Raspberry/TCP Client Geschichte - dann hättest du dich lediglich unter Android mit einer Standard-App und TCP auseinander setzen müssen. Dabei würde die gesamte Mimik von Service / Alarmmanger / Broadcast und Lib entfallen - denn die muss man erst mal zu 100% im Griff haben.

Stellt sich die Frage, ob Du Dir nicht mit den zusätzlichen 30 Eus das Leben einfacher machst.

.
.

Legende für dich als C'ler

AsyncTask = Ähnlich einem Thread unter C
Broadcast = Sytemweites eindeutiges Trigger-Event
.
.

— geändert am 03.08.2016, 15:24:55

Liebe Grüße - Stefan
[ App - Entwicklung ]

Danie

Antworten
Danie
  • Forum-Beiträge: 42

05.08.2016, 18:17:26 via Website

Hallo,

vielen Dank für deine ausführliche und ehrliche Antwort!

Alternative A:
fällt aufgrund der Totzeit definitiv weg!
ABER: Gab es für Service nicht einen Parameter "START_STICKY"? Das sollte den Service doch jedes mal wieder sofort neu starten, wenn er aufgrund von RAM Mangel beendet wurde?

Zum Thema RAM Mangel: Der Odroid C2 hat 2GB davon. WIe wahrscheinlich ist es überhaupt, dass ein Service aufgrund von RAM Mangel beendet wird? Oder wird der Service auch gekillit, wenn genug RAM frei wäre?

Alternative B:
Was ist jetzt wieder der Unterschied zwischen Background-Process und einem Service?
Wie man einen Service ersteltt, gibt es massenweise Beispiel. Ein Suche nach "Background-Process" landet irgendwie auch immer beim Service?
Wird der Background-Process auch von Android gekillt? Oder ist der "unstoppable"? :D

Alternative TCP:
Wie läuft das auf Android Seite genau ab? Hier muss ich doch auch dauernd abfragen ob was interessantes für mich dabei ist? Oder gibt es hier ein Event, mit dem Ich einen Service aufrufen kann?

Wäre das auch über einen Arduino möglich? Raspberry Pi ist mir dafür eindeutig Overkill!

Da der Arduino sowieso das Hoch- und runterfahren des Odroids kontrollieren muss, wäre das als Lösung - nicht perfekt - aber wenn sie schneller ans Ziel führt, durchaus denkbar!

Gruß Daniel

— geändert am 05.08.2016, 18:17:43

Antworten
swa00
  • Forum-Beiträge: 3.704

05.08.2016, 20:53:08 via Website

Hallo Daniel,

zu a : Nein / Ja
zu b : Das ist LifeCycle abhängig - ich arbeite nicht mit ausgelagerten Processen , deshalb kann ich keine 100% Aussage dazu treffen - vielleicht hier jemand anderes - ich wollte dir lediglich die Möglichkeit aufzeigen.

zu TCP :
"Ob was interessantes dabei ist ?" Ich habe daran eher an eine ständige TCP Socket Verbindung gedacht - beide befinden sich in der gleichen IP Range und somit kannst du eine ständige Verbindung aufrecht erhalten - jede Seite schickt dann was , wenn sie was hat und die Gegenseite weis es dann innerhalb von Millisekunden.
Du benötigst dabei kein Push & Poll verfahren .... die Peeks reichen.
In der Read-Socket Funktion kannst innerhalb eines AsyncTask wunderbar darauf reagieren ....... Nein , es gibt kein Broadcast Event für deine Zwecke. Es gibt zwar etwas, das dir mitteilt , dass etwas über WLAN reinkommt. aber der kommt ständig, weil der allgemeine Overhead der Verbindung das auch auslöst.

Und damit hier etwas kontinuierlich überwacht wird und nicht beendet wird : Du kannst dir ZWEI services bauen , jeweils mit einem TCP Client, der die Verbindung zum Server aufbaut - . Lass sie parallel laufen und setze die Alarmmanger auf verschieden Zeiten. Ergo : es läuft immer einer zuverlässig , wenn der andere Pause hat.

Ob du einen Ardunio/ Rasberry oder einen anderes Singleboard nimmst, ist schnuppe ... Der Raspberry (3) ist halt mE vielschichtiger einsetzbar - meine Ardunios liegen bei mir mittlerweile ungenutzt in der Schublade.

Liebe Grüße - Stefan
[ App - Entwicklung ]

Danie

Antworten
Danie
  • Forum-Beiträge: 42

08.08.2016, 19:48:36 via Website

Hallo,

irgendwie bin ich mit der TCP Lösung auch nicht wirklich glücklich!
Es muss doch auch über die GPIO Schnittstellen (v.a. UART) möglich sein, so etwas ähnliches wie bei der TCP Lösung zu machen?
Von mir aus auch über eine USB UART Bridge...aber den Ethernet Port dafür zu missbrauchen...hmm :/

Ich habe schon zig Beispiele finden können mit Arduino Seriell -> Android.
Aber eben wieder nichts, was auch funktionieren würde, wenn die betreffende App geschlossen ist!
Das ist echt zum durchdrehen!

Gruß Daniel

Antworten
swa00
  • Forum-Beiträge: 3.704

08.08.2016, 20:17:59 via Website

Hallo Daniel,

ich kann Dir natürlich nur das empfehlen , was ich schon einige male erfolgreich umgesetzt habe ...

Nimm es mir nicht übel , aber an dieser Stelle klinke ich mich verständlicherweise aus, wünsche Dir jedoch
viel viel Erfolg bei deinem Projekt ..

lg

— geändert am 09.08.2016, 09:53:38

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
Danie
  • Forum-Beiträge: 42

09.08.2016, 23:18:13 via Website

Hallo,

verstehe das. Man hat ja nicht unendlich Zeit.
Wäre ein Foreground Service denkbar? Die Notification stört mich nicht!
Einfach ein runnable oder neuen Thread, der ständig läuft?
Oder auch nicht möglich/empfehlenswert?

Ich lese mich so langsam zumindest in die Java Geschichte rein.
Android ist auch nochmal ein ganzes stück Wissen, was man sich erst aneignen muss!

Gruß Daniel

Antworten