2016-04-28 16 views
0

Ich versuche, Daten über Bluetooth über ein Telefon zu empfangen, und ich verwende Android Studio, um dies zu versuchen. Das Problem ist, wenn ich einen Prozess ausführe, der auf eingehende Daten wartet, glaube ich, dass das Programm bei dem Prozess stoppt und wartet, den Rest des Programms nicht ausführen lässt. Ich glaube das, weil ich Toast so programmiert habe, dass direkt nach dem Aufruf der Methode "Data listen for" angezeigt wird, selbst wenn Daten gesendet werden. Ich entschuldige mich im Voraus, wenn die Frage einfach scheint, das ist meine erste App. Ich glaube, ich habe irgendwo gelesen, dass beginListenForData() auf einem anderen Profil laufen muss, um genau dieses Problem zu stoppen, ist es das? Wie gehe ich vor? HierJava Bluetooth Vorgehensweise im Hintergrund

ist der mainActivity Code:

package com.example.root.test2; 

import android.content.Intent; 
import android.os.Handler; 
import android.os.Message; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.bluetooth.*; 
import android.util.Log; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.ArrayAdapter; 
import android.widget.Button; 
import android.widget.ListView; 
import android.widget.TextView; 
import android.widget.Toast; 

import java.io.IOException; 
import java.io.InputStream; 
import java.util.ArrayList; 
import java.util.Set; 
import java.util.UUID; 

public class MainActivity extends AppCompatActivity { 

    private final int REQUEST_ENABLE_BT = 1; 
    private UUID MY_UUID = UUID.fromString("d095b825-4e33-42e8-a7d0-b22fee285386"); 
    ListView pairedDevicesW; 
    String info; 
    String info_MAC; 
    String info_Name; 
    private BluetoothSocket BTS; 
    private BluetoothDevice BTD; 
    private BluetoothAdapter BTA = BluetoothAdapter.getDefaultAdapter(); 
    Button B_Disconnect; 
    Button B_Send_Data; 
    boolean is_Receiving = true; 
    InputStream inStream; 
    volatile boolean stopWorker; 
    int readBufferPosition; 
    int counter; 
    byte[] readBuffer; 
    Thread workerThread; 
    String finalData; 

    void beginListenForData() { 
     final Handler handler = new Handler(); 
     final byte delimiter = 10; 

     stopWorker = false; 
     readBufferPosition = 0; 
     readBuffer = new byte[1024]; 
     workerThread = new Thread(new Runnable() 
     { 
      public void run() 
      { 
       while (!Thread.currentThread().isInterrupted() && !stopWorker) 
       { 
        try { 
         int bytesAvailable = inStream.available(); 
         if (bytesAvailable > 0) { 
          byte[] packetBytes = new byte[bytesAvailable]; 
          inStream.read(packetBytes); 
          for (int i = 0; i < bytesAvailable; i++) { 
           byte b = packetBytes[i]; 
           if (b == delimiter) { 
            byte[] encodedBytes = new byte[readBufferPosition]; 
            System.arraycopy(readBuffer, 0, encodedBytes, 0, encodedBytes.length); 
            final String data = new String(encodedBytes, "US-ASCII"); 
            readBufferPosition = 0; 
            handler.post(new Runnable() { 
             @Override 
             public void run() { 
              finalData = data; 
             } 
            }); 
           } 
           else { 
            readBuffer[readBufferPosition++] = b; 
           } 
          } 
         } 
        } catch (IOException e) { 
         Log.d("TAG", e.toString()); 
         stopWorker = true; 
        } catch (NullPointerException z) { 
         Log.d("TAG", z.toString()); 
         stopWorker = true; 
        } 
       } 
      } 
     }); 

     workerThread.start(); 
    } 


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

     ArrayList<String> pairedDevicesA= new ArrayList<String>(); 
     ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, pairedDevicesA); 
     pairedDevicesW = (ListView)findViewById(R.id.PDL); 
     B_Disconnect = (Button)findViewById(R.id.B_Disconnect); 
     B_Send_Data = (Button)findViewById(R.id.B_Send_Data); 

     if (BTA == null) { 
      Toast.makeText(getApplication().getBaseContext(), "Bluetooth not supported", Toast.LENGTH_SHORT).show(); 
     } 

     if (!BTA.isEnabled()) { 
      Intent enableBTIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); 
      startActivityForResult(enableBTIntent, REQUEST_ENABLE_BT); 
     } 

     final Set<BluetoothDevice> pairedDevices = BTA.getBondedDevices(); 
     if (pairedDevices.size() > 0) { 
      for (BluetoothDevice BTDevice : pairedDevices) { 
       pairedDevicesA.add(BTDevice.getAddress() + "\n" + BTDevice.getName()); 
      } 
     } 
     pairedDevicesW.setAdapter(adapter); 

     pairedDevicesW.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 
       info = ((TextView)view).getText().toString(); 
       info_MAC = info.substring(0, 17); 
       info_Name = info.substring(18); 

       Toast.makeText(getBaseContext(), "Onclicklistenerstarted", Toast.LENGTH_SHORT).show(); 

       for (BluetoothDevice BTDevice : pairedDevices) { 
        if (BTDevice.getAddress().equals(info_MAC)) { 
         BTD = BTDevice; 
        } 
       } 

       Toast.makeText(getBaseContext(), "BTD set", Toast.LENGTH_SHORT).show(); 

       BluetoothSocket temp = null; 
       try { 
        temp = BTD.createRfcommSocketToServiceRecord(MY_UUID); 
       } catch (IOException e) { 
        Log.d("CONNECTTHREAD", "Could not create socket; " + e.toString()); 
       } catch (NullPointerException z) { 
        Log.d("CONNECTTREAD", z.toString()); 
       } 
       BTS = temp; 

       Toast.makeText(getBaseContext(), "Socket set", Toast.LENGTH_SHORT).show(); 

       if (BTS != null) { 
        Toast.makeText(getBaseContext(), "Socket not null", Toast.LENGTH_SHORT).show(); 
        try { 
         BTS.connect(); 
         Toast.makeText(getBaseContext(), "Connection Finally Fucking Made", Toast.LENGTH_SHORT).show(); 
        } catch (IOException e) { 
         Log.d("CONNECTTHREAD", "Could not connect; " + e.toString()); 
         try { 
          BTS.close(); 
          Toast.makeText(getBaseContext(), "Connection prematurely closed", Toast.LENGTH_SHORT).show(); 
         } catch (IOException close) { 
          Log.d("CONNECTTHREAD", "Could not close connection; " + close.toString()); 
         } 
        } 
        Toast.makeText(getBaseContext(), "Loop complete", Toast.LENGTH_SHORT).show(); 
       } 
      } 
     }); 



     InputStream tmpIn = null; 
     try { 
      tmpIn = BTS.getInputStream(); 
     } catch (IOException e) { 
      Log.d("INPUTSTREAM", e.toString()); 
     } catch (NullPointerException z) { 
      Log.d("NPE", z.toString()); 
     } 
     inStream = tmpIn; 
     Toast.makeText(getBaseContext(), "Input Stream Made", Toast.LENGTH_SHORT).show(); 

     while (is_Receiving) { 

      beginListenForData(); 

      Toast.makeText(getBaseContext(), "Data listened for", Toast.LENGTH_SHORT).show(); 

      if (finalData != "") { 
       Toast.makeText(getBaseContext(), "Data not null", Toast.LENGTH_SHORT).show(); 
       try { 
        Toast.makeText(getBaseContext(), finalData.toString(), Toast.LENGTH_SHORT).show(); 
       } catch (NullPointerException e) { 
       } 
      } else { 
       Toast.makeText(getBaseContext(), "No Data", Toast.LENGTH_SHORT).show(); 
      } 

      B_Disconnect.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View view) { 
        try { 
         BTS.close(); 
         Toast.makeText(getBaseContext(), "Connection Closed", Toast.LENGTH_SHORT).show(); 
        } catch (IOException e) {} 
        is_Receiving = false; 
       } 
      }); 
      is_Receiving = false; 
     } 
    } 
} 

Antwort