[OFFEN] BluetoothChat - Nur ein Gerät findet das andere

  • 0 Antworten
  • Letztes Antwortdatum
O

omax1

Neues Mitglied
0
Hallo,

ich bin dabei, eine Bluetooth Chat Anwendung zu schreiben. Ich stehe jetzt aber vor folgendem Problem. Habe zwei Geräte vor mir liegen. Gerät 1 findet Gerät 2, kann sich aber nicht verbinden. Gerät 2 findet Gerät 1 aber nicht.
Ablauf in der App:
1. Auf beiden Geräten auf Sichtbar stellen. Code Zeile 41
2. Auf beiden Geräten nach anderen Geräten Suchen. Code Zeile 48. Ruft dann die Methode in Zeile 53 auf
Jetzt findet Gerät 1 andere Geräte und geht in Zeile 65.
Gerät 2 findet aber gar nix und geht dadurch nicht in Zeile 65.

viele grüße

Ich hoffe habe alle wichtigen Punkte genannt, sonst einfach Fragen.

Code:
public class MainActivity extends ListActivity {
    public final String TAG = "MainActivity";
    //public final static String UUID = "3606f360-e4df-11e0-9572-0800200c9a66";
    public final static String UUID = "660b5af0-3328-4c95-851f-74c851032293";
    BluetoothAdapter bluetoothAdapter;
    BroadcastReceiver discoverDevicesReceiver;
    BroadcastReceiver discoveryFinishedReceiver;



    //-----Alle erkannten Geräte speichern----
    ArrayList<BluetoothDevice> discoveredDevices;
    ArrayList<String> discoveredDevicesNames;
    static TextView txtData;
    EditText txtMessage;

    //-----Thread für die Ausführung des Server-Sockets----
    ServerThread serverThread;

    //----Thread für die Verbindung mit dem Client-Socket----
    ConnectToServerThread connectToServerThread;


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

        //---Initialisieren Sie die ArrayList-Objekte und den Bluetooth Adapter----
        discoveredDevices = new ArrayList<BluetoothDevice>();           //Enthält die gefundenen Geräte
        discoveredDevicesNames = new ArrayList<String>();               //Enthält die Namen der gefundenen Geräte
        bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();

        //----Für die Anzeige der empfangenen Nachrichten---
        txtData = (TextView) findViewById(R.id.txtData);
        txtMessage = (EditText) findViewById(R.id.txtMessage);

    }

    //Macht das Gerät 300 Sekunden erkennbar für andere Geräte. Direkt als OnClick aufruf.
    public void MakeDiscoverable(View view){
        Intent i = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
        i.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);
        startActivity(i);
    }

    //---Andere Geräte erkennen----. Direkt als OnClick aufruf.
    public void DiscoverDevices(View view){
        DiscoveringDevices();
    }

    //---Wird verwendet, um andere Bluetooth-Geräte zu erkennen
    private void DiscoveringDevices(){
        Log.d(TAG, " Starte das Erkennen");
        if(discoverDevicesReceiver == null){
            Log.d(TAG, " Befor onReceive");
            discoverDevicesReceiver = new BroadcastReceiver() {
                //----Wird ausgelöst, wenn ein neues Gerät erkannt wurde----
                @Override
                public void onReceive(Context context, Intent intent) {
                    Log.d(TAG, "In onReceive");
                    String action = intent.getAction();

                    //---Ein Gerät wurde erkannt----
                    if(BluetoothDevice.ACTION_FOUND.equals(action)){
                        //----Das BluetoothDevice-Objekt vom intent erhalten
                        BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);

                        //----Einem Array-Adapter Namen und Adresse hinzufügen, um sie in einer Listview anzuzeigen. Nur hinzufügen wenn das Gerät noch nicht in der Liste aufgenommen wurde.
                        if(!discoveredDevices.contains(device)){
                            Log.d(TAG, "Will Gerät hinzufügen");
                            Toast.makeText(getBaseContext(), "Will Gerät hinzufügen.", Toast.LENGTH_SHORT).show();
                            //----Gerät Hinzüfügen----
                            discoveredDevices.add(device);

                            //---Den Namen des Geräts hinzufügen; wird für die ListView verwendet
                            discoveredDevicesNames.add(device.getName());

                            //TODO hier liste an ListView übergeben
                            //----Die Elemente der Listview anzeigen----
                            setListAdapter(new ArrayAdapter<String>(getBaseContext(), android.R.layout.simple_list_item_1, discoveredDevicesNames));
                        }
                    }
                }
            };
        }


        if(discoveryFinishedReceiver == null){
            Log.d(TAG, "Erkennung abgeschlossen drin");
            discoveryFinishedReceiver = new BroadcastReceiver() {
                //-----Auslösen, wenn das Erkennen abgeschlossen ist.
                @Override
                public void onReceive(Context context, Intent intent) {
                    Log.d(TAG, "onReceive von erkennung abgeschlossen");
                    //---Aktiviert die Listview, wenn das Erkennen abgeschlossen ist: für ungefähr 12 Sekunden----
                    getListView().setEnabled(true);
                    Toast.makeText(getBaseContext(), "Erkennung abgeschlossen. Wählen Sie ein Gerät um Chatten zu beginnen.", Toast.LENGTH_LONG).show();

                    unregisterReceiver(discoveryFinishedReceiver);
                }
            };

        }
        //----Den Broadcast-Receiver registrieren----
        IntentFilter filter1 = new IntentFilter(BluetoothDevice.ACTION_FOUND);
        IntentFilter filter2 = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);

        registerReceiver(discoverDevicesReceiver, filter1);
        registerReceiver(discoveryFinishedReceiver, filter2);

        //---Die ListView deaktivieren, wenn der Erkennungsvorgang läuft---
        Log.d(TAG, "Erkennung läuft");
        getListView().setEnabled(false);
        Toast.makeText(getBaseContext(), "Der Erkennungsvorgang läuft. Bitte Warten...", Toast.LENGTH_LONG).show();
        bluetoothAdapter.startDiscovery();
    }



    //---Verwendet für eine Aktualisierung der UI in der Aktivität ---
    static Handler UIupdater = new Handler(){
        @Override
        public void handleMessage(Message msg){
            int numOfBytesReceived = msg.arg1;
            byte[] buffer = (byte[]) msg.obj;
            //---Wandelt den Inhalt des gesamten Byte-Array in einen String um----
            String strReceived = new String(buffer);

            //---Holt nur den gerade erhaltenen String heraus---
            strReceived = strReceived.substring(0, numOfBytesReceived);

            //---zeigt den empfangenen Text in der Textview an---
            txtData.setText(txtData.getText().toString() + strReceived);
        }
    };


    @Override
    public void onResume(){
        super.onResume();
        //---Den Socket-Server starten---
        serverThread = new ServerThread(bluetoothAdapter);
        serverThread.start();
    }

    @Override
    public void onPause(){
        super.onPause();
        //---Das Erkennen weiterer Bluetooth-Geräte abbrechen----
        bluetoothAdapter.cancelDiscovery();

        //----Den Broadcast-Receiver für das Erkennen von Geräten deregistrieren----
        if(discoverDevicesReceiver != null){
            try {
                unregisterReceiver(discoverDevicesReceiver);
            }catch (Exception e){
            }
        }

        //---Wenn sie Gerade mit jemandem verbunden sind...---
        if(connectToServerThread != null){
            try {
                //---beenden Sie die Verbindung---
                connectToServerThread.bluetoothSocket.close();
            }catch (IOException e){
                Log.d("MainActivity", e.getLocalizedMessage());
            }
        }
        //---Den laufendne Thread beenden----
        if(serverThread != null){
            serverThread.cancel();
        }
    }


    //---Wenn ein Client in der ListView angetippt wird----
    public void onListItemClick(ListView parent, View v, int position, long id){
        //---Wenn Sie breits mit jemandem reden.----
        if(connectToServerThread != null){
            try {
                //---schließen Sie zuerst die Verbindung----
                connectToServerThread.bluetoothSocket.close();
            }catch (IOException e ){
                Log.d("MainActivity", e.getLocalizedMessage());
            }
        }

        //----Mit dem ausgewählten Bluetooth-Gerät verbinden---
        BluetoothDevice deviceSelected = discoveredDevices.get(position);
        connectToServerThread = new ConnectToServerThread(deviceSelected, bluetoothAdapter);

        connectToServerThread.start();
    }

    private class WriteTask extends AsyncTask<String, Void, Void>{
        protected Void doInBackground(String... args){
            try {
                connectToServerThread.commsThread.write(args[0]);

            }catch (Exception e){
                Log.d("MainActivity", e.getLocalizedMessage());
            }
            return null;
        }
    }

    //---Eine Nachricht an den verbundenen Socket-Client senden----
    public void SendMessage(View view){
        if(connectToServerThread != null){
            new WriteTask().execute(txtMessage.getText().toString());
        } else {
            Toast.makeText(this, "Zuerst einen Client wählen.", Toast.LENGTH_SHORT).show();
        }
    }
}
 
Zurück
Oben Unten