Screen Brightness changed -> Methode ausführen?

  • Antworten:34
  • OffenNicht stickyBentwortet
  • Forum-Beiträge: 42

14.09.2016 21:15:48 via Website

Hallo,

habe einen Odroid C2. An diesen habe ich einen 12,1" Touch-Monitor angeschlossen. Der Monitor ist über UART an den Odroid angeschlossen. Eine Klasse zum Seuern des Monitors habe ich bereits geschrieben. Die Ausgabe über die UART funzt auch.
Ich kann über kleine Beispiel APP´s den Monitor auch steuern.

Zum Einstellen der Backlight Helligkeit habe ich einfach mal eine app mit einer Seekbar erstellt.
Das hat 1A funktioniert. Nur möchte ich eben nicht immer eine App öffnen, um "nur" kurz die Helligkeit zu ändern...
Daher soll das ganze jetzt in einen Service ausgelagert werden.

Bei jeder Änderung soll - so schnell wie möglich - der serielle Befehl an den Monitor geschickt werden.
Der Service wird über einen Broadcast Receiver und "BOOT_COMPLETED" gestartet.

Mein Problem ist jetzt: Wie bekomme ich mit, wenn sich die Helligkeit geändert hat?!
Bei jeder Änderung müsste kurz eine Methode ausgeführt werden, um den Befehl zu verschicken.

Ich habe testweise mal versucht, die Helligkeit einfach kontinuierlich auszulesen und dann immer mit dem zuletzt an den Monitor geschickten Wert zu verglichen...wenn diese zwei Werte ungleich waren, hab ich einen neuen String zum Monitor geschickt.

Leider hat das zuviel Resourcen verbraucht. Android reagierte träge bzw. war garnicht mehr zu bedienen!
Gibt es hier einen Trick? Evtl. neuer Thread?
Aber in einem Service sollte es doch ohnehin unabhängig vom UI-Thread laufen? Daher verstehe ich nicht, warum Android mir das so übel nimmt? :?

Bin für jeden Tipp dankbar!
Gruß Danie

— geändert am 14.09.2016 21:17:17

  • Forum-Beiträge: 2.210

14.09.2016 21:54:57 via Website

Hallo Danie,

willkommen zurück und offensichtlich machst du ja Fortschritte :-)

Mein Problem ist jetzt: Wie bekomme ich mit, wenn sich die Helligkeit geändert hat?!

Frage : Womit wird denn die Helligkeit "geändert", der du den Monitor angleichen magst ?

— geändert am 14.09.2016 21:55:42

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

  • Forum-Beiträge: 42

14.09.2016 22:21:57 via Website

Hallo,

ja ich mache Fortschritte. :)
Java geht mitlerweile schon sehr gut. Die Klasse für den Monitor hab ich selbst geschrieben. War etwas arbeit, aufgrund von CRC Summen und so weiter, aber sie läuft :)

swa00

Frage : Womit wird denn die Helligkeit "geändert", der du den Monitor angleichen magst ?

Ich möchte den "ganz normalen" Android Screen-Brightness Slider nutzen. Also entweder über Settings -> Display -> Brightness.
Noch eleganter: Mittels Slider der Notification-Bar! Anzustreben wäre natürlich, dass beides geht ;-)

Ist also wie beim Handy, nur das das Backlight statt direkt über einen Treiber im Kernel eben über den ext. Monitor und UART angesteuert werden muss...
Quasi Helligkeit von Android zwischen 0-255 einstellen -> Monitor passend über UART 0....100% vorgeben.

Finde es übrigens Klasse, dass du immer so aktiv bist und mich unterstützt, wo du kannst!
Danke dafür!

Gruß Danie

— geändert am 14.09.2016 22:27:42

  • Forum-Beiträge: 2.210

14.09.2016 22:30:23 via Website

Hallo Daniel,

na wenn du auf hardwarekeys reagieren willst , ist das recht trivial..
Kannst ja die Helligkeit auf Diese setzen

@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
if (keyCode == KeyEvent.KEYCODE_VOLUME_UP)
{
return true;
} else if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN)
{
return true;
}
return super.onKeyDown(keyCode, event);
}

Mit dem Slider in der Notification müsste ich nochmal suchen ..
kommt also noch später

— geändert am 14.09.2016 22:31:49

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

  • Forum-Beiträge: 2.210

14.09.2016 22:37:06 via Website

Nachtrag :

Ich finde keinen Trigger Event / Broadcast für die erfolgte Änderung der Brightness.

Vielleicht findet jemand Anderes etwas dazu ..

— geändert am 14.09.2016 22:37:22

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

  • Forum-Beiträge: 42

14.09.2016 22:55:50 via Website

swa00

Nachtrag :

Ich finde keinen Trigger Event / Broadcast für die erfolgte Änderung der Brightness.

Vielleicht findet jemand Anderes etwas dazu ..

So ging mir leider auch, kein Intent oder Broadcast...wäre auch zu einfach gewesen :/
Hab was mit einem Observer gefunden. Leider hab ich das nicht kapiert...
Siehe: https://android.googlesource.com/platform/frameworks/base/+/635e915/packages/SystemUI/src/com/android/systemui/settings/BrightnessController.java

Das kann doch net so schwer sein :-(

  • Forum-Beiträge: 2.210

14.09.2016 23:07:49 via Website

Ich habe eben deinen Link angeschaut ..

Das was du da hast ist im prinzip der Source des Betriebssystems und in die Klasse in deinem Link
ist von der Klasse Toggleslider abgeleitet, die wiederum die Klasse ist , die Android in die Notifactionbar einsetzt

Und das ist ein ganz normales RelativeLayout mit einem SeekbarListener
https://android.googlesource.com/platform/frameworks/base/+/635e915/packages/SystemUI/src/com/android/systemui/settings/ToggleSlider.java

Aber da ist - wie du richtig erkannt hast, der Observer verwendet ..

Schau mal , ob du damit weiter kämst ..
http://stackoverflow.com/questions/6190779/monitor-android-system-settings-values

— geändert am 14.09.2016 23:12:15

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

  • Forum-Beiträge: 42

14.09.2016 23:17:43 via Website

Ich sehs mir mal an. Auf den ersten Blick sieht es eher wie böhmische Dörfer aus :D

Was ist denn dieses "CONTENT_URI" beim Observer?
Einfach:
final String "Settings.System.SCREEN_BRIGHTNESS"machen und dann wird nach Ändernung des Wertes geschaut?

Ich bin gerade hier: http://stackoverflow.com/a/4435473/6832275
Das sieht mir ganz gut aus... ? :-D

Edit: http://stackoverflow.com/questions/4544967/get-preferred-screen-brightness-in-android
Bei der zweiten Antworten in den Kommentaren.
Da bin ich mir ziemlich sicher, dass die Lösung dabei steht. Aaaaaaber ich bekomm den "Fließtext" nicht in Eclipse geschrieben. Weiß nicht, wie da die "Klammer-Setzung" ist. Das scheint auch nicht die ganze Lösung zu sein, sondern nur der Hinweis, wie es geht...
Kannst du dir das bitte mal anschauen? :)

— geändert am 14.09.2016 23:37:55

  • Forum-Beiträge: 2.210

14.09.2016 23:35:28 via Website

ich habe eben mal bei mir das Beispiel mit dem Accelerometer ausprobiert ..
und dann auf Settings.System.SCREEN_BRIGHTNESS

Also bei mir geht BEIDES nicht .....

— geändert am 14.09.2016 23:36:10

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

  • Forum-Beiträge: 42

14.09.2016 23:59:51 via Website

Siehe Edit in meinem letzten Post. Das Power Widget macht es wohl auch auf die Weise. Leider steig ich bei dem Beispiel nicht durch!

Es geht um diese Antowort:

David, about item 2 above (Listen to screen brightness changes): Google's Power Control appwidget registers a ContentObserver in order to listens to changes to the brightness settings. Not quite the same as listening for actual screen brightness changes, but better than nothing: resolver.registerContentObserver(Settings.System.getUriFor(S‌​ettings.System.SCREE‌​N_BRIGHTNESS), false, this); resolver.registerContentObserver(Settings.System.getUriFor(S‌​ettings.System.SCREE‌​N_BRIGHTNESS_MODE), false, this);

Leider sind die Code-Zeilen im "Fließtext" und ich weiß nicht, wie genau ich das umsetzen müsste...

  • Forum-Beiträge: 2.210

15.09.2016 00:08:00 via Website

YEAH :-)

ContentResolver contentResolver = getContentResolver();
    Uri setting = Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS);
    ContentObserver observer = new ContentObserver(new Handler())
    {
        @Override
        public void onChange(boolean selfChange)
        {
            super.onChange(selfChange);
            //  an der Stelle  die  Brightness auslesen 
        }
        @Override
        public boolean deliverSelfNotifications()
        {
            return true;
        }
    };
    contentResolver.registerContentObserver (setting, false, observer);

so gehts :-)

EDIT :
Ist mir eben passiert - bitte beachten - im Import muss

import android.os.Handler;

rein - ALT + ENTER haut dir dabei die utils.log.handler rein - das ist falsch

— geändert am 15.09.2016 00:15:47

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

  • Forum-Beiträge: 42

15.09.2016 00:42:16 via Website

Leider bekomm ich es auch damit nicht hin.

Ich hab einen Broadcast Receiver, der mit "BOOT_COMPLETED" den Service startet, indem auch der Observer laufen soll.

public class BootReceiver extends BroadcastReceiver
{    
        @Override
        public void onReceive(Context context, Intent intent) {           
            // TBD Service starten
            Intent Intent = new Intent(context, BacklightService.class);
            context.startService(Intent);
            Toast.makeText(context, "Boot Completed....Starting BacklightService", Toast.LENGTH_LONG).show();   
        }
}

Mein BacklightService:

public class BacklightService extends Service  
{
private static final String TAG = "BacklightService";

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate()  {
        Log.d(TAG , "Service gestartet");
        contentResolver.registerContentObserver (setting, false, observer);
        Log.d(TAG, "onCreate()");
    }

    @Override
    public void onDestroy() {           
        Log.d(TAG, "onDestroy()");
        contentResolver.unregisterContentObserver(observer);
    }

    @Override
    public void onStart(Intent intent, int startid) {
        Log.d(TAG, "onStart()");
    }

ContentResolver contentResolver = getContentResolver();
Uri setting = Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS);
ContentObserver observer = new ContentObserver(new Handler())
{
    @Override
    public void onChange(boolean selfChange)
    {
        super.onChange(selfChange);
        Log.d (TAG ,"ggggg");
    }
    @Override
    public boolean deliverSelfNotifications()
    {
        Log.d (TAG ,"sssss");   
        return true;
    }
};
}

Die app stürtzt leider ab. Wenn ich onCreate() die Zeile "// contentResolver.registerContentObserver (setting, false, observer);" auskomentiere, dann stürtzt die App nicht ab...

An welcher Stelle müsste ich eigentlich den Befehl an meinen Monitor senden?
Bei Log.d...."sssss" oder Log.d...."gggg"? :-D

Irgendwas mach ich noch verkehrt :/

— geändert am 15.09.2016 00:48:07

  • Forum-Beiträge: 2.210

15.09.2016 00:48:31 via Website

Step for Step Daniel , nicht alles auf einmal

Hau bitte mal erst den Block, den ich oben gepostet habe, in eine ACTIVITY onCreate rein und
schau, ob da was bei heraus kommt .

Und wo du das abfängst , siehe den Edit von meinem oberen Post.

Und wichtig ; du musst auch am ende unbedingt ein unregister ausführen

Wenn das alles geht , dann bringst du das erst in den Service rein .. VORHER nicht
Wenns nämlich nicht geht, dann unterstützt dein OS es nicht, dann brauchst du nämlich
gar nicht an den Service zu denken

P.S ich bin aber für heute weg ... gute Nacht

— geändert am 15.09.2016 00:51:57

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

  • Forum-Beiträge: 42

15.09.2016 01:20:55 via Website

Jetzt läuft es! Fehlt nurnoch der Spaß mit dem Foreground-Service :D

Außerdem ist mir aufgefallen, dass erst nach dem loslassen des Sliders die onChange() aufgerufen wird.
Meinst du das ist irgendwie möglich, dass "live" upzudaten?
Quasi, dass, während man den Regler bewegt, die Helligkeit des Bildschirms direkt mit geändert wird?
Dazu müsste man irgendwie an den Wert des Sliders kommen...

Hat jetzt nicht so die Priorität, aber wäre ein "nice to have" :)

Tausend Dank dir aufjeden Fall!
Gute Nacht!

Gruß Danie

Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 9.302

15.09.2016 07:03:44 via App

Die Frage ist, ob du das wirklich so haben willst. Denn wenn du das so wievon Stefan beschrieben umsetzt, dann kannst du die Helligkeit deines Androidgerätes nicht mehr unabhängig der Helligkeit deines Monitors steuern. Wenn dir das Egal ist, dann ist dies oben die passende Lösung. Absonsten brauchst du dein Eigenes Overlay oder Notification zum steuern. Oder eine Möglichkeit den Monitor über die App manuell nochmal zu ändern.

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

  • Forum-Beiträge: 42

15.09.2016 13:59:37 via Website

Pascal P.

Die Frage ist, ob du das wirklich so haben willst. Denn wenn du das so wievon Stefan beschrieben umsetzt, dann kannst du die Helligkeit deines Androidgerätes nicht mehr unabhängig der Helligkeit deines Monitors steuern. Wenn dir das Egal ist, dann ist dies oben die passende Lösung. Absonsten brauchst du dein Eigenes Overlay oder Notification zum steuern. Oder eine Möglichkeit den Monitor über die App manuell nochmal zu ändern.

Hallo,

der Odroid ist ein Einplatinen-Computer. Der hat keinen eigenen Bildschirm! Den einzigen Bildschrim den ich mit dem Slider steuer, ist also der, den ich über UART ansteuer. Daher ist das schon vollkommen in Ordnung!
Der Slider war bisher ohne Nutzen.

Daher ist es die richtige Lösung! Ich muss es jetzt nurnoch in einem Foreground Service packen und im Hintergrund werkeln lassen.
Und wenn möglich, dass mit dem live update implementieren. Da hab ich aber leider garkeine Idee zu!

Gruß Danie

  • Forum-Beiträge: 42

15.09.2016 16:56:04 via Website

Aaaaaargh, ich bekomm das mit dem ForegroundService nicht hin.

Den Service kann ich starten:

public class BacklightService extends Service
{   
 private static final String LOG_TAG = "BacklightService";

 @Override
 public void onCreate() {
 super.onCreate();
 Log.i(LOG_TAG, "onCreate()");

 Notification notification = new Notification.Builder(this)
         .setContentTitle("BacklightCTRL")
         .setContentText("Status")
         .setSmallIcon(R.drawable.ic_launcher)
         .setOngoing(true).build();

 startForeground(1, notification);
 }

 @Override
public IBinder onBind(Intent intent) {
    // TODO Auto-generated method stub
    return null;
}
}

Auch die Notification wird angezeigt. Jetzt würde ich gern die App öffnen, wenn ich die Notification anklicke :?
Außerdem soll die zweite Zeile der Notification (Status) mit Meldungen gefüllt werden (z.B. Brightness changend usw... ) :?

Leider weiß ich nicht, wie ich das realisieren kann...

— geändert am 15.09.2016 17:18:02

  • Forum-Beiträge: 2.210

15.09.2016 17:10:49 via Website

Hallo Daniel,

ist das dein Ernst , dass du noch mit Eclipse rummachst ? :-) :-) :-)
Jetzt erklärt sich Vieles, warum du auch gestern den Source aus stackoverflow nicht umsetzen konntest .

Bring dich bitte bitte mal auf den neusten Stand. AS Version 2.2RC

Eclipse ist seit längerem auf altem Stand

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

  • Forum-Beiträge: 42

15.09.2016 17:29:17 via Website

Hallo,

ich hab mit Eclipse angefangen. Die Lib, die ich für den Odroid nutze, ist ein Eclipse Projekt. Wollte dem Ärger mit dem portieren umgehen.

ich werde es mal installieren und versuchen die Lib in Anrodid Studio rein zubekommen.

PS: Hab meinen letzten Post oben editiert.

— geändert am 15.09.2016 17:29:46

  • Forum-Beiträge: 2.210

15.09.2016 17:31:12 via Website

PS: Hab meinen Post oben editiert.

und dazu muss ich "Tilt" schreien :-)
Sowas habe ich noch nicht umgesetzt , da musste dich leider selbst durchwurschteln

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