2014-02-05 53 views
0

我想要发现蓝牙设备,由于某种原因,我不断收到接收机从未注册的非法异常。BroadcastReceiver没有设置

我能够在碎片上发现设备。这使得UI在发现过程完成之前等待发现过程完成,因此我尝试将此代码移至AsyncTask。同样的问题。我不知道我哪里出错了。欢迎任何帮助/建议。

public class HomeFragment extends Fragment{ 

private View rootView; 
private ToggleButton toggleButton; 
private TextView lockStatus; 
private TextView connectionToLock; 
private ArrayList<BluetoothDevice> availableDevices; 
private BluetoothAdapter bluetoothAdapter; 


public HomeFragment(){}; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 

    rootView = inflater.inflate(R.layout.fragment_home, container, false); 
    toggleButton = (ToggleButton) rootView.findViewById(R.id.toggleLock); 
    lockStatus = (TextView) rootView.findViewById(R.id.lockStatus); 
    connectionToLock = (TextView)rootView.findViewById(R.id.connectionToLock); 
    availableDevices = new ArrayList<BluetoothDevice>(); 

    lockStatus.setText("Lock Status: DEFAULT"); 
    connectionToLock.setText("Searching for BT Devices ..."); 

    bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); 
    btDeviceDiscovery(); 
    return rootView; 
} 

private void btDeviceDiscovery(){ 
    //assume bt is turned on for now 
    IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND); 
    filter.addAction(BluetoothDevice.ACTION_UUID); 
    filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED); 
    filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED); 

    getActivity().getApplicationContext().registerReceiver(ActionFoundReceiver, filter); 
    Log.i("BT Discovery", "Devices found: "+availableDevices.size()); 
} 

@Override 
public void onDestroy() { 
    // TODO Auto-generated method stub 
    super.onDestroy(); 
    try { 
     getActivity().unregisterReceiver(ActionFoundReceiver); 
    } catch (Exception e) { 
     Log.i("onDestroy", e.toString()); 
     e.printStackTrace(); 
    } 
} 

private final BroadcastReceiver ActionFoundReceiver = new BroadcastReceiver(){ 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Log.i("onReceive", "Finally Called"); 
     String action = intent.getAction(); 
     connectionToLock.setText("Found Devices :- \n"); 

     if(BluetoothDevice.ACTION_FOUND.equals(action)) { 
      BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 
      Log.i("onReceive", "\n Device: " + device.getName() + ", " + device); 
      availableDevices.add(device); 
      connectionToLock.append(device.getName()+ " \n"); 
     } else { 
      connectionToLock.setText("No Bluetooth Devices in range."); 
     } 

    } 

}; 

}

而且堆栈跟踪:

02-05 15:17:45.227: W/System.err(11086): java.lang.IllegalArgumentException: Receiver not registered: [email protected] 
02-05 15:17:45.227: W/System.err(11086): at android.app.LoadedApk.forgetReceiverDispatcher(LoadedApk.java:667) 
02-05 15:17:45.227: W/System.err(11086): at android.app.ContextImpl.unregisterReceiver(ContextImpl.java:1743) 
02-05 15:17:45.227: W/System.err(11086): at android.content.ContextWrapper.unregisterReceiver(ContextWrapper.java:475) 
02-05 15:17:45.227: W/System.err(11086): at com.naftal.easylock.ui.fragment.HomeFragment.onDestroy(HomeFragment.java:69) 
02-05 15:17:45.227: W/System.err(11086): at android.app.Fragment.performDestroy(Fragment.java:1908) 
02-05 15:17:45.237: W/System.err(11086): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1026) 
02-05 15:17:45.237: W/System.err(11086): at android.app.FragmentManagerImpl.removeFragment(FragmentManager.java:1180) 
02-05 15:17:45.237: W/System.err(11086): at android.app.BackStackRecord.run(BackStackRecord.java:639) 
02-05 15:17:45.237: W/System.err(11086): at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1455) 
02-05 15:17:45.237: W/System.err(11086): at android.app.FragmentManagerImpl$1.run(FragmentManager.java:441) 
02-05 15:17:45.237: W/System.err(11086): at android.os.Handler.handleCallback(Handler.java:730) 
02-05 15:17:45.237: W/System.err(11086): at android.os.Handler.dispatchMessage(Handler.java:92) 
02-05 15:17:45.237: W/System.err(11086): at android.os.Looper.loop(Looper.java:137) 
02-05 15:17:45.237: W/System.err(11086): at android.app.ActivityThread.main(ActivityThread.java:5455) 
02-05 15:17:45.237: W/System.err(11086): at java.lang.reflect.Method.invokeNative(Native Method) 
02-05 15:17:45.237: W/System.err(11086): at java.lang.reflect.Method.invoke(Method.java:525) 
02-05 15:17:45.237: W/System.err(11086): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1187) 
02-05 15:17:45.237: W/System.err(11086): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003) 
02-05 15:17:45.247: W/System.err(11086): at dalvik.system.NativeStart.main(Native Method) 
+0

堆栈跟踪在哪里? – nKn

+0

增加了Stacktrace。它只是告诉我接收器从来没有注册;但是我愿意。我不能解释为什么它这样做。 – 1000Suns

回答

1

我的猜测是,你做你的BroadcastReceiver注册的Intent之前接收。您可以调用注册接收方的方法,但在这段时间内,直到注册过程中,接收方可能会收到一个Intent,但尚未注册。

---- ----编辑

还有另一个想法:你可能会调用unregisterReceiver()时,它是未经注册已经或基本在您注册接收器之前你onDestroy()方法被调用。所以它可能基于处理你的片段,尝试调试什么时候被破坏,然后调试你之前是否调用过registerReceiver()

+0

那么你会建议我做什么?在每个filter.addAction()之后调用registerReceiver? – 1000Suns

+0

我更新了我的答案,请检查。 – nKn

+0

你是对的。 onDestroy在我注册之前被调用。 onDestroy被调用,然后我的代码尝试设置接收器。 onReceive方法永远不会被调用。我不知道如何解决这个问题。 – 1000Suns

0

试试把它注册在YOUT onCreate()方法是这样的:

@Override 
public void onCreate (Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    getActivity().getApplicationContext().registerReceiver(ActionFoundReceiver, filter); 
} 

如果广播在您的应用程序只用你应该使用LocalBoradcastManager,因为这些节目不离开你的应用程序。

希望这会有所帮助。