2013-04-12 284 views
1

我试图通过蓝牙从我的设备之一获取数据到另一个设备。通过蓝牙以编程方式连接两个Android设备

我以前试图从android网站运行bluetoothChat示例代码,但没有成功。

我现在已经转移到了我已经找到的这一小段代码,尽管它在我的设备上进行了编译,但它们并未互相连接。

任何人看到下面这段代码有什么问题吗?如果有人可能知道在Android上的一些好的蓝牙资源,我会很感激,如果他们会与我分享他们!

package com.example.bluetooth; 

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

import android.app.Activity; 
import android.bluetooth.BluetoothAdapter; 
import android.bluetooth.BluetoothDevice; 
import android.bluetooth.BluetoothSocket; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.os.Bundle; 
import android.os.Handler; 
import android.os.Message; 
import android.util.Log; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.AdapterView.OnItemClickListener; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 
import android.widget.Toast; 

public class MainActivity extends Activity implements OnItemClickListener { 

ArrayAdapter<String> listAdapter; 
ListView listView; 
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) { 
     // TODO Auto-generated method stub 
     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(), "CONNECT", Toast.LENGTH_SHORT).show(); 
      String s = "successfully connected"; 
      connectedThread.write(s.getBytes()); 
      Log.i(tag, "connected"); 
      break; 
     case MESSAGE_READ: 
      byte[] readBuf = (byte[])msg.obj; 
      String string = new String(readBuf); 
      Toast.makeText(getApplicationContext(), string, 0).show(); 
      break; 
     } 
    } 
}; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    init(); 
    if(btAdapter==null){ 
     Toast.makeText(getApplicationContext(), "No bluetooth detected", 0).show(); 
     finish(); 
    } 
    else{ 
     if(!btAdapter.isEnabled()){ 
      turnOnBT(); 
     } 

     getPairedDevices(); 
     startDiscovery();// 
    } 


} 

public void resumeDiscovery(View view){ 
    btAdapter.cancelDiscovery(); 
    btAdapter.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 
    listView=(ListView)findViewById(R.id.listView); 
    listView.setOnItemClickListener(this); 
    listAdapter= new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,0); 
    listView.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 onPause() { 
    // TODO Auto-generated method stub 
    super.onPause(); 
    unregisterReceiver(receiver); 
} 

    @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 
     BluetoothDevice selectedDevice = devices.get(arg2); 
     if(btAdapter.isDiscovering()){ 
      btAdapter.cancelDiscovery(); 
     } 
     if(listAdapter.getItem(arg2).contains("Paired")){ 


      ConnectThread connect = new ConnectThread(selectedDevice); 
      connect.start(); 
      Log.i(tag, "in click listener"); 
     } 
     else{ 
      Toast.makeText(getApplicationContext(), "pairing", 0).show(); 
      //pair device 
     } 
    } 

    private class ConnectThread extends Thread { 

     private final BluetoothSocket mmSocket; 
     private final BluetoothDevice mmDevice; 

     public ConnectThread(BluetoothDevice device) { 
      // Use a temporary object that is later assigned to mmSocket, 
      // because mmSocket is final 

      BluetoothSocket tmp = null; 
      mmDevice = device; 
      Log.i(tag, "construct"); 
      // Get a BluetoothSocket to connect with the given BluetoothDevice 
      try { 
       // MY_UUID is the app's UUID string, also used by the server code 
       tmp = device.createRfcommSocketToServiceRecord(MY_UUID); 
      } catch (IOException e) { 
       Log.i(tag, "get socket failed"); 

      } 
      mmSocket = tmp; 
     } 



     public void run() { 
      // Cancel discovery because it will slow down the connection 
      btAdapter.cancelDiscovery(); 
      Log.i(tag, "connect - run"); 

      try { 
       // Connect the device through the socket. This will block 
       // until it succeeds or throws an exception 
       mmSocket.connect(); 
       Log.i(tag, "connect - succeeded"); 
      } catch (IOException connectException) { Log.i(tag, "connect failed"); 
       // Unable to connect; close the socket and get out 
       try { 
        mmSocket.close(); 
       } catch (IOException closeException) { } 
       return; 
      } 

      // Do work to manage the connection (in a separate thread) 

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



     /** Will cancel an in-progress connection, and close the socket */ 
     public void cancel() { 
      try { 
       mmSocket.close(); 
      } catch (IOException e) { } 
     } 
    } 

    private 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; 

      // Get the input and output streams, using temp objects because 
      // member streams are final 
      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(); 

       } 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) { } 
     } 
    } 
} 
+0

你能指定哪2个设备你试图连接? – Kiran

回答

0

的问题是在你的初始化与您的onCreate()方法,并在onPause这个活动()你已经注销了的BroadcastReceiver注册的BroadcastReceiver()方法。

尝试注册它在你的的onResume()方法,这样就可以收到 广播每当你恢复到这项活动。

相关问题