BroadcastReceiver für ACTION_CONNECTION_STATE_CHANGED wird nie aufgerufen

  • Antworten:4
Android_Beginner
  • Forum-Beiträge: 3

29.10.2019, 16:30:05 via Website

Moin Leute, bin ganz neu hier und komme nach langer recherche einfach nicht weiter:
Ich habe einfe funktionierende App um mich an ein BLE Gerät zu connecten, zu schreiben oder Daten zu erhalten. Nun möchte ich gerne während der Zeit die man auf den connect warten muss eine Ladesequenz zeigen die kurz vor dem connect befehl in einer neuen Activity ausgeführt wird -> funktioniert. Aus der Ladeanimation möchte ich nun mittels dem BroadcastReceiver hinausführen wenn "ACTION_CONNECTION_STATE_CHANGED" als folge des connect-befehls aufgerufen wird. Doch genau das passiert eben nie.
Ich habe meinen Receiver sowohl in der Klasse als auch im Manifest schon registriert gehabt aber ohne Erfolg.

Hoffe ihr könnt mir weiter helfen ;)

public class LoadingAnimation extends AppCompatActivity {


TextView load;

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

    load = findViewById(R.id.loading_circle);

    registerReceiver(connectionStateReceiver, new IntentFilter(BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED));
}

@Override
protected void onStart() {
    super.onStart();

    Animation animation = AnimationUtils.loadAnimation(this, R.anim.rotate);
    load.startAnimation(animation);
}

@Override
protected void onDestroy() {
    super.onDestroy();
    unregisterReceiver(connectionStateReceiver);
}

private final BroadcastReceiver connectionStateReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        final String action = intent.getAction();
        if(action.equals(BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED)) {
            final int state = intent.getIntExtra(BluetoothAdapter.EXTRA_CONNECTION_STATE, BluetoothAdapter.STATE_DISCONNECTED);
            switch (state) {
                case BluetoothAdapter.STATE_CONNECTED:
                    Intent deviceInteractionWindow = new Intent (context, DeviceInteractionActivity.class);
                    context.startActivity(deviceInteractionWindow);
                    break;
                case BluetoothAdapter.STATE_DISCONNECTED:
                    Intent backToScanning = new Intent(context, BluetoothLEScanner.class);
                    context.startActivity(backToScanning);
                    break;
            }
        }
    }
};

}

Zuvor mache ich noch

Intent test = new Intent(context, LoadingAnimation.class);
 context.startActivity(test);
gatt = device.connectGatt(context, true, gattCallback);

P.S. die onConnectionStateChanged Callback methode wird aufgerufen

— geändert am 29.10.2019, 16:32:23

Kommentieren
Jokel
  • Forum-Beiträge: 1.530

29.10.2019, 18:04:56 via Website

Hallo Willkommen im Forum.

Packe mal den Receiver in eine echte eigene Klasse.
Ob interne Klasse oder auch eigene Datei ist eigentlich gleich.
Der Receiver sollte public sein und nicht final sein.
Bei private kann er nicht vom System aufgerufen werden.

Du willst eine Methode überschreiben Oberried. Du hast aber keine Kasse von Broadcastreceiver erbst also nicht.
Ein interface auch nicht wie willst du da eine Methode von einer bestehenden Klasse Überschreiben. Du hast eine Instanz erstellt, aber darin kannst du keine Methode Überschreiben.

Ohne Klasse wird das bestimmt nicht gehen.

public class connectionStateReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        final String action = intent.getAction();
        if(action.equals(BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED)) {
            final int state = intent.getIntExtra(BluetoothAdapter.EXTRA_CONNECTION_STATE, BluetoothAdapter.STATE_DISCONNECTED);
            switch (state) {
                case BluetoothAdapter.STATE_CONNECTED:
                    Intent deviceInteractionWindow = new Intent (context, DeviceInteractionActivity.class);
                    context.startActivity(deviceInteractionWindow);
                    break;
                case BluetoothAdapter.STATE_DISCONNECTED:
                    Intent backToScanning = new Intent(context, BluetoothLEScanner.class);
                    context.startActivity(backToScanning);
                    break;
            }
        }
    }

}

Hilfreich?
Kommentieren
Android_Beginner
  • Forum-Beiträge: 3

30.10.2019, 10:38:16 via Website

Erstmal vielen Dank für die schnelle Antwort :)
Es macht durchaus Sinn was du alles aufgezählt hast und ich habe meine Klasse jetzt mal folgendermaßen geändert:

public class LoadingAnimation extends AppCompatActivity {


TextView load;
ReceiverClass receiver;

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

    load = findViewById(R.id.loading_circle);

    receiver = new ReceiverClass();

    registerReceiver(receiver, new IntentFilter(BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED));
}

@Override
protected void onStart() {
    super.onStart();

    Animation animation = AnimationUtils.loadAnimation(this, R.anim.rotate);
    load.startAnimation(animation);
}

@Override
protected void onDestroy() {
    super.onDestroy();
    unregisterReceiver(receiver);
}

public class ReceiverClass extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        final String action = intent.getAction();
        if (action.equals(BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED)) {
            final int state = intent.getIntExtra(BluetoothAdapter.EXTRA_CONNECTION_STATE, BluetoothAdapter.STATE_DISCONNECTED);
            switch (state) {
                case BluetoothAdapter.STATE_CONNECTED:
                    Intent deviceInteractionWindow = new Intent(context, DeviceInteractionActivity.class);
                    context.startActivity(deviceInteractionWindow);
                    break;
                case BluetoothAdapter.STATE_DISCONNECTED:
                    Intent backToScanning = new Intent(context, BluetoothLEScanner.class);
                    context.startActivity(backToScanning);
                    break;
            }
        }
    }
}

}

Leider blieb auch das ohne Erfolg und der Receiver wird nicht aufgerufen

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.530

30.10.2019, 18:45:26 via Website

Versuche es mal so. Bei mir wird der Receiver aufgerufen.

Erstens deine Registrierung ist etwas falsch schaue meine.
Voraussetzung ist auch das du Permission im Manifest hast
uses-permission android:name="android.permission.BLUETOOTH"

zweitens wirst du bestimmt nicht in den if block kommen , denn deine Action ist falsch.
Eigentlich brauchst du das auch nicht. Benutze das Log und du siehst welche Action du bekommst.

public class MainActivity extends AppCompatActivity {

TextView load;
ReceiverClass receiver;

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

    load = findViewById(R.id.textview);

    receiver = new ReceiverClass();
    IntentFilter ifilter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
    ifilter.addAction(BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED);
    registerReceiver(receiver, ifilter);

}

@Override
protected void onDestroy() {
    super.onDestroy();
    unregisterReceiver(receiver);
}

public class ReceiverClass extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

        String action = intent.getAction();
        Log.i("test","onReceive action:  "+action);
        int state = intent.getIntExtra(BluetoothAdapter.EXTRA_CONNECTION_STATE,    BluetoothAdapter.STATE_DISCONNECTED);
        Log.i("test","onReceive state:   "+ state);
            switch (state) {
                case BluetoothAdapter.STATE_CONNECTED:
                    load.setText("Connect");
                    break;
                case BluetoothAdapter.STATE_DISCONNECTED:
                    load.setText("DisConnect");
                    break;
            }
    }
}

}

Hilfreich?
Kommentieren
Android_Beginner
  • Forum-Beiträge: 3

31.10.2019, 16:16:00 via Website

Ach da hätte ich eigentlich von selbst drauf kommen können (whew)

Die Permission habe ich gegeben im Manifest.

Danke für deine Hilfe!! :)

Hilfreich?
Kommentieren