2016-07-27 9 views
0

ich diese App für api Ebene bin der Gestaltung 2.2android Bluetooth Pairing-Anfrage und warten auf Erfolg

ich mit einem verfügbaren Bluetooth-Gerät koppeln möchten und dann den Laufenden hören, ich das getan haben, durch die folgende Weise:

Hier enthält listView alle verfügbaren Geräte, listAdapter ist ein ArrayAdapter, der den verfügbaren Gerätenamen enthält und für das Gerätepaar concate "(Paired)" mit dem Gerätenamen. Sie können deutlich sehen, dass ich eine neue Aktivität öffnen möchte, wenn das Gerät bereits gepaart hat und, falls nicht, dann den Pairing-Prozess initiiert. Jetzt ist das Problem, dass pairDevice() ein Multithread-Prozess ist, der bedeutet, dass nicht gewartet wird, bis die Paarung abgeschlossen ist. Ich möchte hören, ob die Kopplung abgeschlossen ist oder nicht, nachdem diese neue Aktivität geöffnet werden soll. Zur besseren Verdeutlichung ich vollständigen Code bin Entsendung:

public class MyBluetoothScanActivity extends AppCompatActivity{ 


Button bt,bt_count; 
ListView listView; 
BluetoothAdapter btAdapter; 
Set<BluetoothDevice> devicesArray; 
public static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); 
IntentFilter filter; 
BroadcastReceiver receiver; 
ArrayAdapter<String> listAdapter; 
ArrayList<String> pairedDevices; 
ArrayList<BluetoothDevice> devices; 

int count=0; 


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

    bt=(Button) findViewById(R.id.bT_scan2); 
    bt.setTransformationMethod(null); 

    bt_count=(Button) findViewById(R.id.bt_count); 
    bt_count.setTransformationMethod(null); 

    bt_count.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Toast.makeText(getBaseContext(),"Count: "+count,Toast.LENGTH_SHORT).show(); 
     } 
    }); 




    listView=(ListView) findViewById(R.id.listViewscan); 

    btAdapter = BluetoothAdapter.getDefaultAdapter(); 
    filter = new IntentFilter(BluetoothDevice.ACTION_FOUND); 

    if(!btAdapter.isEnabled()){ 
     turnOnBT(); 
    } 


    init(); 

    bt.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      newScan(); 
     } 
    }); 


    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 
      if(btAdapter.isDiscovering()){ 
       btAdapter.cancelDiscovery(); 
      } 
      if(!listAdapter.getItem(i).contains("Paired")){ 
       try { 
        BluetoothDevice selectedDevice = devices.get(i); 
        pairDevice(selectedDevice); 
        Intent intent=new Intent(getBaseContext(),ConnectedBtActivity.class); 
        intent.putExtra("MAC",selectedDevice.getAddress()); 
        startActivity(intent); 
       } 
       catch (Exception e){} 
      } 
      else{ 
       BluetoothDevice selectedDevice = devices.get(i); 
       Intent intent=new Intent(getBaseContext(),ConnectedBtActivity.class); 
       intent.putExtra("MAC",selectedDevice.getAddress()); 
       startActivity(intent); 
      } 
     } 
    }); 
} 

private void newScan(){ 
    btAdapter.cancelDiscovery(); 
    Toast.makeText(getBaseContext(),"New Scan Start",Toast.LENGTH_SHORT).show(); 

    listAdapter= new ArrayAdapter<String>(getBaseContext(), android.R.layout.simple_list_item_1,0); 
    listView.setAdapter(listAdapter); 

    devices = new ArrayList<BluetoothDevice>(); 
    btAdapter.startDiscovery(); 
} 
private void getPairedDevices() { 
    devicesArray = btAdapter.getBondedDevices(); 
    if(devicesArray.size()>0){ 
     for(BluetoothDevice device:devicesArray){ 
      pairedDevices.add(device.getName()); 

     } 
    } 
} 

void turnOnBT(){ 
    Intent intent =new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); 
    startActivity(intent); 
} 

void init(){ 

    receiver = new BroadcastReceiver(){ 
     @Override 
     public void onReceive(Context context, Intent intent) { 

      String action = intent.getAction(); 

      Toast.makeText(getBaseContext(),"new br: "+action,Toast.LENGTH_LONG).show(); 

      if(BluetoothDevice.ACTION_FOUND.equals(action)){ 

       pairedDevices=new ArrayList<String>(); 
       getPairedDevices(); 
       BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 

       Toast.makeText(getBaseContext(),"Dev: "+device.getName(),Toast.LENGTH_LONG).show(); 
       devices.add(device); 
       String s = ""; 
       for(int a = 0; a < pairedDevices.size(); a++){ 
        if(device.getName().equals(pairedDevices.get(a))){ 
         //append 
         s = "(Paired)"; 
         break; 
        } 
       } 

       listAdapter.add(device.getName()+" "+s+" "+"\n"+device.getAddress()); 

      } 
      else if(BluetoothAdapter.ACTION_STATE_CHANGED.equals(action)){ 
       if(btAdapter.getState() == btAdapter.STATE_OFF){ 
        turnOnBT(); 
       } 
      } 

     } 
    }; 

    registerReceiver(receiver, filter); 
    filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_STARTED); 
    registerReceiver(receiver, filter); 
    filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED); 
    registerReceiver(receiver, filter); 
    filter = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED); 
    registerReceiver(receiver, filter); 

} 

private void pairDevice(BluetoothDevice device) { 
    try { 
     Method m = device.getClass().getMethod("createBond", (Class[]) null); 
     m.invoke(device, (Object[]) null); 
    } catch (Exception e) { 
     Toast.makeText(getBaseContext(),"Exception: "+e.getMessage(),Toast.LENGTH_LONG).show(); 
    } 
} 

@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    try { 
     Toast.makeText(getBaseContext(),"Un registration",Toast.LENGTH_SHORT).show(); 
     unregisterReceiver(receiver); 
    } 
    catch (Exception e){} 
} 

}

Antwort

0

Sie können auch für Broadcast ACTION_BOND_STATE_CHANGED registrieren und überprüfen Sie die zusätzlichen Felder das Ergebnis des Verbindungsprozesses zu überprüfen.

+0

gibt es nichts wie "ACTION_BOND_STATE_CHANGED" –

+0

Basierend auf der offiziellen Dokumentation gibt es diese Broadcast-Aktion seit API LEVEL 5 so versuchen Sie es. Es funktioniert für mich, wenn ich eine BroadcastReceiver-Komponente erstelle, die auf ** android.bluetooth.device.action.BOND_STATE_CHANGED ** wartet. – hertigaah