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.
public ClassTethering classTethering = new ClassTethering(this);
........
if ((view == btnTetheringState)){
check = classTethering.getTetheringState();
Toast.makeText(getApplicationContext(), "Tethering State = " + check, Toast.LENGTH_LONG).show();
}
Hier die Klasse ClassTethering
package com.herrm_no.bluetoothtetheringcarnew;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothProfile;
import android.content.Context;
import android.util.Log;
import android.widget.Toast;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class ClassTethering {
// is Tethering Enabled
private Class<?> classBluetoothPan = null;
private Constructor<?> mBTPanCtor = null;
private Object mBTSrvInstance = null;
private Class<?>[] noparams = {};
private Class[] paramSet = new Class[1];
private Method mIsBTTetheringOn;
private Method mSetBTTetheringOn;
private Object mutex = new Object();
// END
// private Boolean check;
public Boolean tetheringState = false;
// public Boolean tetheringActivate = false;
private static final String TAG = "TAG";
// private BluetoothAdapter mBluetoothAdapter = null;
private Context context;
// private Integer mWait = 200;
private BTPanServiceListener mBTPanServiceListener = new BTPanServiceListener(context);
private boolean buttonPush = false;
public Boolean getTetheringState() {
boolean state;
state = isTetheringEnabled();
// state = tetheringState;
Log.i(TAG, "Class Tethering > getTetheringState - state = " + state );
return state; // globale Variable siehe ONServiceConnected
}
public void setTetheringState(Boolean state) {
this.tetheringState = state; // globale Variable siehe ONServiceConnected
setTetheringEnabled(state);
}
public void initializeOnClickListerner()
{
isTetheringEnabled();
}
public void setButtonPush(boolean buttonPush)
{
this.buttonPush = buttonPush;
}
public ClassTethering(Context context) {
this.context = context;
mBTPanServiceListener = new BTPanServiceListener(context);
// isTetheringEnabled();
}
private boolean isTetheringEnabled() {
Log.i(TAG, "Class Tethering > isTetheringEnabled Start = " );
paramSet[0] = boolean.class;
// Boolean test;
try {
classBluetoothPan = Class.forName("android.bluetooth.BluetoothPan");
mSetBTTetheringOn = classBluetoothPan.getDeclaredMethod("setBluetoothTethering", paramSet);
mIsBTTetheringOn = classBluetoothPan.getDeclaredMethod("isTetheringOn", noparams);
mBTPanCtor = classBluetoothPan.getDeclaredConstructor(Context.class, BluetoothProfile.ServiceListener.class);
mBTPanCtor.setAccessible(true);
synchronized (mutex) {
mBTSrvInstance = mBTPanCtor.newInstance(context, mBTPanServiceListener);
// test = (Boolean) mIsBTTetheringOn.invoke(mBTSrvInstance, (Object []) noparams);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
Log.i(TAG, "Class Tethering > isTetheringEnabled END - tetheringState " + tetheringState );
return tetheringState; // global Varible > OnServiceListener
}
private void setTetheringEnabled(boolean state)
{
try {
classBluetoothPan = Class.forName("android.bluetooth.BluetoothPan");
mSetBTTetheringOn = classBluetoothPan.getDeclaredMethod("setBluetoothTethering", paramSet);
mIsBTTetheringOn = classBluetoothPan.getDeclaredMethod("isTetheringOn", noparams);
mBTPanCtor = classBluetoothPan.getDeclaredConstructor(Context.class, BluetoothProfile.ServiceListener.class);
mBTPanCtor.setAccessible(true);
synchronized (mutex) {
mBTSrvInstance = mBTPanCtor.newInstance(context, mBTPanServiceListener);
}
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public class BTPanServiceListener implements BluetoothProfile.ServiceListener {
private final Context context;
public BTPanServiceListener(final Context context) {
Log.i(TAG, "Class Tethering > BTPanServiceListener " );
this.context = context;
}
@Override
public void onServiceConnected(final int profile,
final BluetoothProfile proxy) {
Log.i(TAG, "Class Tethering > onServiceConnected " );
try {
tetheringState = (Boolean) proxy.getClass().getMethod("isTetheringOn", new Class[0]).invoke(proxy, new Object[0]); // globale Variable siehe ONServiceConnected
Log.i(TAG, "Class Tethering > tetheringState = " + tetheringState );
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
synchronized (mutex) {
try {
if (buttonPush && !tetheringState){ // buttonPush wird übergeben um abzufragen ob wirklich ein button gedrückt wurde
mSetBTTetheringOn.invoke(mBTSrvInstance, true);
Log.i(TAG, "Class Tethering > Tethering ON");}
else if (buttonPush && tetheringState){
mSetBTTetheringOn.invoke(mBTSrvInstance, false);
Log.i(TAG, "Class Tethering > Tethering OFF");
}
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
buttonPush = false;
}
}
@Override
public void onServiceDisconnected(final int profile) {
}
}
}
Alles anzeigen