Apps für Android programmieren leicht gemacht!
Android + Raspberry Bewegungsmelder - Status

Raspberry Pi – Bewegungsmelder – Status

In unserem Demonstrationsvideo auf YouTube zeigt die App einen Status der momentanen Verbindung zu Google an.

Diesen Status habe ich innerhalb des originalen Raspberry Pi Bewegungsmelder Artikels herausgekürzt, um den Artikel -vor allem für Anfänger- so einfach wie möglich zu halten. vor allem, weil diese Statusmeldung nicht zwangsläufig notwendig ist.

Ich möchte nun gerne nachliefern und euch erklären, wie ihr diese Statusmeldung eigenständig hinzufügen könnt. Hierzu sind 2 kleinere Anpassungen nötig. Erstens benötigt ihr ein Textfeld, in dem der Status angezeigt werden kann. Als zweite Änderung bedarf es einer neuen Logik innerhalb der Hauptklasse MainActivity.class, um bei Statusänderungen auch das eben angesprochene Textfeld ändern zu können.

 

Textfeld:

Bitte öffnet die Datei activity_main.xml, welche sich in der linken Liste unter res->layout versteckt.
Hier fügt ihr innerhalb des äußersten Tags folgendes hinzu:

<TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:text="Status: Lade..."
        android:id="@+id/status_text"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"/>

Damit habt ihr ein neues Textfeld erstellt, welches den Namen (ID) „status_text“ trägt, in der Mitte zentriert liegt und als Standardtext „Status: Lade…“ trägt.

 

MainActivity.class:

Wir haben nun ein Textfeld erstellt, welches wir beschreiben können.
Der Inhalt der originalen Klasse lautete:

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
import android.support.v4.content.LocalBroadcastManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.ProgressBar;
import android.widget.TextView;

import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GoogleApiAvailability;

import java.io.IOException;

public class MainActivity extends AppCompatActivity {
    
    private static final int PLAY_SERVICES_RESOLUTION_REQUEST = 9000;
    private boolean isReceiverRegistered = false;
    private BroadcastReceiver mRegistrationBroadcastReceiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Prüfe, ob auf dem Gerät der Google PlayService installiert ist.
        // Dieser wird für den Empfang der GCM Nachrichten benötigt.
        if(checkPlayServices()) {

            // Erstelle einen Listener, der immer dann ausgeführt wird, wenn die App bei GCM registriert wurde oder ein Fehler bei der Registrierung auftrat.
            mRegistrationBroadcastReceiver = new BroadcastReceiver() {
                @Override
                public void onReceive(Context context, Intent intent) {
                    SharedPreferences sharedPreferences =
                            PreferenceManager.getDefaultSharedPreferences(context);
                    boolean sentToken = sharedPreferences
                            .getBoolean(Einstellungen.SENT_TOKEN_TO_SERVER, false);

                }
            };

            // Starte den oben beschriebenen Listener.
            registerReceiver();

            // Starte einen IntentService, um die App bei GCM zu registrieren.
            Intent intent = new Intent(this, RegistrationIntentService.class);
            startService(intent);

        }


    }

    private boolean checkPlayServices() {
        GoogleApiAvailability apiAvailability = GoogleApiAvailability.getInstance();
        int resultCode = apiAvailability.isGooglePlayServicesAvailable(this);
        if (resultCode != ConnectionResult.SUCCESS) {
            if (apiAvailability.isUserResolvableError(resultCode)) {
                apiAvailability.getErrorDialog(this, resultCode, PLAY_SERVICES_RESOLUTION_REQUEST)
                        .show();
            } else {
                finish();
            }
            return false;
        }
        return true;
    }

    // Ab hier folgen Fehlerkorrekturen, damit die App auch beim Neustart funktioniert.
    @Override
    protected void onResume() {
        super.onResume();
        registerReceiver();
    }

    @Override
    protected void onPause() {
        LocalBroadcastManager.getInstance(this).unregisterReceiver(mRegistrationBroadcastReceiver);
        isReceiverRegistered = false;
        super.onPause();
    }

    private void registerReceiver(){
        if(!isReceiverRegistered) {
            LocalBroadcastManager.getInstance(this).registerReceiver(mRegistrationBroadcastReceiver, new IntentFilter(Einstellungen.REGISTRATION_COMPLETE));
            isReceiverRegistered = true;
        }
    }
}

In Zeile 35-44 haben wir einen BroadcastReceiver programmiert. Dieser führt immer dann etwas aus, wenn die Klasse, auf die dieser aufgeschaltet ist, etwas sendet.
In unserem Fall sendet die aufgeschaltete Klasse, dass etwas mit dem Status passiert ist.

In Zeile 40-41 wird eine Variable sentToken mit true (Status: Verbunden) oder false (Status: Fehlerhaft) beschrieben. Wir können nun in Zeile 42 prüfen, ob die Variable sentToken true oder false ist und einen entsprechenden Text in das Textfeld schreiben.

if (sentToken) {
     status.setText("Status: Verbunden");
} else {
     status.setText("Status: Fehlerhaft");
}

 

Da die Variable „status“ noch nicht mit dem entsprechenden Textfeld verbunden ist müssen wir dies nun nachholen. Wir fügen einfach folgenden Code direkt unter „setContentView(R.layout.activity_main);“ ein:

final TextView status = (TextView) findViewById(R.id.status_text);

 

Marvin

Ich bin 23 Jahre jung und studiere zurzeit Wirtschaftsinformatik an der Georg-August-Universität in Göttingen. Ich bin ein Mensch, der sich neben der Programmierung noch für tausend andere Dinge interessiert, die mal mehr und mal weniger verrückt sind. Vor allem aber bin ich Feuer und Flamme mit der Programmierung von eigenen kleinen Apps und Programmen, die mein Leben bereichern.

6 Kommentare

*Pflichtfeld

  • Hallo,

    bis hier hin habe ich es geschafft. Es funktioniert. Riesen Danke nochmal dafür.

    Leider ändert sich „Status: Lade..“ nicht. Es steht immer da. Auch nachdem eine Nachricht von dem Raspberry Pi erhalten wurde.
    Wo stehe ich nun schon wieder auf dem schlauch? Quellcode hab ich mehrfach geprüft.

    lg

    • Hallo Michael,
      Ja das ist normal.

      Der Status zeigt uns an, ob unsere App zu dem GCM Dienst als Verbunden (oder auch Registriert) gilt.
      Ob der GCM Dienst auch Nachrichten, aufgrund von Internetverbindungen oder ähnlichem, empfangen und an unsere App senden kann wird nicht geprüft.

      Gruß,
      Marvin

  • Hallo,
    Ich habe dasselbe Problem wie Michael hatte. Ich habe bereits alles probiert, was ich mir dachte, das das Problem lösen könnte, es steht jedoch immer noch andauernd der Text „Status: Lade…“ da. Wisst ihr woran das liegen könnte?

    LG

    • Hallo Marco,

      eine Ferndiagnose ist immer schwer.
      Stelle bitte sicher, dass das Handy über eine aktive Internetverbindung verfügt, die Google Play App installiert ist, du die neuesten Play Services in der Gradle Datei importiert hat und prüfe auf eventuelle Fehler in der Android Studio Konsole.

      Gruß