Android蓝牙连接到设备socket.connect()不会连接

时间:2013-05-19 14:19:27

标签: android multithreading sockets bluetooth

  

固定!!!

由于UUID而无法正常工作 从api15开始,你可以使用get函数来获取uuid

UID uuid = bluetoothDevice.getUuids()[0].getUuid(); 
BluetoothSocket socket = bluetoothDevice.createRfcommSocketToServiceRecord(uuid);
  

固定!!!

我正在尝试连接到devie以将数据写入其中。 我可以搜索设备,如果我单击连接线程启动,但不会调用“run()”函数。该程序停留在

现在我正在尝试连接蓝牙耳机。 我不知道我是否配对这两个设备?如果我使用手机的正常蓝牙,我将两个设备配对,如1 2 3 4,但在我的程序中你不必输入代码。你能帮帮我吗?

  

mmSocket.connect();

所以我的connectedthread()永远不会运行!

这是我的完整代码:

公共类MainActivity扩展了Activity {

private static final int REQUEST_ENABLE_BT = 1;
private BluetoothAdapter mBluetoothAdapter = null;
private ArrayAdapter<String> mNewDevicesArrayAdapter;
ListView newDevicesListView;
   // Return Intent extra
public static String EXTRA_DEVICE_ADDRESS = "device_address";
private ConnectingDevices mConnectingDevices = null;


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

    mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();

    newDevicesListView = (ListView)findViewById(R.id.new_devices);
    mNewDevicesArrayAdapter=new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1);
    newDevicesListView.setAdapter(mNewDevicesArrayAdapter);
    newDevicesListView.setOnItemClickListener(mDeviceClickListener);

    registerReceiver(mReceiver, new IntentFilter(BluetoothDevice.ACTION_FOUND));

    mConnectingDevices = new ConnectingDevices();

}

@Override
public boolean onCreateOptionsMenu(Menu menu) 
{
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

public void onClickbtnEtage1(View view)
{
mConnectingDevices.write(new byte[2]);
}


public void onClickbtnActivateBluetooth(View view)
{

      if (mBluetoothAdapter == null) 
      {
            Toast.makeText(this, "Bluetooth ist nicht verfügbar!", Toast.LENGTH_LONG).show();
            finish();
            return;
      }
      else if (!mBluetoothAdapter.isEnabled()) 
      {
            Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
            startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
      }
      Toast.makeText(this, "Bluetooth wurde aktiviert!", Toast.LENGTH_LONG).show();
      findViewById(R.id.btnSearchDevices).setEnabled(true);


}

public void onClickbtnSearchDevices(View view)
{
    mBluetoothAdapter.startDiscovery();
    Toast.makeText(this, "Bluetooth Geräte werden gesucht!", Toast.LENGTH_LONG).show();
      // Find and set up the ListView for newly discovered devices 
}

// Create a BroadcastReceiver for ACTION_FOUND
 private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();

            // When discovery finds a device
            if (BluetoothDevice.ACTION_FOUND.equals(action)) {
                // Get the BluetoothDevice object from the Intent
                BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                // If it's already paired, skip it, because it's been listed already
                if (device.getBondState() != BluetoothDevice.BOND_BONDED) 
                {
                    mNewDevicesArrayAdapter.add(device.getName() + "\n" + device.getAddress());
                    mNewDevicesArrayAdapter.notifyDataSetChanged();

                }


            }
        }
    };

    // The on-click listener for all devices in the ListViews
    private OnItemClickListener mDeviceClickListener = new OnItemClickListener() {
        public void onItemClick(AdapterView<?> av, View v, int arg2, long arg3) {
            // Cancel discovery because it's costly and we're about to connect
            mBluetoothAdapter.cancelDiscovery();

            // Get the device MAC address, which is the last 17 chars in the View
            String info = ((TextView) v).getText().toString();
            String address = info.substring(info.length() - 17);

            // Create the result Intent and include the MAC address
            Intent intent = new Intent();
            intent.putExtra(EXTRA_DEVICE_ADDRESS, address);
            // Set result and finish this Activity
        //    setResult(Activity.RESULT_OK, intent);
          // finish();



                address = intent.getExtras().getString(EXTRA_DEVICE_ADDRESS);
                // Get the BLuetoothDevice object
                BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address);
                // Attempt to connect to the device
                mConnectingDevices.connect(device);


        }

    };}

和我的连接设备类

        public class ConnectingDevices {

boolean bconnectedthread = false;
boolean bconnectthread = false;
boolean bconnectedthreadstart = false;
boolean bconnectthreadstart = false;
boolean brun=false;
boolean bconnectedsynchronized=false;
//00001108-0000-1000-8000-00805F9B34FB
    private BluetoothAdapter mBluetoothAdapter = null;
    private static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
    private ConnectedThread mConnectedThread;
    //private final Handler mHandler;
    private ConnectThread mConnectThread;

    public void write(byte[] out) {
        boolean a=bconnectedthread;
        boolean b=bconnectthread;
        boolean c=bconnectedthreadstart;
        boolean d=bconnectthreadstart;
        boolean e=brun;
        boolean f=bconnectedsynchronized;

        // Create temporary object
        ConnectedThread r;
        // Synchronize a copy of the ConnectedThread
        synchronized (this) {

            r = mConnectedThread;
        }
        // Perform the write unsynchronized
        r.write(out);

    }

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;
        bconnectthread = true;

        // 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) { }
        mmSocket = tmp;
    }

    public void run() {
        // Cancel discovery because it will slow down the connection
        mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
        mBluetoothAdapter.cancelDiscovery();
       brun=true;
        try {
            // Connect the device through the socket. This will block
            // until it succeeds or throws an exception
            mmSocket.connect();
        } catch (IOException connectException) {
            // 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)
        //bconnectedthreadstart = true;

       connected(mmSocket);

    }

    /** 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;
        bconnectedthread=true;

        // 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 = new byte[1024];  // 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
                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) { }
    }
}


public synchronized void connect(BluetoothDevice device) 

{  
    bconnectthreadstart=true;
    mConnectThread = new ConnectThread(device);
    mConnectThread.start();

}


public synchronized void connected(BluetoothSocket socket) {

    bconnectedsynchronized=true;
    mConnectedThread = new ConnectedThread(socket);
    mConnectedThread.start();


}}



logcat
    05-21 17:49:29.902: W/dalvikvm(25720): threadid=1: thread exiting with uncaught exception (group=0x417da498)
    05-21 17:49:29.912: E/AndroidRuntime(25720): FATAL EXCEPTION: main
    05-21 17:49:29.912: E/AndroidRuntime(25720): java.lang.IllegalStateException: Could not execute method of the activity
    05-21 17:49:29.912: E/AndroidRuntime(25720):    at android.view.View$1.onClick(View.java:3676)
    05-21 17:49:29.912: E/AndroidRuntime(25720):    at android.view.View.performClick(View.java:4171)
    05-21 17:49:29.912: E/AndroidRuntime(25720):    at android.view.View$PerformClick.run(View.java:17070)
    05-21 17:49:29.912: E/AndroidRuntime(25720):    at android.os.Handler.handleCallback(Handler.java:615)
    05-21 17:49:29.912: E/AndroidRuntime(25720):    at android.os.Handler.dispatchMessage(Handler.java:92)
    05-21 17:49:29.912: E/AndroidRuntime(25720):    at android.os.Looper.loop(Looper.java:137)
    05-21 17:49:29.912: E/AndroidRuntime(25720):    at android.app.ActivityThread.main(ActivityThread.java:4797)
    05-21 17:49:29.912: E/AndroidRuntime(25720):    at java.lang.reflect.Method.invokeNative(Native Method)
    05-21 17:49:29.912: E/AndroidRuntime(25720):    at java.lang.reflect.Method.invoke(Method.java:511)
    05-21 17:49:29.912: E/AndroidRuntime(25720):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:804)
    05-21 17:49:29.912: E/AndroidRuntime(25720):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:571)
    05-21 17:49:29.912: E/AndroidRuntime(25720):    at dalvik.system.NativeStart.main(Native Method)
    05-21 17:49:29.912: E/AndroidRuntime(25720): Caused by: java.lang.reflect.InvocationTargetException
    05-21 17:49:29.912: E/AndroidRuntime(25720):    at java.lang.reflect.Method.invokeNative(Native Method)
    05-21 17:49:29.912: E/AndroidRuntime(25720):    at java.lang.reflect.Method.invoke(Method.java:511)
    05-21 17:49:29.912: E/AndroidRuntime(25720):    at android.view.View$1.onClick(View.java:3671)
    05-21 17:49:29.912: E/AndroidRuntime(25720):    ... 11 more
    05-21 17:49:29.912: E/AndroidRuntime(25720): Caused by: java.lang.NullPointerException
    05-21 17:49:29.912: E/AndroidRuntime(25720):    at com.example.elevator.ConnectingDevices.write(ConnectingDevices.java:40)
    05-21 17:49:29.912: E/AndroidRuntime(25720):    at com.example.elevator.MainActivity.onClickbtnEtage1(MainActivity.java:63)
    05-21 17:49:29.912: E/AndroidRuntime(25720):    ... 14 more
    05-21 17:49:49.062: I/System.out(27064): Debugger has connected
    05-21 17:49:49.062: I/System.out(27064): waiting for debugger to settle...
    05-21 17:49:49.262: I/System.out(27064): waiting for debugger to settle...
    05-21 17:49:49.472: I/System.out(27064): waiting for debugger to settle...
    05-21 17:49:49.663: I/System.out(27064): waiting for debugger to settle...
    05-21 17:49:49.863: I/System.out(27064): waiting for debugger to settle...
    05-21 17:49:50.063: I/System.out(27064): waiting for debugger to settle...
    05-21 17:49:50.263: I/System.out(27064): waiting for debugger to settle...
    05-21 17:49:50.474: I/System.out(27064): debugger has settled (1455)
    05-21 17:49:50.684: W/ResourceType(27064): No package identifier when getting value for resource number 0x00000000
    05-21 17:49:50.684: W/PackageManager(27064): Failure retrieving resources forcom.example.elevator: Resource ID #0x0
    05-21 17:49:50.944: D/IconCustomizer(27064): Generate customized icon for com.example.elevator.png
    05-21 17:49:50.984: W/IconCustomizer(27064): can't load transform_config.xml
    05-21 17:49:51.164: I/themeservice(27064): add pending job /data/data/com.example.elevator/cache/com.example.elevator.png
    05-21 17:49:51.174: I/themeservice(27064): binding service
    05-21 17:49:51.344: I/themeservice(27064): service connected
    05-21 17:49:51.344: I/themeservice(27064): saving icon for /data/data/com.example.elevator/cache/com.example.elevator.png
    05-21 17:49:51.415: I/Adreno200-EGL(27064): <qeglDrvAPI_eglInitialize:294>: EGL 1.4 QUALCOMM build:  (CL3068996)
    05-21 17:49:51.415: I/Adreno200-EGL(27064): Build Date: 03/07/13 Thu
    05-21 17:49:51.415: I/Adreno200-EGL(27064): Local Branch: au37
    05-21 17:49:51.415: I/Adreno200-EGL(27064): Remote Branch: 
    05-21 17:49:51.415: I/Adreno200-EGL(27064): Local Patches: 
    05-21 17:49:51.415: I/Adreno200-EGL(27064): Reconstruct Branch: 
    05-21 17:49:52.346: I/themeservice(27064): unbinding service
    05-21 17:50:36.903: I/ConnectingDevices(27064): connectthread function started
    05-21 17:50:36.903: I/ConnectingDevices(27064): connectthread is working
    05-21 17:50:36.913: I/ConnectingDevices(27064): connectthread is running
    05-21 17:50:36.953: E/ConnectingDevices(27064): mmSocket unable to connect
    05-21 17:50:36.953: E/ConnectingDevices(27064): java.io.IOException: Unable to start Service Discovery
    05-21 17:50:36.953: E/ConnectingDevices(27064):     at android.bluetooth.BluetoothSocket$SdpHelper.doSdp(BluetoothSocket.java:455)
    05-21 17:50:36.953: E/ConnectingDevices(27064):     at android.bluetooth.BluetoothSocket.connect(BluetoothSocket.java:230)
    05-21 17:50:36.953: E/ConnectingDevices(27064):     at com.example.elevator.ConnectingDevices$ConnectThread.run(ConnectingDevices.java:77)

0 个答案:

没有答案