2012-07-06 139 views
0

好吧,我會再試一次。Android藍牙例外

我在Ubuntu的設備命令sdptool下面是從我的設備說:

# sdptool browse C0:1B:DC:1F:E2:F1 
Browsing C0:1B:DC:1F:E2:F1 ... 
Service Name: OBEX Object Push 
Service RecHandle: 0x10000 
Service Class ID List: 
"OBEX Object Push" (0x1105) 
Protocol Descriptor List: 
"L2CAP" (0x0100) 
"RFCOMM" (0x0003) 
Channel: 9 
"OBEX" (0x0008) 
Profile Descriptor List: 
"OBEX Object Push" (0x1105) 
    Version: 0x0100 

如你本身的設備不支持RFCOMM協議,OBEX文件傳輸。我爲我的android應用程序提供了一個簡單的代碼,它嘗試通過不安全的RFCOMM通道連接到此設備,僅用於無用戶交互。我想連接到這個設備,所以Iam使用設備MAC地址進行連接,並且套接字已經準備就緒,logcat這樣說。

但我只得到了錯誤:

Connection refused 

有想法,在Java代碼中的MAC地址是從以下上面列出的不同。

因此,這裏是我的代碼:

import java.io.IOException; 
import java.lang.reflect.InvocationTargetException; 
import java.lang.reflect.Method; 
import java.util.UUID; 

import android.app.Activity; 
import android.bluetooth.BluetoothAdapter; 
import android.bluetooth.BluetoothDevice; 
import android.bluetooth.BluetoothSocket; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.Toast; 

public class SimpleConnectAndroidActivity extends Activity { 

final static String toast = "IAM HERE"; 

final static String TAG ="SimpleConnect"; 
UUID MY_UUID; 

BluetoothDevice bd; 
BluetoothAdapter ba; 

Button connectButton; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 


    //MY_UUID = new UUID(0x0100 , 0x1000); 
    // MY_UUID = UUID.fromString("8e1f0cf7-508f-4875-b62c-fbb67fd34812"); 

    connectButton = (Button)findViewById(R.id.button1); 
    connectButton.setOnClickListener(new OnClickListener() { 

     public void onClick(View arg0) { 


      BluetoothSocket tmp = null; 

       BluetoothDevice device = BluetoothAdapter.getDefaultAdapter().getRemoteDevice("00:1B:DC:0F:EC:7E"); 
       Method m = null; 

       try { 
        m = device.getClass().getMethod("createInsecureRfcommSocket", new Class[] {int.class}); 
       } catch (NoSuchMethodException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 

       try { 
        tmp = (BluetoothSocket) m.invoke(device, 1); 
       } catch (IllegalArgumentException e) { 

        Toast.makeText(getApplicationContext(), "Exception: " + e.getMessage(), Toast.LENGTH_LONG).show(); 

       } catch (IllegalAccessException e) { 

        Toast.makeText(getApplicationContext(), "Exception: " + e.getMessage(), Toast.LENGTH_LONG).show(); 

        e.printStackTrace(); 

       } catch (InvocationTargetException e) { 

        Toast.makeText(getApplicationContext(), "Exception: " + e.getMessage(), Toast.LENGTH_LONG).show(); 

        e.printStackTrace(); 
       } 

       try { 
        tmp.connect(); 
       } catch (IOException e) { 

        Toast.makeText(getApplicationContext(), "Exception: " + e.getMessage(), Toast.LENGTH_LONG).show(); 

        try { 
         tmp.close(); 
        } catch (IOException e1) { 

         Toast.makeText(getApplicationContext(), "Socket closed!" + e.getMessage(), Toast.LENGTH_LONG).show(); 
        } 


       } 
       boolean con = tmp.isConnected(); 

       if(con) 
        Toast.makeText(getApplicationContext(), "Connection was made!", Toast.LENGTH_LONG).show(); 
       else 
        Toast.makeText(getApplicationContext(), "Connection was not made!", Toast.LENGTH_LONG).show(); 

      } 
    }); 
} 

}

我讀過幾個地方,它應該由聯合國配對和對重新工作,但是這並沒有解決我的問題。

回答

1

那麼,你的問題是,過了一個多月了,但如果你還在尋找答案,這裏是一個:

sdptool可以表明你的RFCOMM頻道9,但在你的代碼中有:

tmp = (BluetoothSocket) m.invoke(device, 1);

,而不是1作爲最後一個參數,儘量9(如果不工作,經過15嘗試其他整數,如2)。您可能還想查看this answer

這個問題似乎在Stack上有很多變體,但對「標準」推薦代碼(即用定義和調用「Method m」的行修改的藍牙聊天樣本) - 我知道,因爲我是那些爲此付出努力的人之一。我試圖將手機連接到我的MacBook,並且得到了「連接被拒絕」的消息,直到我意識到我需要在上面的代碼行中使用5。