2012-04-29 36 views
1

我想找到附近的蓝牙设备,所以我使用BroadcastReceiver。大多数时候它工作正常,但有时我得到这个错误。接收蓝牙发现的广播错误

04-30 09:50:15.277: E/AndroidRuntime(847): FATAL EXCEPTION: main 
04-30 09:50:15.277: E/AndroidRuntime(847): java.lang.RuntimeException: Error receiving broadcast Intent { act=android.bluetooth.device.action.FOUND (has extras) } in [email protected] 
04-30 09:50:15.277: E/AndroidRuntime(847): at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:722) 
04-30 09:50:15.277: E/AndroidRuntime(847): at android.os.Handler.handleCallback(Handler.java:587) 
04-30 09:50:15.277: E/AndroidRuntime(847): at android.os.Handler.dispatchMessage(Handler.java:92) 
04-30 09:50:15.277: E/AndroidRuntime(847): at android.os.Looper.loop(Looper.java:130) 
04-30 09:50:15.277: E/AndroidRuntime(847): at android.app.ActivityThread.main(ActivityThread.java:3683) 
04-30 09:50:15.277: E/AndroidRuntime(847): at java.lang.reflect.Method.invokeNative(Native Method) 
04-30 09:50:15.277: E/AndroidRuntime(847): at java.lang.reflect.Method.invoke(Method.java:507) 
04-30 09:50:15.277: E/AndroidRuntime(847): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
04-30 09:50:15.277: E/AndroidRuntime(847): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
04-30 09:50:15.277: E/AndroidRuntime(847): at dalvik.system.NativeStart.main(Native Method) 
04-30 09:50:15.277: E/AndroidRuntime(847): Caused by: java.lang.NullPointerException 
04-30 09:50:15.277: E/AndroidRuntime(847): at com.waratah.app.SetMachineActivity$2.onReceive(SetMachineActivity.java:532) 
04-30 09:50:15.277: E/AndroidRuntime(847): at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:709) 
04-30 09:50:15.277: E/AndroidRuntime(847): ... 9 more 

这表明NullPointerException异常,但我不明白怎么能发生这种错误,因为我检查变量,以避免例外。

// The BroadcastReceiver that listens for discovered devices and 
// changes the title when discovery is finished 
private final BroadcastReceiver mReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     if (intent == null) { 
      return; 
     } 
     String action = intent.getAction(); 
     int i; 
     Machine d; 

     if (BluetoothAdapter.ACTION_STATE_CHANGED.equals(action)) { 
      if (mBtAdapter.isEnabled()) { 
       if(D) Log.d(BroadcastReceiver.class.getName(), "Bluetooth is enabled"); 
       pd.dismiss();     
      } 
      doDiscovery(); 

     // when bluetooth device is found 
     } else if (BluetoothDevice.ACTION_FOUND.equals(action)) { 
      if(D) Log.d(BroadcastReceiver.class.getName(), "found"); 
      // Get the BluetoothDevice object from the Intent 
      BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 
      if (device != null) { 

       // Check if the device has name 
       if ((device.getName() != null)||(device.getName().length() > 0)) { //LINE 532 HERE 
        d = new Machine(device); 
        if (d.getPairingState() != BluetoothDevice.BOND_BONDED) { 
         d.setBluetoothState(true); 
         addDevice(d); 
        } else { 
         for (i = 0; i < adapter.getCount(); i++) { 
          if (adapter.getItem(i).getAddress().equals(device.getAddress())) { 
            adapter.getItem(i).setBluetoothState(true); 
          } 
         } 
        } 
       } 
      } 
     // When discovery is finished, change the Activity title 
     } else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) { 
      scanButton.setVisibility(View.VISIBLE); 

      pb.setVisibility(View.GONE); 
      scanning.setVisibility(View.GONE); 
     } 
    } 
}; 

我已经注册了我的所有操作并正确注册了我的接收器。此错误偶尔会发生。 onReceive()函数在没有任何东西可以被接收时触发吗?

感谢您的帮助。

编辑:532 线是

if ((device.getName() != null)||(device.getName().length() > 0)) { 

所以这意味着设备必须是空的,但这样做的前一行的检查。

if (device != null) { 

顺便说一下,两个广播接收机同时运行会导致这种错误吗?广播接收器收到后是否为空?

+1

啊,什么SPECIFIC行有NullPointerException?你真的可以突出显示第532行,这是发生异常的地方。 – Femi

+0

@Femi我无法突出显示代码行,因此我添加了一条评论,并单独引用了532行。 – Mira

回答

2

我怀疑你误用了||而不是& &。

if ((device.getName() != null)||(device.getName().length() > 0)) {

if ((device.getName() != null) && (device.getName().length() > 0)) {

作为原始写入,如果device.getName()为空,则它试图评估的第二部分,这是在呼叫长度()空值,从而导致你看到的NPE。

+0

哦,你是对的!像这样简单的错误很难找到......谢谢,我会纠正它,并再次尝试! – Mira