Die Versuche habe ich mittlerweile wieder gelöscht, dann werde ich mich am Wochenende nochmal dransetzen und über die Probleme berichten. Danke
Beiträge von Pixhawk
-
-
Das hab ich auch schonmal gehört,das sich hier ein Service besser eignet, jedoch sind mir die Services für den Anfang zu kompliziert (Ich bekomms nicht hin...). Andere Möglichkeiten gibts dann aber wohl eher nicht?
-
Hi,
Ich entwickel gerade eine app, bei der man zunächst über die Spracheingabe von google einen Befehl eingibt. Diesen lass ich dann durch eine Datenbank, welche mir den zugehörigen String-Wert zurückgibt. Dieser soll dann per Bluetooth versendet werden.
Für die Spracheingabe habe ich mich hier orientiert: https://github.com/derAndroidP…utorial/MainActivity.java.
Momentan lass ich den Text in ein Textfeld schreiben, welches ich dann beim druck auf Button "senden" auslesen lasse und versende. Dies Funktioniert.Doch während der Googlespracheingabe kann ich nicht direkt auf meine Bluetoothklasse zugreifen, da sich ja ein neues fenster öffnet (Google spracheingabe) und somit das hintere pausiert wird (somit auch die verbindung zum Bluetoothgerät-> Bluetooth ist eine andere klasse die in oncreate initalisiert wird).
Demnach suche ich ein Befehl, der ausgeführt wird, nachdem das Spracheingabefenster z.B. 3 Sekunden geschlossen ist. Gibts sowas?
Vielen lieben Dank!
-
Wow, Danke für deine Hilfe!
Habe es jetzt hinbekommen, auch ohne Service
Da muss ich wohl mich noch ein bisschen einarbeiten...
Ich möchte damit über eine App an ein Arduino Befehle senden, welcher dann Servomotoren ansteuert (Wird eine Roboterhand).Vielen Dank für deine Ausführlichen Erklärungen, du hast mir sehr geholfen! Konnte es jetzt so lösen, das die Verbindung bei jeder neuen Activity aufgebaut wird. Geht aber so schnell das es kaum auffällt... Funktioniert soweit
Liebe GrüßePixhawk
-
Zum Verbindungsaufbau: Ich habe die Mac-adresse in der App eingegeben und mich mit dem hc05-Modul gepaart. Beim öffnen der App auf dem smartphone verbindet sich diese von allein mit dem HC-05-das funktioniert. Hab mal meinen Code für den Hintergrund-Service angehängt(Ab Zeile 85 fängt die Bluetooth klasse an (Ich weiß, besser ist ne neue Klasse anlegen..)). Starte den Service in der Main mit: Intent service = new Intent(this, Hintergrund.class); startService(service);. Wie kann ich nun Zeile 78 am besten in meinen anderen Klassen aufrufen/Daten übermitteln? Geht das ganz normal wie bei Methoden anderer Klassen?
Danke für deine Geduld!
Java
Alles anzeigenpackage com.example.bluetooth1; import android.app.Activity; import android.app.Service; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothSocket; import android.content.Intent; import android.os.*; import android.os.Process; import android.widget.Toast; import java.io.OutputStream; import java.util.UUID; import java.io.IOException; import java.lang.reflect.Method; import android.bluetooth.BluetoothDevice; import android.os.Build; import android.os.Bundle; import android.util.Log; public class Hintergrund extends Service { private static final String TAG = "bluetooth1"; private Looper mServiceLooper; private ServiceHandler mServiceHandler; @Override public void onCreate() { // To avoid cpu-blocking, we create a background handler to run our service HandlerThread thread = new HandlerThread("TutorialService", Process.THREAD_PRIORITY_BACKGROUND); // start the new handler thread thread.start(); mServiceLooper = thread.getLooper(); // start the service using the background handler mServiceHandler = new ServiceHandler(mServiceLooper); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Toast.makeText(this, "onStartCommand", Toast.LENGTH_SHORT).show(); // call a new service handler. The service ID can be used to identify the service Message message = mServiceHandler.obtainMessage(); message.arg1 = startId; mServiceHandler.sendMessage(message); return START_STICKY; } protected void showToast(final String msg){ //gets the main thread Handler handler = new Handler(Looper.getMainLooper()); handler.post(new Runnable() { @Override public void run() { // run this code in the main thread Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_SHORT).show(); } }); } @Override public IBinder onBind(Intent intent) { return null; } // Object responsible for private final class ServiceHandler extends Handler { public ServiceHandler(Looper looper) { super(looper); } @Override public void handleMessage(Message msg) { Blauzahn bl1=new Blauzahn(); bl1.sendData("DIESEN TEXT WILL ICH SENDEN"); } public class Blauzahn extends Activity { private static final String TAG = "bluetooth1"; //Bluetooth Adapter Initialisierung private BluetoothAdapter btAdapter = null; private BluetoothSocket btSocket = null; private OutputStream outStream = null; // SPP UUID service private final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); // MAC-address von unserem Bluetooth modul private String address = "98:D3:31:FB:6C:B2"; //Wird beim ersten Start aaufgerufen @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //checkt, ob Bluetooth am Gerät aktiviert ist btAdapter = BluetoothAdapter.getDefaultAdapter(); checkBTState(); } //Bluetooth-hardware check private BluetoothSocket createBluetoothSocket(BluetoothDevice device) throws IOException { if(Build.VERSION.SDK_INT >= 10) { try { final Method m = device.getClass().getMethod("createInsecureRfcommSocketToServiceRecord", new Class[] { UUID.class }); return (BluetoothSocket) m.invoke(device, MY_UUID); } catch (Exception e) { Log.e(TAG, "Could not create Insecure RFComm Connection",e); } } return device.createRfcommSocketToServiceRecord(MY_UUID); } //Bluetooth verbindungsaufbau @Override public void onResume() { super.onResume(); Log.d(TAG, "...onResume - try connect..."); BluetoothDevice device = btAdapter.getRemoteDevice(address); try { btSocket = createBluetoothSocket(device); } catch (IOException e1) { errorExit("Fatal Error", "In onResume() and socket create failed: " + e1.getMessage() + "."); } // Verbindungsaufbau-blockiert, bis verbunden btAdapter.cancelDiscovery(); //Data-Stream wird erstellt um Verbindungsaufbau zum Server durchzusetzen Log.d(TAG, "...Connecting..."); try { btSocket.connect(); Log.d(TAG, "...Connection ok..."); } catch (IOException e) { try { btSocket.close(); } catch (IOException e2) { errorExit("Fatal Error", "In onResume() and unable to close socket during connection failure" + e2.getMessage() + "."); } } Log.d(TAG, "...Create Socket..."); try { outStream = btSocket.getOutputStream(); } catch (IOException e) { errorExit("Fatal Error", "In onResume() and output stream creation failed:" + e.getMessage() + "."); } } @Override public void onPause() { super.onPause(); Log.d(TAG, "...In onPause()..."); if (outStream != null) { try { outStream.flush(); } catch (IOException e) { errorExit("Fatal Error", "In onPause() and failed to flush output stream: " + e.getMessage() + "."); } } try { btSocket.close(); } catch (IOException e2) { errorExit("Fatal Error", "In onPause() and failed to close socket." + e2.getMessage() + "."); } } //Überprüft Bluetooth Zustand private void checkBTState() { if(btAdapter==null) { errorExit("Fatal Error", "Bluetooth not support"); } else { if (btAdapter.isEnabled()) { Log.d(TAG, "...Bluetooth ON..."); } else { //Zeigt an, dass Bluetooth angeschaltet werden muss Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(enableBtIntent, 1); } } } //Fehlermeldung private void errorExit(String title, String message) { Toast.makeText(getBaseContext(), title + " - " + message, Toast.LENGTH_LONG).show(); finish(); } //Methode um Daten über Bluetooth zu senden public void sendData(String message) { byte[] msgBuffer = message.getBytes(); Log.d(TAG, "...Send data: " + message + "..."); try { outStream.write(msgBuffer); } catch (IOException e) { String msg = "In onResume() and an exception occurred during write: " + e.getMessage(); if (address.equals("00:00:00:00:00:00")) msg = msg + ".\n\nUpdate your server address from 00:00:00:00:00:00 to the correct address on line 35 in the java code"; msg = msg + ".\n\nCheck that the SPP UUID: " + MY_UUID.toString() + " exists on server.\n\n"; errorExit("Fatal Error", msg); } } } } }
-
Danke für deine schnelle Antwort!
""[i]Nun habe ich ein Menü, und dementsprechend auch zwei Klassen geschrieben, durch die ich mittels einem Klick, auf die Menüoberfläche, gelange." Damit meist du bestimmt Activitys oder ?"[/i]
Ja, habe zwei activitys mit dazugehörigen Java-klassen geschrieben, sorry:)
Das mit den Service klingt nach genau dem, wonach ich gesucht habe. Da ich sehr unerfahren mit Android bin habe ich mir auch hier ein Beispielcode mal rausgesucht: http://blog.rhesoft.com/2016/0…-services-android-studio/
Jedoch weiß ich nicht, wie ich im Service Handler unter HandleMessage meinen Code implementieren soll? Das Problem liegt (denke ich) bei der Vererbung, da ich nun ja service und nicht mehr Activity extende...
Das mit dem Verbindungsaufbau und -ende muss ich auch erst noch lösen, bis jetzt habe ich es einfach noch da stehen. Meinst du so etwas in der Art wie bei betätigung eines Buttons on wird onResume() aufgerufen, bei off dann onPause()? Ich finde in der jetzigen methode garnicht wodurch onResume() und onPause() das aufgerufen wird...
Danke nochmals für dein großartige Hilfe! -
Guten Tag,
Ich versuche eine App zu programmieren, mit welcher ich Strings an einen Arduino (hc05) schicken kann. Als Beispielcode habe ich mich an diesem hier orientiert: solderer.tv/data-transfer-between-android-and-arduino-via-bluetooth/
Funktioniert auch soweit bestens. Nun habe ich ein Menü, und dementsprechend auch zwei Klassen geschrieben, durch die ich mittels einem Klick, auf die Menüoberfläche, gelange. Gedacht war, durch ein weiteren Klick auf einem Button in der jeweiligen Klasse die oben verlinkte Bluetoothklasse (heißt bei mir Blauzahn) aufzurufen:
Blauzahn bl1=new Blauzahn();
bl1.sendData("10110");
Jedoch bin ich dann ja garnicht dauerhaft mit meinem Bluetoothmodul verbunden, sondern erst wenn ich Blauzahn aufruf... Da der Verbindungsaufbau immer etwas braucht bekomme ich hier dann den Fehler das ich nicht verbunden bin.
Nun zur eigentlichen Frage:
Gibt es eine Möglichkeit die Bluetooth-klasse dauerhaft aktiv zu haben, egal in welcher Oberfläche/Klasse ich mich befinde?
Hoffe es ist einigermaßen Verständlich,
Guten Rutsch!