2010-03-13 3 views
5

Android에서 페어링 할 기기가 제대로 작동하지 않는 문제가 있습니다. 나는 설정으로 이동하고 수동 페어링하면 내가 그들에게 다음과 같은 코드를 사용하여 연결을 얻을 수 있습니다 :Android 블루투스가 페어링되지 않습니다.

서버를

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

클라이언트

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

그러나 장치가 아직 페어링되지 않은 경우 연결하지 않고 foreach에서 벗어납니다. 올바른 소켓에 연결하십시오. 이 경우 나는 발견하기 시작한다.

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

하지만 다른 장치를 찾지는 못합니다. 나는 페어링 대화 상자를 얻지 못했고 단계별로 올바른 장치를 발견했지만이 예외와 연결하지 못했습니다. java.io.IOException: Service discovery failed. 내가 누락 된 것에 대한 어떤 아이디어라도 있니?

+0

안녕하세요 CaseyB howz u? 나는 또한 여기에 같은 문제에 갇혀있다 .. 다른 하나의 장치에서 연결되면 그 연결을 다시하고 내가 처음 두 번째 장치 로그에 메시지를 보여주는 고양이 "서비스 발견 실패"그래서 연결되지 않은 이유 다른 장치 내가 그것을 다른 tryed했다 다른 UUId의 pls 날 도와. – shyam

+0

나는 이것을 결코 이해할 수 없었다. 나는 다른 프로젝트로 옮겼다. 죄송합니다. – CaseyB

답변

3

서버가 실제로 검색되지 않으면 클라이언트는 서버를 발견하지 못합니다. 서버 코드의 주석에 "장치를 발견 할 수 있는지 확인하십시오."하지만 소켓에서 수신한다고해서 장치를 검색 할 수있는 것은 아닙니다. 당신은 호출하여 서버를 검색 할 수 있습니다 :

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

이는 의도입니다 검색 기능은 시스템에 의해 활성화 및 사용자 만 (그래서이 300 초 동안 검색 기능을 요청하는 대화를 올릴)에서 승인을해야하기 때문이다. 이 창이 300 초 동안 만 서버가 실제로 검색 가능합니다. 이 기간 동안 클라이언트 코드는 잘 작동하며 페어링 요청을 받게됩니다.

이 모든 안드로이드 디바이스 가이드에 자세히 설명되어 여전히 관련이 경우 http://developer.android.com/guide/topics/wireless/bluetooth.html

+0

나는 그 코드를 사용한다. 나는 간결함을 위해 거기에 주석을 달았다. 나는 코드 스 니펫을 더 작게하려고 노력했다. – CaseyB

+0

더 완벽 해 지도록 코드를 업데이트하겠습니다. – CaseyB

0

모르지만, 나는 다음과 같이했다하고 일 :

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

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

, 전에 발견을 취소하려고합니다 :

BluetoothSocket socket = device.createRfcommSocketToServiceRecord(mUUID); 
socket.connect(); 
관련 문제