Screen Brightness changed -> Methode ausführen?

  • Antworten:34
  • Bentwortet
Danie
  • 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

Antworten
swa00
  • Forum-Beiträge: 3.704

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 ]

Antworten
Danie
  • 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

Antworten
swa00
  • Forum-Beiträge: 3.704

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 ]

Antworten
swa00
  • Forum-Beiträge: 3.704

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 ]

Antworten
Danie
  • 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 :-(

Antworten
swa00
  • Forum-Beiträge: 3.704

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 ]

Danie

Antworten
Danie
  • 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

Antworten
swa00
  • Forum-Beiträge: 3.704

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 ]

Danie

Antworten
Danie
  • 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...

Antworten
swa00
  • Forum-Beiträge: 3.704

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 ]

Danie

Antworten
Danie
  • 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

Antworten
swa00
  • Forum-Beiträge: 3.704

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 ]

Danie

Antworten
Danie
  • 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

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

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. :) ;)

Danie

Antworten
Danie
  • 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

Antworten
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

Antworten
swa00
  • Forum-Beiträge: 3.704

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 ]

Antworten
Danie
  • 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

Antworten
swa00
  • Forum-Beiträge: 3.704

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 ]

Antworten
Danie
  • Forum-Beiträge: 42

15.09.2016, 20:11:28 via Website

okay, ich werde mich schon irgendwie durchbeißen :-D

Hab es jetzt eingermaßen am Laufen. Einzig das Antippen der Notification öffnet die App nicht...

Kannst du mir mit der "screen Brightness changed" Geschichte noch ein bisschen helfen?
Mir fehlt noch das "live" update. Also während der Slider bewegt wird den Wert senden. Fällt dir da ein Ansatz ein?

Außerdem habe ich noch für auto brightness einen Observer eingebaut.
Der Monitor, den ich habe, hat eine Lux Sensor und kann Ambient Light Control, die ebenfalls über UART ein und ausgeschaltet werden kann.
Kann man die beiden Observer zusammenfassen und in der onChange() mit .equals() reagieren?

Aktuell hab ich zwei getrennte Observer:

// Observer für Brightness Slider
    Uri BrightnessSetting = Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS);
    ContentResolver BrightnessContentResolver = getContentResolver();

    ContentObserver BrightnessObserver = new ContentObserver(new Handler())
    {
        @Override
        public void onChange(boolean selfChange)
        {          
            super.onChange(selfChange);
                Log.i(LOG_TAG, "Brightness Änderung!");
                float brightness = 0;

            try {
                brightness = android.provider.Settings.System.getInt(getContentResolver(),
                        android.provider.Settings.System.SCREEN_BRIGHTNESS);
                brightness = (brightness/255)*100;

                Log.i(LOG_TAG + "  Backlight: ", Integer.toString((int)brightness));

            } catch (SettingNotFoundException e) {
                Log.i(LOG_TAG, "EROR");
                e.printStackTrace();
            }
        }

        @Override
        public boolean deliverSelfNotifications()
        {
            return true;
        }
    };
    BrightnessContentResolver.registerContentObserver (BrightnessSetting, false, BrightnessObserver);



    // Observer für Brightness Mode (automatic/manuell)   
    Uri BrightnessMode = Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS_MODE);
    ContentResolver BrightnessModeContantResolver = getContentResolver();

    ContentObserver ModeObserver = new ContentObserver(new Handler())
    {
        @Override
        public void onChange(boolean selfChange)
        {
            super.onChange(selfChange);
            Log.i(LOG_TAG, "Mode Änderung!");
        }
        @Override
        public boolean deliverSelfNotifications()
        {
            return true;
        }
    };
    BrightnessModeContantResolver.registerContentObserver (BrightnessMode, false, ModeObserver); 

Bei der Notification hab ich gerade das Problem das ich nur eine deprecated Methode gefunden habe.
Der Plan war jetzt, den Service mit einer festen Notification zu starten.
Und in einer updateNotification() Methode die Notification neu aufzubauen, wenn sich irgendetwas getan hat.

Weißt du zufällig, was .setTicker("string") in einer Notification bedeutet?!

Danke!
Gruß Danie

— geändert am 15.09.2016, 20:46:11

Antworten
swa00
  • Forum-Beiträge: 3.704

15.09.2016, 20:30:23 via Website

Hallo Daniel,

der ContentResolver besizt kein "live" override/listener/callback - da kannst du dich drehen und wenden,
wie du magst :-)
https://developer.android.com/reference/android/content/ContentResolver.html

Und setTicker schickt einen Text an den destination service
https://developer.android.com/reference/android/app/Notification.Builder.html

Bei der Notification hab ich gerade das Problem das ich nur eine deprecated Methode gefunden habe.

Dazu kann ich dir nochmals dringend AS empfehlen, da ist das recht einfach umgesetzt

— geändert am 15.09.2016, 20:31:25

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

Antworten
Danie
  • Forum-Beiträge: 42

15.09.2016, 20:40:39 via Website

Lade das Android Stuidio gerade runter :-)

Wie kann ich ein bestehendes Eclipse Prjekt in Android importieren? Geht das? Oder muss ich die Inhalte der src ordner usw. kopieren?

Was bedeutet das es an den destination service geschickt wird?
Taucht das oben in der StatusBar auf?

Gruß Daniel

Antworten
swa00
  • Forum-Beiträge: 3.704

15.09.2016, 20:43:41 via Website

a) https://developer.android.com/studio/intro/migrate.html

Export from Eclipse
1.Update your Eclipse ADT Plugin (you must have version 22.0 or higher).
2.In Eclipse, select File > Export.
3.In the window that appears, open Android and select Generate Gradle build files.
4.Select the projects you want to export for Android Studio and click Finish.
Your selected projects remain in the same location but now contain a build.gradle file and are ready for Android Studio.
Import into Android Studio
1.In Android Studio, select File > Import Project.
2.Locate a project you exported from Eclipse, select the project's root directory and click OK.
3.Select Create project from existing sources and click Next.
4.Follow the walk-through to complete the import process.

b) an den notifcation service

— geändert am 15.09.2016, 20:44:02

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

Antworten
Danie
  • Forum-Beiträge: 42

16.09.2016, 00:13:44 via Website

wie ich es befürchtet habe ... import funktioniert nicht...zumindest nicht auf Anhieb:/
Kann das Projekt zwar compilieren und auch auf dem Gerät laufen lassen, aber sobald eine Funktion die ndk-library nutzen will, crasht die APP!

Ich bin mir ziemlich sicher, dass es etwas mit der ndk und dem external ToolBuilder zu tun hat. Kann aber nicht ausmachen, wo ich diesen Fehler beheben kann.
Ich versuche die Lib von dieser Homepage http://makeithappend.org/de/archives/2538 zu importieren. Bisher leider ohne Erfolg.
Entweder mach ich beim Export schon was falsch oder irgendeine Einstellung bei den build Settings passt nicht :/

— geändert am 16.09.2016, 00:27:06

Antworten
swa00
  • Forum-Beiträge: 3.704

16.09.2016, 00:26:55 via Website

Was sind das denn für libs ?

JAR / ARR ?

EDIT : schon gesehen (.so) - haste auch die libs übernommen / kopiert ???
(die mips und x86 brauchste nicht)

— geändert am 16.09.2016, 00:30:06

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

Danie

Antworten
Danie
  • Forum-Beiträge: 42

16.09.2016, 00:56:20 via Website

kann dir nicht sagen, ob das mit übernommen wurde. Ich hab es so gemacht, wie in der Anleitung...

Wohin muss ich das denn kopieren?

Einfach in src/main?

— geändert am 16.09.2016, 01:02:55

Antworten
Danie
  • Forum-Beiträge: 42

16.09.2016, 16:06:16 via Website

EDIT: der unten gelistete Code funktioniert doch!
Der Castscreen war an, deshalb wurde der Screen nie abgeschalten! (Odroid hat einen "Fake Batterie Treiber", der immer 100% und "Charging" vorgaukelt)

Hab es jetzt auch mit Eclipse hinbekommen.
Da das Projekt so gut wie abgeschlossen ist, bleibe ich hierfür noch in Eclipse. Für die nächsten Projekte switch ich dann zu AS.

Das einzige, dass jetzt noch fehlt, ist das ein- und ausschalten des Monitors.
Hierzu gibt es von Android ja die Intents:
Intent.ACTION_SCREEN_OFF und Intent.ACTION_SCREEN_ON

Ich versuche jetzt innerhalb meines Service darauf zu reagieren.
Das hab ich bisher:

public void screenStateService()
 {
     IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
     filter.addAction(Intent.ACTION_SCREEN_OFF);

     BroadcastReceiver mReceiver = new BroadcastReceiver()         
     {
        @Override
        public void onReceive(Context context, Intent intent) {
            Log.i(LOG_TAG, "Broadcast Reciever triggerd");
            boolean screenOff = false;

            if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
                //Display aus
                screenOff = true;
                Log.i(LOG_TAG, "Bildschirm aus");

            } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
                //Display an 
                screenOff = false;
                Log.i(LOG_TAG, "Bildschirm an");
            }
            Toast.makeText(context, "ScreenState :"+screenOff, Toast.LENGTH_SHORT).show();
        }
     };
     registerReceiver(mReceiver, filter);
     Log.i(LOG_TAG, "Reciever registriert");
 }       

Der Log "Receiver regestriert" wird erreicht. Nur die onReceive() wird nie ausgeführt? Muss hier noch irgendwas im Manifest deklariert werden? Oder stimmt der Intent Filter nicht?

Gruß Daniel

— geändert am 16.09.2016, 17:17:25

Antworten
Danie
  • Forum-Beiträge: 42

17.09.2016, 15:58:36 via Website

Hallo,

ich bräuchte nochmal Hilfe bezüglich des Live Updates des Brightness Sliders.
Ist das überhaupt möglich? Mir fehlt leider komplett der Ansatz, daher fällt auch das Googlen sehr schwer :-(

Danke!
Gruß Daniel

Antworten
swa00
  • Forum-Beiträge: 3.704

17.09.2016, 17:01:47 via Website

oooh lieber Daniel :-)

Wie du ja schon selbst festgestellt hast, gibt es kein Live - Event / Broadcast/ Listener ( oder was auch immer) für die Brightness. - Nur der ContentResolver. Der ist bereits für Dich vergewaltigt worden .

PUNKT ! :-)

Gib es auf und versau dir nicht dadurch das ganze Wochenende :-)

— geändert am 17.09.2016, 17:02:16

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

Danie

Antworten
Danie
  • Forum-Beiträge: 42

17.09.2016, 17:15:48 via Website

Immer dieser Perfektionismus :-D ...ich lass es jetzt aber so! :)

Der Service läuft soweit, wie er soll!

Dann nerv ich jetzt noch mit was anderm ;-)
Mir fehlt jetzt nurnoch die Möglichkeit, Einstellungen abzuspeichern :-D
Sind (vorerst) nur 2 Werte.

Was ist da der gängige Weg für? Ist meiner allererste Android App, daher bin ich recht ratslos :D

Gruß Daniel

— geändert am 17.09.2016, 17:18:05

Antworten
Danie
  • Forum-Beiträge: 42

18.09.2016, 01:26:13 via Website

Klasse, Danke. Dazu findet man über google echt haufenweise Beispiele!

Wie sollten die Einstellungen generell aufgerufen werden?
Ich würde sie gerne nicht jedem zugänglich machen. Also fällt der Weg mit dem Icon oben rechts in der APP wohl weg?
Kann man die evtl. per Passwort schützen? Gibt es eine API in Android, mit der der USER zum Eingeben eines Passwortes aufgefordert werden kann?

Noch eine Sache: Meine APP darf nicht von einem "normalen" user einfach deinstalierbar sein!
Der Odroid hat komplette root Rechte. Gibt es irgendeinen Eintrag im Manifest, mit der die APP als System-App installiert wird? Oder kann man auf einem anderen Weg die App als System-App installieren/vor deinstallation schützen?

Auch die Settings-APP vom Android OS soll nicht ohne weiteres gestartet werden können.
Leider fällt die Möglichkeit mit verschiedenen User-Profilen weg, da der Eintrag unter Settings -> Nutzer auf dem Odroid nicht existiert :/
Kann man hier irgendwie den DevicePolityManager verwenden?

PS: Danke für eure rießige Hilfe in den letzten Tagen!
Ohne euch wäre ich noch lange nicht soweit, wie ich es jetzt bin!

Gruß Daniel

Antworten
swa00
  • Forum-Beiträge: 3.704

18.09.2016, 10:29:57 via Website

Hallo Daniel,

das Schlüsselwort zum Suchen lautet : PreferenceFragment
https://developer.android.com/reference/android/preference/PreferenceFragment.html

Damit baut man sich im Prinzip eine eigene Activity , indem man seine Einstellungen vornimmt.
Da muss man sich einarbeiten.

Und das Ganze rufst du dann mit einem eigenen Button irgendwo auf und schützt es vorher mit einer Passworteingabe.

Anstatt der PreferenceFragment kannst du dir auch eine eigene ganz normale Activity bauen und dort manuell deine Werte setzen. (Wie oben von Pascal beschreiben)

So wie dir beliebt

— geändert am 18.09.2016, 10:32:25

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

Antworten
Danie
  • Forum-Beiträge: 42

18.09.2016, 19:02:22 via Website

Das mit den PreferencesFragment ist echt klasse!

Das mit dem Passwort für die Einstellungen der APP hab ich auch hinbekommen.

Edit:
Hab gerade so meine Probleme mit dem PreferencesFragment.
Wie update ich denn den String im "HauptFragment", nachdem ich über eine ListView eine Änderung vorgenommen habe?

Außerdem fehlt der Activity, die das Fragment startet irgendwie der zurück Button in der ActionBar?
Ich starte die SettingsActivity aus der MainActivity über:

    public boolean onOptionsItemSelected(MenuItem item) {       
    switch (item.getItemId()) {        
        case R.id.menu_settings:            
            Intent intent = new Intent();
            intent.setClass(MainActivity.this, SettingsActivity.class);
            startActivity(intent);            
            return true;        
        default:            
            return super.onOptionsItemSelected(item);    
    }
}

Und die SettingsActivity:

public class SettingsActivity extends Activity{

    public boolean sucess = false;
    final String password = "1510";
    public String m_Text = "";

protected void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.settings);
    ShowPasswordPrompt();       
}

public class MySettingsFragment extends PreferenceFragment {

    @Override    
    public void onCreate(Bundle savedInstanceState) {        
        super.onCreate(savedInstanceState);        
        addPreferencesFromResource(R.xml.preferences);    
    }
}

private void ShowPasswordPrompt() {

    final AlertDialog.Builder builder = new AlertDialog.Builder(this);

    builder.setTitle("Enter Password!");
    // Set up the input
    final EditText input = new EditText(this);
    // Specify the type of input expected; this, for example, sets the input as a password, and will mask the text
    input.setInputType(InputType.TYPE_CLASS_NUMBER| InputType.TYPE_NUMBER_VARIATION_PASSWORD);
    builder.setView(input);
    builder.setCancelable(false);

    // Set up the buttons
    builder.setPositiveButton("OK", new DialogInterface.OnClickListener() { 
        @Override
        public void onClick(DialogInterface dialog, int which) {
            m_Text = input.getText().toString();
            if (m_Text.equals(password))
            {
                sucess = true;
                getFragmentManager().beginTransaction().replace(android.R.id.content, new 
                             MySettingsFragment()).commit();
            }
            else{
                ShowPasswordPrompt();
            }
        }

    });
    builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            dialog.cancel();
            Intent intent= new Intent(SettingsActivity.this, MainActivity.class);
            startActivity(intent);
        }
    });
    builder.show();
}
}

Außerdem versteh ich nicht so ganz, was der default wert in der preferences.xml bewirkt...
Meine preferences.xml:

<PreferenceScreen
        xmlns:android="http://schemas.android.com/apk/res/android">
         <PreferenceCategory
               android:title="@string/displaySettings">
                <ListPreference
                android:key="ST2_PowerMethode"
                android:title="@string/ST2_PowerMethode"
                android:summary="@string/ActualUsed_ST2_PowerMethode"
                android:entries="@array/entries_list_ST2_PowerMethode"
                android:entryValues="@array/entryvalues_list_ST2_PowerMethode"
                android:dialogTitle="@string/dialog_title_ST2PowerMethode" 
                android:defaultValue="@string/pref_list_default_ST2PowerMethode" />
         </PreferenceCategory>
 </PreferenceScreen>

Es funktioniert im Grunde. Aber wie und vor allem wo muss ich denn den summary string aktualisieren?
Passt der Code soweit, oder ist das sowieso vollkommener Schwachsinn?

Edit: Lösung gefunden. In der Preferences.xml den summery auf "%s" setzen:

android:summary="%s"

Funnktioniert das auch mit CheckPref, SwitchPref usw.?

TODO: Das mit dem Zurück Button in der ActionBar konnte ich noch nicht lösen.

Gruß Daniel

— geändert am 19.09.2016, 06:57:17

Antworten