2012-07-06 135 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。