0

kommt, wenn das Telefon mit dem Bluetooth im Auto verbunden ist. Ich möchte, dass sich meine App automatisch einschaltet. Um dies zu tun, muss ich den Bluetooth-Gerätenamen des gepaarten Fahrzeugs in einer Zeichenfolge speichern. dann, wenn das Telefon Bluetooth mit etwas verbunden ist. Ich muss nachsehen, ob es das Auto ist. Wenn es ist, möchte ich einen Dienst beginnen.Daten an Broadcast-Empfänger übergeben, die bereits Absichtsfilter hat, der von Aktivität

Ich habe Schwierigkeiten beim Übergeben der Zeichenfolge, die den Bluetooth-Auto-Gerätenamen enthält, an den Empfänger, da mein Empfänger bereits einen Intent-Filter empfängt, der auf ACTION_ACL_CONNECTED wartet. ist es möglich, einen Intent & einen Intent-Filter an denselben Empfänger zu senden.

Wie kann ich in diesem Fall die Zeichenfolge btdeviceName von der Aktivität an den Empfänger senden.

Hauptaktivität

private void addDrawerItems() { 

    final BroadcastReceiver bluetoothBroadcast = new BluetoothReceiver(); 
    final IntentFilter blueToothFilter = new IntentFilter(BluetoothDevice.ACTION_ACL_CONNECTED); 


    final Intent btbroadcastIntent = new Intent(this, BluetoothReceiver.class); 
    btbroadcastIntent.putExtra("btDeviceName", mPairedBluetoothDevice); 


    String[] osArray = {"Bluetooth Auto Start", "Reply to Calls", "Reply to sms", "Customise Message"}; 

    mAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_multiple_choice, osArray); 


    if (mIsPremiumUser) { 
     mDrawerList.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE); 
    } else { 
     mDrawerList.setChoiceMode(AbsListView.CHOICE_MODE_NONE); 
    } 

    mDrawerList.setAdapter(mAdapter); 


    mDrawerList.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { 
     @Override 
     public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { 


      if (position == 0) { 
       Toast.makeText(getApplicationContext(), "blue", Toast.LENGTH_LONG).show(); 
       showBluetoothDialog(); 
      } 
      return true; 
     } 
    }); 


    mDrawerList.setOnItemClickListener(new AdapterView.OnItemClickListener() { 

     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 

      CheckedTextView ctv = (CheckedTextView) view; 

      if (!mIsPremiumUser) { 
       Toast.makeText(getApplication(), "Upgrade", Toast.LENGTH_LONG).show(); 
       return; 
      } 


      switch (position) { 

       case 0: 

        if (ctv.isChecked()) { 

         if (!isblueToothRegistered) { 
          registerReceiver(bluetoothBroadcast, blueToothFilter); 
          sendBroadcast(btbroadcastIntent); 
          isblueToothRegistered = true; 
         } 

        } else { 
         if (isblueToothRegistered) { 
          unregisterReceiver(bluetoothBroadcast); 
          isblueToothRegistered = false; 
         } 
        } 

        break; 

BluetoothReceiver

public class BluetoothReceiver extends BroadcastReceiver { 

private MainActivity ma; 
private String pairedDevice; 


public void onReceive(Context context, Intent intent) { 


    Toast.makeText(context, "Receieved", Toast.LENGTH_LONG).show(); 
    String action = intent.getAction(); 

    pairedDevice = intent.getStringExtra("btDeviceName"); 
    Toast.makeText(context, pairedDevice + "2", Toast.LENGTH_LONG).show(); 

    final BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 


    if (BluetoothDevice.ACTION_ACL_CONNECTED.equals(action)) { 
     Toast.makeText(context, "Bluetooth Connected", Toast.LENGTH_LONG).show(); 


     if (device.getName().equals(pairedDevice)) { 
      Toast.makeText(context, device.getName() + " 1", Toast.LENGTH_LONG).show(); 
     } 


    } else if (BluetoothDevice.ACTION_ACL_DISCONNECTED.equals(action)) { 
     Toast.makeText(context, "Bluetooth Disconnected", Toast.LENGTH_LONG).show(); 
    } 


} 

}

Antwort

1

Ein IntentFilter können mehrere Aktionen haben. Beginnen Sie also damit, einen eigenen benutzerdefinierten Aktionsnamen zu erstellen, auf den Sie achten und ihn zur blueToothFilter hinzufügen können.

blueToothFilter.addAction("my.custom.action"); 

Sobald Sie den bluetoothBroadcast Empfänger mit diesem IntentFilter registrieren wird es jetzt erhalten Anrufe für beide Aktionen. Fügen Sie eine weitere Bedingung in onReceive hinzu, um Ihre neue benutzerdefinierte Aktion zu verarbeiten.

Schließlich in Ihrem Activity senden Sie eine Sendung mit Ihrer benutzerdefinierten Aktion und den Gerätenamen, wenn Sie fertig sind.

Intent intent = new Intent() 
     .setAction("my.custom.action") 
     .putExtra("btDeviceName", mPairedBluetoothDevice); 

sendBroadcast(intent); 

UPDATE

Ich verstehe jetzt, dass Sie beide zu onReceive() die BluetoothDevice device und String pairedDevice in einem einzigen Aufruf möchten. Dies ist nicht möglich, da diese Variablen aus separaten Aktionen stammen und jede Aktion onReceive() einmal aufruft.

Um dies zu beheben, können Sie die BluetoothReceiver zu einer inneren Klasse Ihrer Activity ändern, so dass Sie einen Verweis auf die Daten, die Sie dort benötigen, behalten können.

+0

Vielen Dank. Ich bin immer noch ein wenig verwirrt darüber, wie das im Broadcast-Empfänger aussieht. –

+0

Wie unterscheide ich die beiden Aktionen im Empfänger? –

+0

Sie überprüfen, was von 'intent.getAction()' zurückgegeben wird. Im Moment haben Sie zwei Fälle, einen für 'BluetoothDevice.ACTION_ACL_DISCONNECTED' und einen weiteren für' BluetoothDevice.ACTION_ACL_CONNECTED'. Sie müssen eine dritte hinzufügen, die nach dem Namen Ihrer benutzerdefinierten Aktion sucht, unabhängig davon, wie Sie sie aufrufen möchten (in meinem Beispiel die 'my.custom.action'). Wenn das die Aktion ist, dann wissen Sie, dass die Absicht den Zusatz "btDeviceName" enthält. –

Verwandte Themen