2013-06-24 57 views
1

我正在開發兩個藍牙應用程序,兩者均基於bluetoothChat示例,但其中一個也能夠使用USB附件模式從微控制器發送/接收數據。這些應用程序運行在兩個不同的設備上,即Nexus 4和V301(中國電話)。 一般情況下,一切正常,問題只是在第一次嘗試兩個設備無法進行藍牙連接。 bluetoothChat應用程序根本無法建立連接,如果嘗試建立連接,另一個應用程序(BT + USB)會停止並崩潰。 但事情是,在這次崩潰後,一切正常,我最終能夠從兩個應用程序進行連接。 以下是兩個Android清單以及BT + USB應用程序崩潰時出現的錯誤。Android藍牙連接第一次嘗試失敗

通過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的應用程序(稱爲bluetoothx10y)的Android清單:

<?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應用程序的Android清單(稱爲BluetoothChat ):

<?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); 
} 
+0

什麼是在BluetoothChat.java線537.你有一個NullPointerException那裏。檢查你發佈的堆棧跟蹤,它告訴很多! – allprog

+0

這是我在第536和537行: BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address); //嘗試連接到設備 mChatService.connect(device); mChatService是負責設置和管理藍牙連接的類的一個對象。 – STiLLeN

+0

您的遠程設備的地址是否被識別?如果它作爲Null返回,您將看到該錯誤。 –

回答

0

基於您的代碼,該mChatService == null這是什麼原因造成的NullPointerException異常。在使用之前,您應該注意初始化它。如果沒有其他,請使用lazy initialization作爲該字段。不過,我建議你儘量設計你的代碼,儘可能多的使用final字段。在對象的構造函數中初始化所需的所有內容,而不是嘗試更改它們的值。使用可變(可設置)字段引入可變狀態將增加代碼的複雜性並使其很難調試。特別是在多線程應用程序中。

注意:對於將來的問題,學習讀取堆棧跟蹤非常有用。這可能是一個很好的文章開始http://marxsoftware.blogspot.hu/2010/10/reading-java-stack-traces-few-tips.html

+0

感謝您的堆棧跟蹤鏈接,我會經歷,mChatService是這樣定義的:'private BluetoothChatService mChatService = null;'(在這兩個應用程序中)直接來自BluetoothChat示例沒有任何修改,是問題? – STiLLeN

+0

事實證明,代碼不能(我的錯)在'onStart()'期間正確地更改'mChatService == null'初始化,修復了一切正常的問題!謝謝 – STiLLeN