Hallo,
mittlerweile läuft die App, allerdings bin ich mir nicht sicher ob das alles richtig ist.
Ich kann gern mein Code auch hier auflisten, wollte aber im 1. Schritt halt erst mal fragen wie die generelle Vorgehensweise sein sollte.
ich habe es derzeit so gelößt, dass ich im OnCreate die Verbindung aufbaue und den "Listener" starte.
In OnDestroy wird der "Lister" und die Bluetoothverbindung beendet.
Die Frage wäre halt, wenn nun das Tablet gedreht wird, und sich "nur" die Orientierung ändert, muss dann die Verbindung und der Listener beendet werden?
Also hier mal der Code, der mit Bluetooth zusammenhängt.
(aus vielen Beispielen zusammengetragen)
OnCreate:
myBluetooth = BluetoothAdapter.getDefaultAdapter();
if(myBluetooth == null)
{
msg("Bluetooth Device Not Available");
} else if (!myBluetooth.isEnabled()) {
classCarrera.isBtOn=false;
Intent turnBTon = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(turnBTon, requCodeBluetooth);
} else {
if(!classCarrera.isOrientationChanging){
classCarrera.isBtOn=true;
}
if(!classCarrera.isBtConnected){ verbinden();}
}
classCarrera.isOrientationChanging=false;
Alles anzeigen
protected void onStart()
{
if (!classCarrera.isListening && classCarrera.isBtConnected){beginListenForData();}
if (classCarrera.Menueaufruf && classCarrera.isBtConnected){
classCarrera.Menueaufruf=false;
OptionenSenden();
}
super.onStart();
}
protected void onDestroy() {
super.onDestroy();
stopWorker=true;
try {
Thread.sleep(500, 0);
}
catch (Exception e){
}
Disconnect();
if (isFinishing()) {
classCarrera.opt.schreiben(this);
if(myBluetooth != null)
{
if (!classCarrera.isBtOn) {
myBluetooth.disable();
}
}
} else {
classCarrera.isOrientationChanging=true;
}
}
Alles anzeigen
Wenn der Bluetooth-Adapter nicht aktiviert war, wird in OnCreate ja die Abfrage gestartet ob aktivieren, wenn ja wird dies hier abgefangen.
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if(resultCode == RESULT_OK){
switch (requestCode) {
case requCodeBluetooth:
verbinden();
break;
...
}
}
}
Hier der Aufruf zum Verbinden:
private void verbinden()
{
pairedDevices = myBluetooth.getBondedDevices();
DeviceFound=false;
if (pairedDevices.size()>0)
{
for(BluetoothDevice bt : pairedDevices)
{
String s=bt.getName();
if (classCarrera.opt.o104_BlueToothName.equals(s)) {
DeviceFound=true;
address=bt.getAddress();
}
}
if (DeviceFound)
{
new ConnectBT().execute(); //Call the class to connect
}
else
{
msg( classCarrera.opt.o104_BlueToothName + " ist nicht gekoppelt");
}
}
else
{
msg("No Paired Bluetooth Devices Found.");
}
}
Alles anzeigen
der eigentliche Verbdungsaufruf läuft ja "asyncron" bzw. in einem eigenen "Thread":
private class ConnectBT extends AsyncTask<Void, Void, Void> // UI thread
{
private boolean ConnectSuccess = true; //if it's here, it's almost connected
@Override
protected void onPreExecute()
{
progress = ProgressDialog.show(LayoutMainActivity.this, "Connecting...", "Please wait!!!"); //show a progress dialog
}
@Override
protected Void doInBackground(Void... devices) //while the progress dialog is shown, the connection is done in background
{
try
{
if (btSocket == null || !classCarrera.isBtConnected)
{
myBluetooth = BluetoothAdapter.getDefaultAdapter();//get the mobile bluetooth device
BluetoothDevice dispositivo = myBluetooth.getRemoteDevice(address);//connects to the device's address and checks if it's available
btSocket = dispositivo.createInsecureRfcommSocketToServiceRecord(myUUID);//create a RFCOMM (SPP) connection
BluetoothAdapter.getDefaultAdapter().cancelDiscovery();
btSocket.connect();//start connection
}
}
catch (Exception e)
{
ConnectSuccess = false;//if the try failed, you can check the exception here
}
return null;
}
@Override
protected void onPostExecute(Void result) //after the doInBackground, it checks if everything went fine
{
super.onPostExecute(result);
if (!ConnectSuccess)
{
msg("Connection Failed.");
btnVerbinden.setBackgroundColor(0xFFF87A7A);
//finish();
}
else
{
msg("Verbunden.");
btnVerbinden.setBackgroundColor(0xFF87F671);
btnVerbinden.setText(R.string.cbVerbunden);
classCarrera.isBtConnected = true;
if (!classCarrera.isListening ){beginListenForData();}
OptionenSenden();
}
progress.dismiss();
}
}
Alles anzeigen
Falls Verbindung erfolgreich, wird der Listener aktiviert und einige Optionen gesendet.
private void OptionenSenden(){
//if (btSocket!=null) {
if (classCarrera.isBtConnected) {
btSenden(getResources().getString(R.string.o1_minGesch_Key) + ";" + Byte.toString(classCarrera.opt.o1_minGeschw));
...
}
}
private void btSenden(String text)
{
if (btSocket!=null)
{
try
{
String s= text+"\n";
btSocket.getOutputStream().write(s.getBytes());
}
catch (IOException e)
{
msg("Fehler beim Senden" + e.toString());
}
}
}
Alles anzeigen
Hier nun der Listener (Verarbeitend der Daten gekürzt)
private void beginListenForData() {
final Handler handler = new Handler();
final byte delimiter = 10; //This is the ASCII code for a newline character
//private boolean stopWorker=false;
//private int readBufferPosition;
stopWorker = false;
classCarrera.isListening=true;
readBufferPosition = 0;
final byte[] readBuffer = new byte[1024];
Thread workerThread = new Thread(new Runnable() {
public void run() {
if (stopWorker){classCarrera.isListening=false;}
while(!Thread.currentThread().isInterrupted() && !stopWorker) {
try {
int bytesAvailable = btSocket.getInputStream().available();
if(bytesAvailable > 0) {
byte[] packetBytes = new byte[bytesAvailable];
btSocket.getInputStream().read(packetBytes);
for(int i=0;i<bytesAvailable;i++) {
byte b = packetBytes[i];
if(b == delimiter) {
byte[] encodedBytes = new byte[readBufferPosition];
System.arraycopy(readBuffer, 0, encodedBytes, 0, encodedBytes.length);
final String data = new String(encodedBytes, "US-ASCII");
readBufferPosition = 0;
handler.post(new Runnable() {
public void run() {
if (data.contains(";"))
{
int i=0;
String[] s = data.substring(0,data.length()-1).split(";");
//........
}
}
});
}else {
readBuffer[readBufferPosition++] = b;
}
}
}
}catch (IOException ex) {
stopWorker = true;
classCarrera.isListening=false;
}
}
}
});
workerThread.start();
}
Alles anzeigen
private void Disconnect()
{
if (btSocket!=null)
{
try
{
btSocket.close(); //close connection
classCarrera.isBtConnected=false;
classCarrera.isListening=false;
btnVerbinden.setBackgroundColor(0xFFF87A7A);
btnVerbinden.setText(R.string.cbVerbinden);
}
catch (IOException e)
{ msg("Fehler beim Trennen" + e.toString());}
btSocket=null ;
}
}
Alles anzeigen