2011-03-18 2 views
0

블루투스 연결을 위해 BluetoothChat 예제 프로그램에서 BluetoothChatService 클래스를 사용했습니다. 나는Android 블루투스 직렬 포트 장치 연결

처럼 수정 한

개인 정적 최종 UUID MY_UUID = UUID.fromString ("00001101-0000-1000-8000-00805F9B34FB");

직렬 포트 장치에 연결할 수 있습니다.

내 샘플 테스트 Android 기기는 NexusOne, HTC Desire, LG Optimus, Motorola Droid입니다.

응용 프로그램을 하드웨어에 연결할 때마다 NexusOne을 사용하여 적절하게 연결하고 연결을 끊습니다. 그러나 다른 안드로이드 장치를 사용하면 언젠가 연결됩니다. 때로는 100 초 이상 연결하지 않아도 연결됩니다. 때로는 연결을 끊을 때 응용 프로그램 연결이 끊어 지지만 하드웨어의 Bluetooth 표시등이 켜져있어 연결이 계속 켜져 있음을 나타냅니다. 자사의 코딩 오류, 또는 하드웨어 오류, 또는 안드로이드 OS 블루투스 라이브러리 오류가 있는지 궁금합니다. NexusOne과 관련하여이 문제가 발생하지 않았습니다. 문제가있는 곳의 정확한 위치를 정확히 찾아 낼 수 없었습니다.

누군가이 문제를 해결하기 위해 취할 수있는 조치를 취할 수있는 점을 지적 해 줄 수 있습니까? 제공


코드

/**

* Constructor. Prepares a new BluetoothChat session. 

* @param context The UI Activity Context 

* @param handler A Handler to send messages back to the UI Activity 

*/ 


public BluetoothChatService(Context context, Handler handler) { 
    mAdapter = BluetoothAdapter.getDefaultAdapter(); 
    mState = STATE_NONE; 
    mHandler = handler; 
} 

/** 
* Set the current state of the chat connection 
* @param state An integer defining the current connection state 
*/ 
private synchronized void setState(int state) { 
    if (D) Log.d(TAG, "setState() " + mState + " -> " + state); 
    mState = state; 

    // Give the new state to the Handler so the UI Activity can update 
    mHandler.obtainMessage(BluetoothChat.MESSAGE_STATE_CHANGE, state, -1).sendToTarget(); 
} 

/** 
* Return the current connection state. */ 
public synchronized int getState() { 
    return mState; 
} 

/** 
* Start the chat service. Specifically start AcceptThread to begin a 
* session in listening (server) mode. Called by the Activity onResume() */ 
public synchronized void start() { 
    if (D) Log.d(TAG, "start"); 

    // Cancel any thread attempting to make a connection 
    if (mConnectThread != null) {mConnectThread.cancel(); mConnectThread = null;} 

    // Cancel any thread currently running a connection 
    if (mConnectedThread != null) {mConnectedThread.cancel(); mConnectedThread = null;} 

    setState(STATE_LISTEN); 

    // Start the thread to listen on a BluetoothServerSocket 
    if (mSecureAcceptThread == null) { 
     mSecureAcceptThread = new AcceptThread(true); 
     mSecureAcceptThread.start(); 
    } 
    if (mInsecureAcceptThread == null) { 
     mInsecureAcceptThread = new AcceptThread(false); 
     mInsecureAcceptThread.start(); 
    } 
} 

/** 
* Start the ConnectThread to initiate a connection to a remote device. 
* @param device The BluetoothDevice to connect 
* @param secure Socket Security type - Secure (true) , Insecure (false) 
*/ 
public synchronized void connect(BluetoothDevice device, boolean secure) { 
    if (D) Log.d(TAG, "connect to: " + device); 

    // Cancel any thread attempting to make a connection 
    if (mState == STATE_CONNECTING) { 
     if (mConnectThread != null) {mConnectThread.cancel(); mConnectThread = null;} 
    } 

    // Cancel any thread currently running a connection 
    if (mConnectedThread != null) {mConnectedThread.cancel(); mConnectedThread = null;} 

    // Start the thread to connect with the given device 
    mConnectThread = new ConnectThread(device, secure); 
    mConnectThread.start(); 
    setState(STATE_CONNECTING); 
} 

/** 
* Start the ConnectedThread to begin managing a Bluetooth connection 
* @param socket The BluetoothSocket on which the connection was made 
* @param device The BluetoothDevice that has been connected 
*/ 
public synchronized void connected(BluetoothSocket socket, BluetoothDevice 
     device, final String socketType) { 
    if (D) Log.d(TAG, "connected, Socket Type:" + socketType); 

    // Cancel the thread that completed the connection 
    if (mConnectThread != null) {mConnectThread.cancel(); mConnectThread = null;} 

    // Cancel any thread currently running a connection 
    if (mConnectedThread != null) {mConnectedThread.cancel(); mConnectedThread = null;} 

    // Cancel the accept thread because we only want to connect to one device 
    if (mSecureAcceptThread != null) { 
     mSecureAcceptThread.cancel(); 
     mSecureAcceptThread = null; 
    } 
    if (mInsecureAcceptThread != null) { 
     mInsecureAcceptThread.cancel(); 
     mInsecureAcceptThread = null; 
    } 

    // Start the thread to manage the connection and perform transmissions 
    mConnectedThread = new ConnectedThread(socket, socketType); 
    mConnectedThread.start(); 

    // Send the name of the connected device back to the UI Activity 
    Message msg = mHandler.obtainMessage(BluetoothChat.MESSAGE_DEVICE_NAME); 
    Bundle bundle = new Bundle(); 
    bundle.putString(BluetoothChat.DEVICE_NAME, device.getName()); 
    msg.setData(bundle); 
    mHandler.sendMessage(msg); 

    setState(STATE_CONNECTED); 
} 

/** 
* Stop all threads 
*/ 
public synchronized void stop() { 
    if (D) Log.d(TAG, "stop"); 

    if (mConnectThread != null) { 
     mConnectThread.cancel(); 
     mConnectThread = null; 
    } 

    if (mConnectedThread != null) { 
     mConnectedThread.cancel(); 
     mConnectedThread = null; 
    } 

    if (mSecureAcceptThread != null) { 
     mSecureAcceptThread.cancel(); 
     mSecureAcceptThread = null; 
    } 

    if (mInsecureAcceptThread != null) { 
     mInsecureAcceptThread.cancel(); 
     mInsecureAcceptThread = null; 
    } 
    setState(STATE_NONE); 
} 

/** 
* Write to the ConnectedThread in an unsynchronized manner 
* @param out The bytes to write 
* @see ConnectedThread#write(byte[]) 
*/ 
public void write(byte[] out) { 
    // Create temporary object 
    ConnectedThread r; 
    // Synchronize a copy of the ConnectedThread 
    synchronized (this) { 
     if (mState != STATE_CONNECTED) return; 
     r = mConnectedThread; 
    } 
    // Perform the write unsynchronized 
    r.write(out); 
} 

/** 
* Indicate that the connection attempt failed and notify the UI Activity. 
*/ 
private void connectionFailed() { 
    // Send a failure message back to the Activity 
    Message msg = mHandler.obtainMessage(BluetoothChat.MESSAGE_TOAST); 
    Bundle bundle = new Bundle(); 
    bundle.putString(BluetoothChat.TOAST, "Unable to connect device"); 
    msg.setData(bundle); 
    mHandler.sendMessage(msg); 

    // Start the service over to restart listening mode 
    BluetoothChatService.this.start(); 
} 

/** 
* Indicate that the connection was lost and notify the UI Activity. 
*/ 
private void connectionLost() { 
    // Send a failure message back to the Activity 
    Message msg = mHandler.obtainMessage(BluetoothChat.MESSAGE_TOAST); 
    Bundle bundle = new Bundle(); 
    bundle.putString(BluetoothChat.TOAST, "Device connection was lost"); 
    msg.setData(bundle); 
    mHandler.sendMessage(msg); 

    // Start the service over to restart listening mode 
    BluetoothChatService.this.start(); 
} 
+1

하드웨어 란 무엇입니까? 문제를 보여주는 게시 할 수있는 안드로이드 블루투스 로그가 있습니까? 귀하의 코드는 무엇을합니까? 당신이 우리가 바라는 코드의 부분을 –

+0

에 게시하십시오. 사용자 정의 하드웨어를 만들지 마십시오. 로그에는 오류 추적이 표시되지 않습니다. NexusOne 외에 연결하려고하면 Toast message "Unable to connect device"가 표시됩니다. 내 질문에 코드 스 니펫을 추가했는데, 이는 토스트 메시지로 연결됩니다. –

답변

0

코드에 약간의 오류가있었습니다 ... 일단 Activity의 전체 라이프 사이클을 검토하고 그에 따라 구현하면 해결되었습니다. 주어진 클래스는 괜찮습니다.

0

합니까 "사용자 정의 만든 하드웨어"를 위해 작성 서버 코드에 사용되는 UUID 토스트 메시지 "를 할 수 없습니다 장치를 연결" Android 휴대 전화에 사용 된 UUID와 일치합니까? 아마도 넥서스 원이 진저 브레드 (?)를 사용하는 유일한 휴대 전화 (휴대 전화 중 하나) 일 수 있으며 이는 이전 Android 버전보다 높은 API 수준을 의미합니다. 블루투스와 관련된 진저 브레드의 변경 로그를 살펴보십시오. 그것은 아마 이유 일 것입니다.