1

近くの Bluetooth デバイスを見つけようとしているので、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 com.waratah.app.SetMachineActivity$2@40582d20
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)) { 

したがって、これは device が null でなければならないことを意味しますが、前の行でこれを確認しています。

if (device != null) {

ところで、2 つの放送受信機を同時に実行すると、この種のエラーが発生する可能性はありますか? BroadcastReceiver は受信後にインテントを null にしますか?

4

1 に答える 1

2

|| を誤って使用したようです。それ以外の &&。

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

対。

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

最初に書かれたように、device.getName() が null の場合、null 値で length() を呼び出している 2 番目の部分を評価しようとするため、表示されている NPE が発生します。

于 2012-04-29T23:54:39.193 に答える