Screen Brightness changed -> Methode ausführen?

  • Antworten:34
  • OffenNicht stickyBentwortet
  • 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

  • Forum-Beiträge: 2.209

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 ]

  • 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

  • Forum-Beiträge: 2.209

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 ]

  • 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

  • Forum-Beiträge: 2.209

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 ]

  • 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

  • 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

  • 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

  • Forum-Beiträge: 2.209

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 ]

  • 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

  • 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

  • Forum-Beiträge: 2.209

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 ]

  • 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