java - Android 蓝牙第一次连接失败

标签 java android bluetooth

我正在开发两个蓝牙应用程序,两个应用程序都基于 bluetoothChat 示例,但其中一个应用程序还能够使用 USB 附件模式从微 Controller 发送/接收数据。这些应用程序在两个不同的设备上运行:Nexus 4 和 V301(中国手机)。 一般来说,一切正常,问题是在第一次尝试时,两个设备无法建立蓝牙连接。 bluetoothChat 应用程序根本无法建立连接,如果我尝试建立连接,另一个应用程序(BT+USB)会停止并崩溃。 但问题是,在这次崩溃之后,一切正常,我最终能够从这两个应用程序建立连接。 这是两个 android list 以及 BT+USB 应用程序崩溃时出现的错误。

Eclipse控制台显示的错误:

06-24 12:40:10.090: W/dalvikvm(5886): threadid=1: thread exiting with uncaught exception (group=0x40a98390)
06-24 12:40:10.110: E/AndroidRuntime(5886): FATAL EXCEPTION: main
06-24 12:40:10.110: E/AndroidRuntime(5886): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=Intent { (has extras) }} to activity {com.example.bluetoothx10y/com.example.bluetoothx10y.BluetoothChat}: java.lang.NullPointerException
06-24 12:40:10.110: E/AndroidRuntime(5886):     at android.app.ActivityThread.deliverResults(ActivityThread.java:2988)
06-24 12:40:10.110: E/AndroidRuntime(5886):     at android.app.ActivityThread.handleSendResult(ActivityThread.java:3031)
06-24 12:40:10.110: E/AndroidRuntime(5886):     at android.app.ActivityThread.access$1100(ActivityThread.java:126)
06-24 12:40:10.110: E/AndroidRuntime(5886):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1185)
06-24 12:40:10.110: E/AndroidRuntime(5886):     at android.os.Handler.dispatchMessage(Handler.java:99)
06-24 12:40:10.110: E/AndroidRuntime(5886):     at android.os.Looper.loop(Looper.java:137)
06-24 12:40:10.110: E/AndroidRuntime(5886):     at android.app.ActivityThread.main(ActivityThread.java:4482)
06-24 12:40:10.110: E/AndroidRuntime(5886):     at java.lang.reflect.Method.invokeNative(Native Method)
06-24 12:40:10.110: E/AndroidRuntime(5886):     at java.lang.reflect.Method.invoke(Method.java:511)
06-24 12:40:10.110: E/AndroidRuntime(5886):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:787)
06-24 12:40:10.110: E/AndroidRuntime(5886):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:554)
06-24 12:40:10.110: E/AndroidRuntime(5886):     at dalvik.system.NativeStart.main(Native Method)
06-24 12:40:10.110: E/AndroidRuntime(5886): Caused by: java.lang.NullPointerException
06-24 12:40:10.110: E/AndroidRuntime(5886):     at com.example.bluetoothx10y.BluetoothChat.onActivityResult(BluetoothChat.java:537)
06-24 12:40:10.110: E/AndroidRuntime(5886):     at android.app.Activity.dispatchActivityResult(Activity.java:4649)
06-24 12:40:10.110: E/AndroidRuntime(5886):     at android.app.ActivityThread.deliverResults(ActivityThread.java:2984)
06-24 12:40:10.110: E/AndroidRuntime(5886):     ... 11 more

BT+USB 应用程序的 Android list (称为 bluetoothx10y):

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.bluetoothx10y"
    android:versionCode="1"
    android:versionName="1.0" >

<uses-sdk
    android:minSdkVersion="9"
    android:targetSdkVersion="15" />

<uses-feature android:name="android.hardware.usb.accessory"/>
<uses-permission android:name="android.permission.WRITE_INTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name" >
    <activity
        android:name="com.example.bluetoothx10y.BluetoothChat"
        android:label="@string/app_name"
        android:screenOrientation="landscape" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>

        <intent-filter>
           <action android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED"/>
        </intent-filter>

        <meta-data 
            android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED"
            android:resource="@xml/accessory_filter">
        </meta-data>

    </activity>

    <activity android:name=".DeviceListActivity"
          android:label="@string/app_name"
          android:theme="@android:style/Theme.Dialog"
          android:screenOrientation="landscape" />

</application>
</manifest>

BT 应用程序(称为 BluetoothChat)的 Android list :

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
     package="com.example.android.BluetoothChat"
     android:versionCode="1"
     android:versionName="1.0">

<uses-sdk
    android:minSdkVersion="6"
    android:targetSdkVersion="9" />

<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.BLUETOOTH" />

<application android:label="@string/app_name"
             android:icon="@drawable/app_icon" >
    <activity android:name=".BluetoothChat"
              android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity android:name=".DeviceListActivity"
              android:label="@string/select_device"
              android:theme="@android:style/Theme.Dialog" />
</application>
</manifest>

在第 536 行和第 537 行我有:

mBluetoothAdapter.getRemoteDevice(address); // Attempt to connect to the device      
mChatService.connect(device); 

mChatService是负责建立和管理蓝牙连接的类的对象

public synchronized void connect(BluetoothDevice device) {
    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);
    mConnectThread.start();
    setState(STATE_CONNECTING);
}

最佳答案

根据您的代码,mChatService == null 这就是导致 NullPointerException 的原因。您应该在使用前注意对其进行初始化。如果不出意外,请使用 lazy initialization对于该领域。不过,我建议您尝试将代码设计为具有尽可能多的 final 字段。在对象的构造函数中初始化您需要的所有内容,而不是尝试更改它们的值。引入带有可变(可设置)字段的可变状态会增加代码的复杂性,并使调试变得非常困难。特别是在多线程应用程序中。

注意:对于将来的问题,学习阅读堆栈跟踪非常有用。这可能是一篇很好的文章,可以从http://marxsoftware.blogspot.hu/2010/10/reading-java-stack-traces-few-tips.html开始

关于java - Android 蓝牙第一次连接失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17274054/

相关文章:

java - 获取点击的数组项

java - 处理空条件(在 Sonar 中更改此条件,使其不总是评估为 "false")

android - kitkat 上的 hfp 客户端角色实现

android - 从 View 模型类中获取 Activity 的上下文

android - 'addChildEventListener()`下无法检测dataSnapshot是否为空

linux - 我们如何从 Linux 中的蓝牙信标(具体估计)获取 RSSI 值?

c++ - 最简单的 Qt 对话框

java - 为什么 Java 的 String.getBytes() 使用 "ISO-8859-1"

java - 在 JAVA 的类中使用枚举有什么好处?

bluetooth - 使用 RSSI 计算近似距离