2017-05-17 1 views
0

Ich habe Probleme mit der Weitergabe der Daten (Daten senden) über die Bluetooth-Buchse von einer anderen Aktivität außerhalb der Bluetooth-Aktivität. Ich habe mehrere Klassen, die ich ausführen muss, einen Befehl, um eine Zeichenfolge über Bluetooth zu senden.Wie sende ich Bluetooth-Daten von einer anderen Aktivität außerhalb der Bluetooth-Klasse

Alles funktioniert gut aus der Bluetooth-Klasse.

Hier ist die Bluetooth-Klasse

public class BTadapter extends Activity implements OnItemClickListener { 

    ArrayAdapter<String> listAdapter; 
    ListView btlistView; 
    BluetoothAdapter btAdapter; 
    Set<BluetoothDevice> devicesArray; 
    ArrayList<String> pairedDevices; 
    ArrayList<BluetoothDevice> devices; 
    public static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); 
    protected static final int SUCCESS_CONNECT = 0; 
    protected static final int MESSAGE_READ = 1; 
    IntentFilter filter; 
    BroadcastReceiver receiver; 
    String tag = "debugging"; 
    Handler mHandler = new Handler(){ 

     @Override 
     public void handleMessage(Message msg) { 
      Log.i(tag, "in handler"); 
      super.handleMessage(msg); 
      switch(msg.what){ 
       case SUCCESS_CONNECT: 
        // DO something 
        ConnectedThread connectedThread = new ConnectedThread((BluetoothSocket)msg.obj); 
        Toast.makeText(getApplicationContext(), "CONNECTED TO ELD", Toast.LENGTH_LONG).show(); 


        String s = "8"; 
        connectedThread.write(s.getBytes()); 
        s = System.getProperty("line.separator"); 
        connectedThread.write(s.getBytes()); 
        Log.i(tag, "Good Connection"); 


        ConnectedThread btThread = new ConnectedThread((BluetoothSocket)msg.obj);connectedThread.start(); 

        finish(); 
        break; 
       case MESSAGE_READ: 
        Log.i(tag, "Message Receive POP"); 
        byte[] readBuf = (byte[])msg.obj; 
        String string = new String(readBuf); 
        Toast.makeText(getApplicationContext(), string, Toast.LENGTH_LONG).show(); 
        break; 

      } 
     } 
    }; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.btadapter); 
     init(); 
     if(btAdapter==null){ 
      Toast.makeText(getApplicationContext(), "No bluetooth detected", Toast.LENGTH_LONG).show(); 
      finish(); 
     } 
     else{ 
      if(!btAdapter.isEnabled()){ 
       turnOnBT(); 
      } 

      getPairedDevices(); 
      startDiscovery(); 
     } 


    } 
    private void startDiscovery() { 
     // TODO Auto-generated method stub 
     btAdapter.cancelDiscovery(); 
     btAdapter.startDiscovery(); 

    } 
    private void turnOnBT() { 
     // TODO Auto-generated method stub 
     Intent intent =new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); 
     startActivityForResult(intent, 1); 
    } 
    private void getPairedDevices() { 
     // TODO Auto-generated method stub 
     devicesArray = btAdapter.getBondedDevices(); 
     if(devicesArray.size()>0){ 
      for(BluetoothDevice device:devicesArray){ 
       pairedDevices.add(device.getName()); 

      } 
     } 
    } 
    private void init() { 
     // TODO Auto-generated method stub 
     btlistView=(ListView)findViewById(R.id.btlistView); 
     btlistView.setOnItemClickListener(this); 
     listAdapter= new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,0); 
     btlistView.setAdapter(listAdapter); 
     btAdapter = BluetoothAdapter.getDefaultAdapter(); 
     pairedDevices = new ArrayList<String>(); 
     filter = new IntentFilter(BluetoothDevice.ACTION_FOUND); 
     devices = new ArrayList<BluetoothDevice>(); 
     receiver = new BroadcastReceiver(){ 
      @Override 
      public void onReceive(Context context, Intent intent) { 
       // TODO Auto-generated method stub 
       String action = intent.getAction(); 

       if(BluetoothDevice.ACTION_FOUND.equals(action)){ 
        BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 
        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_DISCOVERY_STARTED.equals(action)){ 
        // run some code 
       } 
       else if(BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)){ 
        // run some code 



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

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     // TODO Auto-generated method stub 
     super.onActivityResult(requestCode, resultCode, data); 
     if(resultCode == RESULT_CANCELED){ 
      Toast.makeText(getApplicationContext(), "Bluetooth must be enabled to continue", Toast.LENGTH_SHORT).show(); 
      finish(); 
     } 
    } 
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { 
     // TODO Auto-generated method stub 

     if(btAdapter.isDiscovering()){ 
      btAdapter.cancelDiscovery(); 
     } 
     if(listAdapter.getItem(arg2).contains("Paired")){ 

      BluetoothDevice selectedDevice = devices.get(arg2); 
      ConnectThread connect = new ConnectThread(selectedDevice); 
      connect.start(); 
      Log.i(tag, "in click listener"); 
     } 
     else{ 
      Toast.makeText(getApplicationContext(), "device is not paired", Toast.LENGTH_LONG).show(); 
     } 
    } 
    public class ConnectThread extends Thread { 

     private final BluetoothSocket mmSocket; 
     private final BluetoothDevice mmDevice; 

     public ConnectThread(BluetoothDevice device) { 
      BluetoothSocket tmp = null; 
      mmDevice = device; 
      Log.i(tag, "construct"); 
      try { 
       tmp = device.createRfcommSocketToServiceRecord(MY_UUID); 
      } catch (IOException e) { 
       Log.i(tag, "get socket failed"); 

      } 
      mmSocket = tmp; 
     } 

     public void run() { 
      btAdapter.cancelDiscovery(); 
      Log.i(tag, "connect - run"); 
      try { 
       mmSocket.connect(); 
       Log.i(tag, "connect - succeeded"); 
      } catch (IOException connectException) { Log.i(tag, "connect failed"); 
       try { 
        mmSocket.close(); 
       } catch (IOException closeException) { } 
       return; 
      } 

      mHandler.obtainMessage(SUCCESS_CONNECT, mmSocket).sendToTarget(); 
     } 

     public void cancel() { 
      try { 
       mmSocket.close(); 
      } catch (IOException e) { } 
     } 
    } 
    public class ConnectedThread extends Thread { 
     private final BluetoothSocket mmSocket; 
     private final InputStream mmInStream; 
     private final OutputStream mmOutStream; 

     public ConnectedThread(BluetoothSocket socket) { 
      mmSocket = socket; 
      InputStream tmpIn = null; 
      OutputStream tmpOut = null; 
      try { 
       tmpIn = socket.getInputStream(); 
       tmpOut = socket.getOutputStream(); 
      } catch (IOException e) { } 

      mmInStream = tmpIn; 
      mmOutStream = tmpOut; 
     } 

     public void run() { 
      byte[] buffer; // buffer store for the stream 
      int bytes; // bytes returned from read() 

      // Keep listening to the InputStream until an exception occurs 
      while (true) { 
       try { 
        // Read from the InputStream 
        buffer = new byte[1024]; 
        bytes = mmInStream.read(buffer); 
        // Send the obtained bytes to the UI activity 
        mHandler.obtainMessage(MESSAGE_READ, bytes, -1, buffer) 
          .sendToTarget(); 
        Log.i(tag, "Message Received"); 
       } catch (IOException e) { 
        break; 
       } 
      } 
     } 

     /* Call this from the main activity to send data to the remote device */ 
     public void write(byte[] bytes) { 
      try { 
       mmOutStream.write(bytes); 
      } catch (IOException e) { } 
     } 

     /* Call this from the main activity to shutdown the connection */ 
     public void cancel() { 
      try { 
       mmSocket.close(); 
      } catch (IOException e) { } 
     } 
    } 

    public void BTwrite(String s){ 
     Log.i(Tag, "Sending over Bluetooth"); 
     sendThread.write(s.getBytes()); 
     s = System.getProperty("line.separator"); 
     sendThread.write(s.getBytes()); 
     Log.i(Tag, "Bluetooth write sent."); 

    } 

    public void onBackPressed() { 
     finish(); 
    } 
    public void onDestroy() { 
     super.onDestroy(); 
     finish(); 
    } 
} 

Hier wird der Anruf von Haupttätigkeit ist

BT.BTwrite("2"); 

ist hier der Fehler ich

java.lang.NullPointerException: Attempt to invoke virtual method 'void logit.dot.BTadapter$ConnectedThread.write(byte[])' on a null object reference 
                  at logit.dot.BTadapter.BTwrite(BTadapter.java:382) 
                  at logit.dot.Main.insert(Main.java:1016) 
                  at logit.dot.Main.access$4400(Main.java:54) 
                  at logit.dot.Main$13.onClick(Main.java:1233) 
                  at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:165) 
                  at android.os.Handler.dispatchMessage(Handler.java:111) 
                  at android.os.Looper.loop(Looper.java:194) 
                  at android.app.ActivityThread.main(ActivityThread.java:5576) 
                  at java.lang.reflect.Method.invoke(Native Method) 
                  at java.lang.reflect.Method.invoke(Method.java:372) 
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:955) 
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:750) 
+0

Entfernen Sie 'finish()' von Ihrer 'onActivityResult' Methode. Entfernen Sie eigentlich alle Instanzen von 'finish()' in Ihrem Code. Registrieren Sie auch alle Empfänger in den Methoden onResume() und onPause(), wenn die Empfänger eine Instanz einer Aktivität verwenden. –

+0

Ich habe dies getan und es hat das Problem nicht gelöst. Ich erhalte eine neue Fehlermeldung, wie in der Frage – Eddie

Antwort

-1

Versuchen erhalten die bluetoothSocket als zu machen statisches Objekt. So werden Sie es einmal initiieren und es wie MainActivity.bluetoothSocket nennen. Dann können Sie so arbeiten, wie Sie möchten, als hätten Sie ein gemeinsames Objekt zwischen den Klassen.

+0

angegeben. Ein statisches Socket-Objekt kann jedoch einen Speicherverlust verursachen –

Verwandte Themen