2017-07-02 1 views
-1

Je suis en train de développer une application où l'utilisateur peut connaître l'état de son appareil Bluetooth Le une fois qu'il/elle lance l'application et l'état de la connexion est mis à jour dans affichage de texte dans Home Fragment.J'ai essayé de l'implémenter en envoyant Broadcast à partir du service Ble et en l'attrapant dans le fragment onResume of Home et en le mettant ensuite à jour dans la vue du texte d'état. Le statut est mis à jour mais si je change le fragment et que je reviens au fragment home, l'affichage du texte pour afficher le statut devient vide bien que le périphérique Bluetooth Le soit connecté. Comment puis-je résoudre ce problème pour que l'état affiche connecté si l'appareil est connecté et déconnecté s'il est déconnecté?Comment afficher le Bluetooth Le périphérique connecté/déconnecté constamment état

Tout type de guidage sera très apprécié.

ici sont les segments de code que j'ai utilisés pour mettre en œuvre ce qui précède

Dans Bleservice.java

private final BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { 
    @Override 
    public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) { 
     String intentAction; 

     if (newState == BluetoothProfile.STATE_CONNECTED) { 
      intentAction = ACTION_GATT_CONNECTED; 
      mConnectionState = STATE_CONNECTED; 


      broadcastUpdate(intentAction); 
      Log.i(TAG, "Connected to GATT server."); 

      // Attempts to discover services after successful connection. 
      Log.i(TAG, "Attempting to start service discovery:" + 
        mBluetoothGatt.discoverServices()); 

     } else if (newState == BluetoothProfile.STATE_DISCONNECTED) { 
      intentAction = ACTION_GATT_DISCONNECTED; 
      mConnectionState = STATE_DISCONNECTED; 
      Log.i(TAG, "Disconnected from GATT server."); 
      broadcastUpdate(intentAction); 
     } 
    } 

private void broadcastUpdate(final String action) { 
    final Intent intent = new Intent(action); 
    sendBroadcast(intent); 
} 

Dans HomeFragment.java

public class HomeFragment extends Fragment 
{ 
    private BroadcastReceiver mReceiver; 
@Override 
protected void onResume() { 
    super.onResume(); 
mReceiver = new BroadcastReceiver() { 

     @Override 
     public void onReceive(Context context, Intent intent) { 
      final String action = intent.getAction(); 

      if (Bleservice.ACTION_GATT_CONNECTED.equals(action)) { 
       mConnected = true; 
       updateConnectionState(R.string.connected); 


      } else if (Bleservice.ACTION_GATT_DISCONNECTED.equals(action)) { 
       mConnected = false; 
       updateConnectionState(R.string.disconnected); 


      } 
     } 


    }; 
    getActivity().registerReceiver(mReceiver,makeGattUpdateIntentFilter()); 

} 

private void updateConnectionState(final int resourceId) { 
    getActivity().runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 

      tv_connected_disconnected.setText(resourceId); 

     } 
    }); 
} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    getActivity().unregisterReceiver(mReceiver); 
} 

private static IntentFilter makeGattUpdateIntentFilter() { 
    final IntentFilter intentFilter = new IntentFilter(); 
    intentFilter.addAction(Bleservice.ACTION_GATT_CONNECTED); 
    intentFilter.addAction(Bleservice.ACTION_GATT_DISCONNECTED); 
    return intentFilter; 

} 

Répondre

0

Connectez-vous à votre BleService par bindService. Découvrez un exemple avec Activité et Service.

private BleService mBluetoothLeService; 
private boolean isConnected; 

@Override 
protected void onStart() { 
    super.onStart(); 
    Intent bindIntent = new Intent(this, BleService.class); 
    startService(bindIntent); 
    bindService(bindIntent, mServiceConnection, Context.BIND_AUTO_CREATE); 
    registerServiceReceiver(); //register here your mGattCallback that get actions from BleService 
} 

@Override 
protected void onStop() { 
    super.onStop(); 
    unbindService(mServiceConnection); 
    mBluetoothLeService = null; 
    LocalBroadcastManager.getInstance(this).unregisterReceiver(mGattUpdateReceiver); 
} 

Dans la méthode bindService vous devez passer un ServiceConnection qui gèrent du cycle de vie des services.

// Code to manage Service lifecycle. 
private final ServiceConnection mServiceConnection = new ServiceConnection() { 

    @Override 
    public void onServiceConnected(ComponentName componentName, IBinder service) { 

     mBluetoothLeService = ((BleService.LocalBinder) service).getService(); 
     isConnected = (mBluetoothLeService.getConnectionState() != BleService.STATE_CONNECTED) 

    } 

    @Override 
    public void onServiceDisconnected(ComponentName componentName) { 
     mBluetoothLeService = null; 
    } 
}; 

Dans Service, vous devez déclarer Binder.

private final IBinder mBinder = new LocalBinder(); 

@Nullable 
@Override 
public IBinder onBind(Intent intent) { 
    return mBinder; 
} 
public class LocalBinder extends Binder { 
    public BleService getService() { 
     return BleService.this; 
    } 
} 


public int getConnectionState() { 
    return mConnectionState; 
} 

Maintenant, après la liaison à BleService, vous pouvez obtenir un état de connexion.