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.
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();
}
}
}