BluetoothChat - Nur ein Gerät findet das andere

  • BluetoothChat - Nur ein Gerät findet das andere

    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.

    Java-Quellcode

    1. public class MainActivity extends ListActivity {
    2. public final String TAG = "MainActivity";
    3. //public final static String UUID = "3606f360-e4df-11e0-9572-0800200c9a66";
    4. public final static String UUID = "660b5af0-3328-4c95-851f-74c851032293";
    5. BluetoothAdapter bluetoothAdapter;
    6. BroadcastReceiver discoverDevicesReceiver;
    7. BroadcastReceiver discoveryFinishedReceiver;
    8. //-----Alle erkannten Geräte speichern----
    9. ArrayList<BluetoothDevice> discoveredDevices;
    10. ArrayList<String> discoveredDevicesNames;
    11. static TextView txtData;
    12. EditText txtMessage;
    13. //-----Thread für die Ausführung des Server-Sockets----
    14. ServerThread serverThread;
    15. //----Thread für die Verbindung mit dem Client-Socket----
    16. ConnectToServerThread connectToServerThread;
    17. @Override
    18. protected void onCreate(Bundle savedInstanceState) {
    19. super.onCreate(savedInstanceState);
    20. setContentView(R.layout.activity_main);
    21. //---Initialisieren Sie die ArrayList-Objekte und den Bluetooth Adapter----
    22. discoveredDevices = new ArrayList<BluetoothDevice>(); //Enthält die gefundenen Geräte
    23. discoveredDevicesNames = new ArrayList<String>(); //Enthält die Namen der gefundenen Geräte
    24. bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
    25. //----Für die Anzeige der empfangenen Nachrichten---
    26. txtData = (TextView) findViewById(R.id.txtData);
    27. txtMessage = (EditText) findViewById(R.id.txtMessage);
    28. }
    29. //Macht das Gerät 300 Sekunden erkennbar für andere Geräte. Direkt als OnClick aufruf.
    30. public void MakeDiscoverable(View view){
    31. Intent i = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
    32. i.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);
    33. startActivity(i);
    34. }
    35. //---Andere Geräte erkennen----. Direkt als OnClick aufruf.
    36. public void DiscoverDevices(View view){
    37. DiscoveringDevices();
    38. }
    39. //---Wird verwendet, um andere Bluetooth-Geräte zu erkennen
    40. private void DiscoveringDevices(){
    41. Log.d(TAG, " Starte das Erkennen");
    42. if(discoverDevicesReceiver == null){
    43. Log.d(TAG, " Befor onReceive");
    44. discoverDevicesReceiver = new BroadcastReceiver() {
    45. //----Wird ausgelöst, wenn ein neues Gerät erkannt wurde----
    46. @Override
    47. public void onReceive(Context context, Intent intent) {
    48. Log.d(TAG, "In onReceive");
    49. String action = intent.getAction();
    50. //---Ein Gerät wurde erkannt----
    51. if(BluetoothDevice.ACTION_FOUND.equals(action)){
    52. //----Das BluetoothDevice-Objekt vom intent erhalten
    53. BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
    54. //----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.
    55. if(!discoveredDevices.contains(device)){
    56. Log.d(TAG, "Will Gerät hinzufügen");
    57. Toast.makeText(getBaseContext(), "Will Gerät hinzufügen.", Toast.LENGTH_SHORT).show();
    58. //----Gerät Hinzüfügen----
    59. discoveredDevices.add(device);
    60. //---Den Namen des Geräts hinzufügen; wird für die ListView verwendet
    61. discoveredDevicesNames.add(device.getName());
    62. //TODO hier liste an ListView übergeben
    63. //----Die Elemente der Listview anzeigen----
    64. setListAdapter(new ArrayAdapter<String>(getBaseContext(), android.R.layout.simple_list_item_1, discoveredDevicesNames));
    65. }
    66. }
    67. }
    68. };
    69. }
    70. if(discoveryFinishedReceiver == null){
    71. Log.d(TAG, "Erkennung abgeschlossen drin");
    72. discoveryFinishedReceiver = new BroadcastReceiver() {
    73. //-----Auslösen, wenn das Erkennen abgeschlossen ist.
    74. @Override
    75. public void onReceive(Context context, Intent intent) {
    76. Log.d(TAG, "onReceive von erkennung abgeschlossen");
    77. //---Aktiviert die Listview, wenn das Erkennen abgeschlossen ist: für ungefähr 12 Sekunden----
    78. getListView().setEnabled(true);
    79. Toast.makeText(getBaseContext(), "Erkennung abgeschlossen. Wählen Sie ein Gerät um Chatten zu beginnen.", Toast.LENGTH_LONG).show();
    80. unregisterReceiver(discoveryFinishedReceiver);
    81. }
    82. };
    83. }
    84. //----Den Broadcast-Receiver registrieren----
    85. IntentFilter filter1 = new IntentFilter(BluetoothDevice.ACTION_FOUND);
    86. IntentFilter filter2 = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
    87. registerReceiver(discoverDevicesReceiver, filter1);
    88. registerReceiver(discoveryFinishedReceiver, filter2);
    89. //---Die ListView deaktivieren, wenn der Erkennungsvorgang läuft---
    90. Log.d(TAG, "Erkennung läuft");
    91. getListView().setEnabled(false);
    92. Toast.makeText(getBaseContext(), "Der Erkennungsvorgang läuft. Bitte Warten...", Toast.LENGTH_LONG).show();
    93. bluetoothAdapter.startDiscovery();
    94. }
    95. //---Verwendet für eine Aktualisierung der UI in der Aktivität ---
    96. static Handler UIupdater = new Handler(){
    97. @Override
    98. public void handleMessage(Message msg){
    99. int numOfBytesReceived = msg.arg1;
    100. byte[] buffer = (byte[]) msg.obj;
    101. //---Wandelt den Inhalt des gesamten Byte-Array in einen String um----
    102. String strReceived = new String(buffer);
    103. //---Holt nur den gerade erhaltenen String heraus---
    104. strReceived = strReceived.substring(0, numOfBytesReceived);
    105. //---zeigt den empfangenen Text in der Textview an---
    106. txtData.setText(txtData.getText().toString() + strReceived);
    107. }
    108. };
    109. @Override
    110. public void onResume(){
    111. super.onResume();
    112. //---Den Socket-Server starten---
    113. serverThread = new ServerThread(bluetoothAdapter);
    114. serverThread.start();
    115. }
    116. @Override
    117. public void onPause(){
    118. super.onPause();
    119. //---Das Erkennen weiterer Bluetooth-Geräte abbrechen----
    120. bluetoothAdapter.cancelDiscovery();
    121. //----Den Broadcast-Receiver für das Erkennen von Geräten deregistrieren----
    122. if(discoverDevicesReceiver != null){
    123. try {
    124. unregisterReceiver(discoverDevicesReceiver);
    125. }catch (Exception e){
    126. }
    127. }
    128. //---Wenn sie Gerade mit jemandem verbunden sind...---
    129. if(connectToServerThread != null){
    130. try {
    131. //---beenden Sie die Verbindung---
    132. connectToServerThread.bluetoothSocket.close();
    133. }catch (IOException e){
    134. Log.d("MainActivity", e.getLocalizedMessage());
    135. }
    136. }
    137. //---Den laufendne Thread beenden----
    138. if(serverThread != null){
    139. serverThread.cancel();
    140. }
    141. }
    142. //---Wenn ein Client in der ListView angetippt wird----
    143. public void onListItemClick(ListView parent, View v, int position, long id){
    144. //---Wenn Sie breits mit jemandem reden.----
    145. if(connectToServerThread != null){
    146. try {
    147. //---schließen Sie zuerst die Verbindung----
    148. connectToServerThread.bluetoothSocket.close();
    149. }catch (IOException e ){
    150. Log.d("MainActivity", e.getLocalizedMessage());
    151. }
    152. }
    153. //----Mit dem ausgewählten Bluetooth-Gerät verbinden---
    154. BluetoothDevice deviceSelected = discoveredDevices.get(position);
    155. connectToServerThread = new ConnectToServerThread(deviceSelected, bluetoothAdapter);
    156. connectToServerThread.start();
    157. }
    158. private class WriteTask extends AsyncTask<String, Void, Void>{
    159. protected Void doInBackground(String... args){
    160. try {
    161. connectToServerThread.commsThread.write(args[0]);
    162. }catch (Exception e){
    163. Log.d("MainActivity", e.getLocalizedMessage());
    164. }
    165. return null;
    166. }
    167. }
    168. //---Eine Nachricht an den verbundenen Socket-Client senden----
    169. public void SendMessage(View view){
    170. if(connectToServerThread != null){
    171. new WriteTask().execute(txtMessage.getText().toString());
    172. } else {
    173. Toast.makeText(this, "Zuerst einen Client wählen.", Toast.LENGTH_SHORT).show();
    174. }
    175. }
    176. }
    Alles anzeigen
  • Genau die Geräte, möchte ich mit der Methode in Zeile 41 Sichtbar machen erstmal. Danach Suche ich mit der Methode in Zeile 48 bzw. 53 nach Geräten die Sichtbar sind. Alle Geräte die gefunden wurden, sollen ab Zeile 70 in einer Listview angezeigt werden. Nach dem der Suchvorgang abgeschlossen ist, wird die Listview freigegeben damit ein gefundenes Gerät in der Listview ausgewählt werden kann, womit man sich verbinden will. Und das soll mit der Methode in Zeile 178 stattfinden.

    Nur findet wird nur eines der beiden Geräte auch vom anderen gefunden. Es finden sich nicht beide Geräte gegenseitig.
  • Ein Feedback auf Tipps ist auch schön. :P

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von jogimuc ()

  • So jetzt stehe ich aber vor folgendem Problem. Der Aufruf in Zeile 20 erwartet einen zweiten Parameter vom Typ int. Aber was genau erwartet er da?

    Java-Quellcode

    1. @TargetApi(Build.VERSION_CODES.M)
    2. private void accessLocationPermission() {
    3. int BuildVersion = Integer.valueOf(Build.VERSION.SDK_INT);
    4. if(BuildVersion > 22) {
    5. int accessCoarseLocation = checkSelfPermission(android.Manifest.permission.ACCESS_COARSE_LOCATION);
    6. int accessFineLocation = checkSelfPermission(android.Manifest.permission.ACCESS_FINE_LOCATION);
    7. List<String> listRequestPermission = new ArrayList<String>();
    8. if (accessCoarseLocation != PackageManager.PERMISSION_GRANTED) {
    9. listRequestPermission.add(android.Manifest.permission.ACCESS_COARSE_LOCATION);
    10. }
    11. if (accessFineLocation != PackageManager.PERMISSION_GRANTED) {
    12. listRequestPermission.add(android.Manifest.permission.ACCESS_FINE_LOCATION);
    13. }
    14. if (!listRequestPermission.isEmpty()) {
    15. String[] strRequestPermission = listRequestPermission.toArray(new String[listRequestPermission.size()]);
    16. requestPermissions(strRequestPermission, HIER WIRD EIN INT ERWARTET);
    17. }
    18. }
    19. }
    Alles anzeigen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von omax1 ()

  • ich mache das so

    Quellcode

    1. final private int REQUEST_CODE_ASK_PERMISSION = 123;
    2. if(ContextCompat.checkSelfPermission(this, android.Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
    3. if(ActivityCompat.shouldShowRequestPermissionRationale(this,android.Manifest.permission.READ_EXTERNAL_STORAGE)){
    4. }else{
    5. ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.READ_EXTERNAL_STORAGE}, REQUEST_CODE_ASK_PERMISSION);
    6. }
    7. }
    8. int permissionCheck = ContextCompat.checkSelfPermission(this, android.Manifest.permission.READ_EXTERNAL_STORAGE);
    9. if(ContextCompat.checkSelfPermission(this, android.Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED){
    10. //hier dein Code
    11. }else {
    12. ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.READ_EXTERNAL_STORAGE}, permissionCheck);
    13. }
    Alles anzeigen
    Ein Feedback auf Tipps ist auch schön. :P