2014-02-05 5 views
0

Я пытаюсь открыть Bluetooth-устройства, и по какой-то причине я продолжаю получать незаконное исключение, что ресивер никогда не регистрировался.BroadcastReceiver не получает установленный

Я смог обнаружить устройства раньше на фрагменте. Это заставляло пользовательский интерфейс ждать завершения процесса обнаружения, прежде чем он что-либо сделает, поэтому я попытался переместить этот код в 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."); 
     } 

    } 

}; 

}

И StackTrace:

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

Я предполагаю, что вы получаете Intent до быть вашим зарегистрировано BroadcastReceiver. Вы вызываете метод, который регистрирует приемник, но по истечении этого времени, пока он не достигнет процесса регистрации, может быть Intent, который был получен приемником, но он еще не был зарегистрирован.

---- EDIT ----

Там другая идея: Вы можете называть unregisterReceiver(), когда он уже был зарегистрирован, или в основном, когда ваш метод onDestroy() вызывается, прежде чем зарегистрировать приемник. Таким образом, это может быть основано на обработке вашего фрагмента, попытке отладки, когда он будет уничтожен, а затем также отлаживается ли вы вызывают registerReceiver() до этого.

+0

Итак, что бы я посоветовал сделать? Вызовите registerReceiver после каждого фильтра.addAction()? – 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, потому что эти передачи не покидают ваше приложение.

Надеюсь, это поможет.

Смежные вопросы