Bluetooth Tethering Status Abfrage / OnServiceLIstener

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Bluetooth Tethering Status Abfrage / OnServiceLIstener

    Hallo
    ich hatte schon ein sehr ähnliches Thema dazu. Ich fand es aber besser einen neues Thema dafür zu öffnen.
    Es gibt ein Problem womit ich einfach nicht weiter komme.
    Ich habe jetzt zwei eigene Klassen für BT (on off) und Tethering (on off) geschrieben.
    Die BT Klasse funktioniert perfekt. Die Tethering Klasse eigentlich auch.
    ( es sind extra Klassen, da ich sie für ein Widget bzw. andere Tools verwenden möchte.)
    Ich habe mehrere Buttons 1) Tethering ON - funktioniert, 2) Tethering OFF - funktioniert auch. 3) Tethering Status - funktioniert nicht so ganz.
    Ich möchte in der MainActivity einfach nur durch einen Button (Tethering Status) abfragen ob Tethering ON oder Off ist (status)
    Nun das Problem welches ich nicht in den Griff kriege.
    Ich starte die App - drücke Tethering Status Button - ich bekomme den richtigen Status
    Ich drücke den Button "Tethering On" dann Button "Tethering Status" . es wird der Status Off angezeigt obwohl Tethering ON ist
    Ich muss den Tethering Status Button nochmal drücken und dann kommt der richtige Status.
    (Das selbe ist auch umgekehrt wenn ich von Tethering On auf Off umschalte. (Status ist erst on und beim zweiten drücken wieder korrekt off.
    Der Grund ist OnServiceConnected. Wenn ich mir meine Tags anschaue dann wird der OnServiceConnected (tetheringState .....) immer erst ganz am Ende ausgeführt. Und deswegen der Status erst beim nächsten Drücken richtig angezeigt.
    Die Variable "tetheringState" in der ClassTethering ist aber immer Korrekt nur die "check" variable ist beim ersten mal nicht korrekt.
    Gibt es vielleicht einen Trick oder was mach ich verkehrt.
    Gruß

    Hier mal die MainActivtiy
    Es geht eigentlich nur um diesen Code von der MainActivity. Der Rest ist wahrscheinlich nicht relevant.

    Quellcode

    1. public ClassTethering classTethering = new ClassTethering(this);
    2. ........
    3. if ((view == btnTetheringState)){
    4. check = classTethering.getTetheringState();
    5. Toast.makeText(getApplicationContext(), "Tethering State = " + check, Toast.LENGTH_LONG).show();
    6. }


    Hier die Klasse ClassTethering

    Java-Quellcode

    1. package com.herrm_no.bluetoothtetheringcarnew;
    2. import android.bluetooth.BluetoothAdapter;
    3. import android.bluetooth.BluetoothProfile;
    4. import android.content.Context;
    5. import android.util.Log;
    6. import android.widget.Toast;
    7. import java.lang.reflect.Constructor;
    8. import java.lang.reflect.InvocationTargetException;
    9. import java.lang.reflect.Method;
    10. public class ClassTethering {
    11. // is Tethering Enabled
    12. private Class<?> classBluetoothPan = null;
    13. private Constructor<?> mBTPanCtor = null;
    14. private Object mBTSrvInstance = null;
    15. private Class<?>[] noparams = {};
    16. private Class[] paramSet = new Class[1];
    17. private Method mIsBTTetheringOn;
    18. private Method mSetBTTetheringOn;
    19. private Object mutex = new Object();
    20. // END
    21. // private Boolean check;
    22. public Boolean tetheringState = false;
    23. // public Boolean tetheringActivate = false;
    24. private static final String TAG = "TAG";
    25. // private BluetoothAdapter mBluetoothAdapter = null;
    26. private Context context;
    27. // private Integer mWait = 200;
    28. private BTPanServiceListener mBTPanServiceListener = new BTPanServiceListener(context);
    29. private boolean buttonPush = false;
    30. public Boolean getTetheringState() {
    31. boolean state;
    32. state = isTetheringEnabled();
    33. // state = tetheringState;
    34. Log.i(TAG, "Class Tethering > getTetheringState - state = " + state );
    35. return state; // globale Variable siehe ONServiceConnected
    36. }
    37. public void setTetheringState(Boolean state) {
    38. this.tetheringState = state; // globale Variable siehe ONServiceConnected
    39. setTetheringEnabled(state);
    40. }
    41. public void initializeOnClickListerner()
    42. {
    43. isTetheringEnabled();
    44. }
    45. public void setButtonPush(boolean buttonPush)
    46. {
    47. this.buttonPush = buttonPush;
    48. }
    49. public ClassTethering(Context context) {
    50. this.context = context;
    51. mBTPanServiceListener = new BTPanServiceListener(context);
    52. // isTetheringEnabled();
    53. }
    54. private boolean isTetheringEnabled() {
    55. Log.i(TAG, "Class Tethering > isTetheringEnabled Start = " );
    56. paramSet[0] = boolean.class;
    57. // Boolean test;
    58. try {
    59. classBluetoothPan = Class.forName("android.bluetooth.BluetoothPan");
    60. mSetBTTetheringOn = classBluetoothPan.getDeclaredMethod("setBluetoothTethering", paramSet);
    61. mIsBTTetheringOn = classBluetoothPan.getDeclaredMethod("isTetheringOn", noparams);
    62. mBTPanCtor = classBluetoothPan.getDeclaredConstructor(Context.class, BluetoothProfile.ServiceListener.class);
    63. mBTPanCtor.setAccessible(true);
    64. synchronized (mutex) {
    65. mBTSrvInstance = mBTPanCtor.newInstance(context, mBTPanServiceListener);
    66. // test = (Boolean) mIsBTTetheringOn.invoke(mBTSrvInstance, (Object []) noparams);
    67. }
    68. } catch (ClassNotFoundException e) {
    69. e.printStackTrace();
    70. } catch (Exception e) {
    71. e.printStackTrace();
    72. }
    73. Log.i(TAG, "Class Tethering > isTetheringEnabled END - tetheringState " + tetheringState );
    74. return tetheringState; // global Varible > OnServiceListener
    75. }
    76. private void setTetheringEnabled(boolean state)
    77. {
    78. try {
    79. classBluetoothPan = Class.forName("android.bluetooth.BluetoothPan");
    80. mSetBTTetheringOn = classBluetoothPan.getDeclaredMethod("setBluetoothTethering", paramSet);
    81. mIsBTTetheringOn = classBluetoothPan.getDeclaredMethod("isTetheringOn", noparams);
    82. mBTPanCtor = classBluetoothPan.getDeclaredConstructor(Context.class, BluetoothProfile.ServiceListener.class);
    83. mBTPanCtor.setAccessible(true);
    84. synchronized (mutex) {
    85. mBTSrvInstance = mBTPanCtor.newInstance(context, mBTPanServiceListener);
    86. }
    87. } catch (IllegalAccessException e) {
    88. e.printStackTrace();
    89. } catch (InvocationTargetException e) {
    90. e.printStackTrace();
    91. } catch (NoSuchMethodException e) {
    92. e.printStackTrace();
    93. } catch (InstantiationException e) {
    94. e.printStackTrace();
    95. } catch (ClassNotFoundException e) {
    96. e.printStackTrace();
    97. }
    98. }
    99. public class BTPanServiceListener implements BluetoothProfile.ServiceListener {
    100. private final Context context;
    101. public BTPanServiceListener(final Context context) {
    102. Log.i(TAG, "Class Tethering > BTPanServiceListener " );
    103. this.context = context;
    104. }
    105. @Override
    106. public void onServiceConnected(final int profile,
    107. final BluetoothProfile proxy) {
    108. Log.i(TAG, "Class Tethering > onServiceConnected " );
    109. try {
    110. tetheringState = (Boolean) proxy.getClass().getMethod("isTetheringOn", new Class[0]).invoke(proxy, new Object[0]); // globale Variable siehe ONServiceConnected
    111. Log.i(TAG, "Class Tethering > tetheringState = " + tetheringState );
    112. } catch (IllegalAccessException e) {
    113. e.printStackTrace();
    114. } catch (InvocationTargetException e) {
    115. e.printStackTrace();
    116. } catch (NoSuchMethodException e) {
    117. e.printStackTrace();
    118. }
    119. synchronized (mutex) {
    120. try {
    121. if (buttonPush && !tetheringState){ // buttonPush wird übergeben um abzufragen ob wirklich ein button gedrückt wurde
    122. mSetBTTetheringOn.invoke(mBTSrvInstance, true);
    123. Log.i(TAG, "Class Tethering > Tethering ON");}
    124. else if (buttonPush && tetheringState){
    125. mSetBTTetheringOn.invoke(mBTSrvInstance, false);
    126. Log.i(TAG, "Class Tethering > Tethering OFF");
    127. }
    128. } catch (IllegalAccessException e) {
    129. e.printStackTrace();
    130. } catch (InvocationTargetException e) {
    131. e.printStackTrace();
    132. }
    133. buttonPush = false;
    134. }
    135. }
    136. @Override
    137. public void onServiceDisconnected(final int profile) {
    138. }
    139. }
    140. }
    Alles anzeigen
  • hallo
    Beim schnellen durchschauen.
    Fällt mir auf das du die mBTPanServiceListener variable zweimal zuweist.
    EInmal im klassenrupf und im kontrucktor. Somit hievt es zwei Instanzen.

    Auch solltest nur primitive Daten Typen im Klassen Rumpf setzen.
    In android eigentlich keine Statements im Klassenkampf.
    Dazu ist der kostrucktor da.

    keine Instanzen mit new im Klassen Rumpf . das nimmt android übel bei Java auf dem pc geht das einfacher.
    Ein Feedback auf Tipps ist auch schön. :P
  • Danke für die Info.
    Ja das mit dem 2 mal zuweisen war ein Fehler. Das wollte ich so eigentlich gar nicht.
    Ich hab nun aber auch so wie es aussieht mein Problem gelöst.
    Ich musste den "tetheringState" noch zusätzlich in Zeile 22 und 28 abfragen. Das hatte ich total vergessen bzw. es war mir erst gar nicht bewusst.
    Hoffe mal das beim testen nicht noch was auffällt.
    Danke und Gruß

    Quellcode

    1. @Override
    2. public void onServiceConnected(final int profile,
    3. final BluetoothProfile proxy) {
    4. Log.i(TAG, "Class Tethering > onServiceConnected " );
    5. try {
    6. tetheringState = (Boolean) proxy.getClass().getMethod("isTetheringOn").invoke(proxy, new Object[0]); // globale Variable siehe ONServiceConnected
    7. // tetheringState = (Boolean) proxy.getClass().getMethod("isTetheringOn", new Class[0]).invoke(proxy, new Object[0]);
    8. Log.i(TAG, "Class Tethering > onServiceConnected - tetheringState = " + tetheringState );
    9. } catch (IllegalAccessException e) {
    10. e.printStackTrace();
    11. } catch (InvocationTargetException e) {
    12. e.printStackTrace();
    13. } catch (NoSuchMethodException e) {
    14. e.printStackTrace();
    15. }
    16. synchronized (mutex) {
    17. try {
    18. if (buttonPush && !tetheringState){ // buttonPush wird übergeben um abzufragen ob wirklich ein button gedrückt wurde
    19. mSetBTTetheringOn.invoke(mBTSrvInstance, true);
    20. tetheringState = (Boolean) proxy.getClass().getMethod("isTetheringOn").invoke(proxy, new Object[0]); // globale Variable siehe ONServiceConnected
    21. // tetheringState = (Boolean) proxy.getClass().getMethod("isTetheringOn", new Class[0]).invoke(proxy, new Object[0]);
    22. Log.i(TAG, "Class Tethering > onServiceConnected - tetheringState = " + tetheringState );
    23. Log.i(TAG, "Class Tethering > Tethering ON");}
    24. else if (buttonPush && tetheringState){
    25. mSetBTTetheringOn.invoke(mBTSrvInstance, false);
    26. tetheringState = (Boolean) proxy.getClass().getMethod("isTetheringOn").invoke(proxy, new Object[0]); // globale Variable siehe ONServiceConnected
    27. // tetheringState = (Boolean) proxy.getClass().getMethod("isTetheringOn", new Class[0]).invoke(proxy, new Object[0]);
    28. Log.i(TAG, "Class Tethering > onServiceConnected - tetheringState = " + tetheringState );
    29. Log.i(TAG, "Class Tethering > Tethering OFF");
    30. }
    31. } catch (IllegalAccessException e) {
    32. e.printStackTrace();
    33. } catch (InvocationTargetException e) {
    34. e.printStackTrace();
    35. } catch (NoSuchMethodException e) {
    36. e.printStackTrace();
    37. }
    38. buttonPush = false;
    39. }
    Alles anzeigen