2010-03-13 49 views
5

Tôi đang gặp sự cố khi thiết bị của mình ghép nối trong Android. Nếu tôi đi vào các thiết lập và ghép chúng bằng tay tôi có thể nhận được chúng để kết nối bằng cách sử dụng đoạn mã sau:Android Bluetooth không ghép nối với nhau

server

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.connect); 

    Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE); 
    startActivityForResult(discoverableIntent, REQUEST_ENABLE_BT); 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) 
{ 
    if(requestCode == REQUEST_ENABLE_BT) 
    { 
     if(resultCode == RESULT_CANCELED) 
     { 
      new AlertDialog.Builder(this) 
      .setTitle(R.string.error) 
      .setMessage(R.string.bluetooth_unavailable) 
      .setPositiveButton(android.R.string.ok, AndroidUtils.DismissListener) 
      .create() 
      .show(); 
     } 
     else 
     { 
      mServerSocket = mAdapter.listenUsingRfcommWithServiceRecord("Moo Productions Bluetooth Server", mUUID); 
      mState = State.ACCEPTING; 
      BluetoothSocket socket = mServerSocket.accept(); 
      mServerSocket.close(); 
      connected(socket); 
     } 
    } 
} 

Khách hàng

Set<BluetoothDevice> pairedDevices = mAdapter.getBondedDevices(); 
BluetoothSocket socket = null; 

// Search the list of paired devices for the right one 
for(BluetoothDevice device : pairedDevices) 
{ 
    try 
    { 
     mState = State.SEARCHING; 
     socket = device.createRfcommSocketToServiceRecord(mUUID); 
     mState = State.CONNECTING; 
     socket.connect(); 
     connected(socket); 
     break; 
    } 
    catch (IOException e) 
    { 
     socket = null; 
     continue; 
    } 
} 

Nhưng nếu các thiết bị chưa được ghép nối, thiết bị sẽ không được kết nối mà không cần kết nối vào một ổ cắm hợp lệ. Trong trường hợp đó tôi bắt đầu khám phá.

// If that didn't work, discover 
if(socket == null) 
{ 
    mState = State.SEARCHING; 
    mReceiver = new SocketReceiver(); 
    mContext.registerReceiver(mReceiver, new IntentFilter(BluetoothDevice.ACTION_FOUND)); 
    mAdapter.startDiscovery(); 
} 

// ... Later ... 

private class SocketReceiver extends BroadcastReceiver 
{ 
    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
     if(BluetoothDevice.ACTION_FOUND.equals(intent.getAction())) 
     { 
      try 
      { 
       // Get the device and try to open a socket 
       BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 
       BluetoothSocket socket = device.createRfcommSocketToServiceRecord(mUUID); 
       mState = State.CONNECTING; 
       socket.connect(); 

       // This is our boy, so stop looking 
       mAdapter.cancelDiscovery(); 
       mContext.unregisterReceiver(mReceiver); 

       connected(socket); 
      } 
      catch (IOException ioe) 
      { 
       ioe.printStackTrace(); 
      } 
     } 
    } 
} 

Nhưng nó sẽ không bao giờ tìm thấy thiết bị khác. Tôi không bao giờ nhận được một hộp thoại ghép nối và khi tôi bước qua tôi thấy rằng nó phát hiện ra thiết bị chính xác, nhưng nó không kết nối với ngoại lệ này java.io.IOException: Service discovery failed. Bất kỳ ý tưởng nào về những gì tôi đang bỏ lỡ?

+0

hi CaseyB howz u? Tôi cũng đang mắc kẹt ở đây trong cùng một vấn đề .. có nghĩa là khi tôi kết nối từ một thiết bị với thiết bị khác của nó được kết nối và một lần nữa nếu tôi đang làm từ thứ hai đến con mèo đầu tiên thiết bị hiển thị thông báo "dịch vụ phát hiện thất bại" vậy tại sao nó không kết nối từ thiết bị khác tôi đã thử nó wid pls UUId khác nhau giúp tôi. – shyam

+0

Tôi chưa bao giờ có thể hình dung ra điều này. Tôi chuyển sang một dự án khác. Lấy làm tiếc. – CaseyB

Trả lời

3

Khách hàng của bạn sẽ không bao giờ khám phá máy chủ nếu máy chủ không thực sự phát hiện được. Nhận xét của mã máy chủ của bạn cho biết "Đảm bảo thiết bị có thể phát hiện được" nhưng nghe trên ổ cắm không có nghĩa là thiết bị có thể phát hiện được. Bạn có thể làm cho máy chủ có thể phát hiện bằng cách gọi:

Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE); 
discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300); 
startActivity(discoverableIntent); 

Đây là Intent vì discoverability phải được kích hoạt bởi hệ thống và chỉ với sự chấp thuận của người sử dụng (vì vậy đây sẽ nâng cao một hộp thoại, yêu cầu discoverability cho 300 giây). Chỉ trong thời gian 300 giây, máy chủ mới có thể phát hiện được. Trong thời gian này, mã khách hàng của bạn sẽ hoạt động tốt và bạn sẽ nhận được yêu cầu ghép nối.

này được tất cả các trình bày chi tiết trong hướng dẫn dev Android: http://developer.android.com/guide/topics/wireless/bluetooth.html

+0

Tôi sử dụng mã đó, tôi chỉ đặt chú thích ở đó một cách ngắn gọn. Tôi đã cố gắng làm cho đoạn mã nhỏ hơn. – CaseyB

+0

Tôi sẽ cập nhật mã của mình để hoàn chỉnh hơn. – CaseyB

0

Không biết nếu nó vẫn còn có liên quan, nhưng tôi đã làm điều đó như thế này và nó làm việc:

if (BluetoothDevice.ACTION_FOUND.equals(action)) { 
    discoveredDeviceName = intent.getStringExtra(BluetoothDevice.EXTRA_NAME); 
} 

if (discoveredDeviceName.equals("your_device_name")) { 
    mDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 
} 

Ngoài ra, Tôi sẽ cố gắng hủy khám phá trước đây:

BluetoothSocket socket = device.createRfcommSocketToServiceRecord(mUUID); 
socket.connect(); 
Các vấn đề liên quan