2017-11-14 4 views
1

Ich habe eine Anwendung zum Ein-/Ausschalten von Bluetooth gemacht. Zum Ein- und Ausschalten habe ich einen Schalter benutzt. Hier ist der Code:Erkennen Aktivieren/Deaktivieren Bluetooth

public class MainActivity extends AppCompatActivity { 
private static final String TAG = "MainActivity"; 
private final static int REQUEST_ENABLE_BT = 1; 
BluetoothAdapter mBluetoothAdapter = null; 

private final BroadcastReceiver mReceiver = new BroadcastReceiver() { 
    public void onReceive(Context context, Intent intent) { 
     String action = intent.getAction(); 
     if (action.equals(mBluetoothAdapter.ACTION_STATE_CHANGED)) { 
      final int state = intent.getIntExtra(mBluetoothAdapter.EXTRA_STATE, mBluetoothAdapter.ERROR); 

      switch (state){ 
       case BluetoothAdapter.STATE_OFF: 

        break; 
       case BluetoothAdapter.STATE_ON: 
        break; 
      } 
     } 
    } 
}; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    final Switch bluetoothSwitch = (Switch) findViewById(R.id.bluetoothSwitch); 

    mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); 
    if (mBluetoothAdapter == null){ 
     //Device does not support bluetooth 
    } 
    else{ 
     bluetoothSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
      @Override 
      public void onCheckedChanged(CompoundButton compoundButton, boolean b) { 
       if(bluetoothSwitch.isChecked() && !mBluetoothAdapter.isEnabled()){ 
        Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); 
        startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT); 

        IntentFilter BTIntent = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED); 
        registerReceiver(mReceiver, BTIntent); 
       } 
       if(!bluetoothSwitch.isChecked() && mBluetoothAdapter.isEnabled()){ 
        mBluetoothAdapter.disable(); 
        IntentFilter BTIntent = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED); 
        registerReceiver(mReceiver, BTIntent); 
       } 
      } 
     }); 
    } 
} 

}

Das Problem ist, dass, wenn ich ein-/ausschalten Bluetooth von Einstellungen und nicht von meiner App der Schalter nicht ändert. Ich habe einen Broadcast-Empfänger implementiert, aber ich kann nicht auf den Switch zugreifen. Ich habe versucht:

bluetoothSwich.setChecked(true) 

innerhalb des Rundfunkempfängers, aber es funktioniert nicht.

Ty

EDIT: Ich löste teilweise das Problem mit dem globalen Schalter aber die Ein-/Aus-Aktion von Einstellungen zu fangen zuerst muß ich die Ein-/Aus-Taste klicken aus meiner app mindestens einmal. irgendein Vorschlag?

+0

hinzugefügt haben Sie den Empfänger in die in Android-Manifest-Datei? und mache deinen switch button global, um innerhalb des Broad Cast Empfängers darauf zuzugreifen –

+0

ja ich habe den receiver im android manifest hinzugefügt. Ich habe versucht, die switch-Taste global zu machen, und ich kann darauf vom Broadcast-Empfänger zugreifen, aber ich kann das Bluetooth nicht ein/aus von den Einstellungen auslösen – Tenrampi

Antwort

1

Um die Statusänderung von Bluetooth zu erkennen, müssen Sie Ihrer AndroidManifest.xml die folgende Berechtigung hinzufügen.

<uses-permission android:name="android.permission.BLUETOOTH" /> 

Verwenden Sie vorzugsweise eine lokale Sendung. Sie müssen es nicht in Manifest registrieren. registrieren sie zur Laufzeit, wo Sie es brauchen (If müssen überall die App dann in Manifest registrieren)

private final BroadcastReceiver bStateReceiver = new BroadcastReceiver() { 
    public void onReceive(Context context, Intent intent) { 
     String action = intent.getAction(); 
     if (BluetoothAdapter.ACTION_STATE_CHANGED.equals(action)) { 
      if (intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, -1) == BluetoothAdapter.STATE_OFF) { 
       // Bluetooth is disconnected, do handling here 
      } 
     } 
    } 

}; 

Runtime Register.

LocalBroadcastManager.getInstance(this).registerReceiver(bStateReceiver, new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED)); 

Runtime austragen: Vergessen Sie nicht, die Sendung deregistrieren.

LocalBroadcastManager.getInstance(this).unregisterReceiver(bStateReceiver); 

Static Register:

<receiver 
    android:name=".FullyQualifiedBroadcastReceiverClassName" 
    android:enabled="true"> 
<intent-filter> 
    <action android:name="android.bluetooth.adapter.action.STATE_CHANGED"/> 
</intent-filter> 

Verwandte Themen