Wie die Botschaft zu vermitteln, um die Bluetooth-Aktivität von einer anderen Aktivität

Ich Baue eine Android-app, control RC-car. Diese app haben sich zwei Aktivitäten, Bluetooth-Aktivität und Richtung Aktivität.

Bluetooth-Aktivität, die ich verwendet, Listenansicht, um eine Liste aller Geräte und schließen Sie mit ein. Ich nutzte die zwei-Klassen zur Verfügung gestellt von Android „ConnectThread“ und „ConnectedThread“. Meine Hauptaufgabe ist es, um nur zu senden Charakter für das RC-car zu bewegen. Dieser Charakter wird erzeugt durch die Richtung der Aktivität, die verwenden Beschleunigungs-sensor, um zu erstellen einen Charakter.

Probleme:

1. so senden Sie ein Zeichen aus der Richtung der Aktivität, um die Bluetooth-Aktivität?

2. Nachdem die Bluetooth-Aktivität erhielt den Charakter so senden Sie es über die Bluetooth-Verbindung?

3. Muss ich die beiden Klassen „ConnectThread“ und „ConnectedThread“ zu verbinden und senden oder nur einer von Ihnen?

PS. Ich bin Anfänger und ich habe versucht, viele Dinge wie Vorsatz, gemeinsame Vorlieben, und Bundle. Aber jedes mal, wenn ich versuche, ein Fehler auftreten.

  • Für Ihre erste Frage, die Verwendung von Absicht und übergeben entsprechenden Daten in der Absicht aufrufen
  • Ihre zweite Frage: Sie schreiben in der Regel der Wert für ein Merkmal oder eine Dienstleistung. Diese sind sehr grundlegende Prinzipien, die gezeigt werden in den Bluetooth-LE-Beispiel-Projekt Android bietet. Das gleiche gilt für die Frage 3. Vielleicht sollten Sie Lesen, auf das erste, oder geben Sie einige code, die Sie versucht haben.
  • Ich glaube, dass er mit klassischen Bluetooth und nicht von der BLE nach der Erwähnung von ConnectThread und ConnectedThread. Dieser Google-Anleitung erklärt alles, aber verwendet eine Hölle von einem Muster, das ist fast nicht lesbar und viel zu lange, anstatt auf sich auf die die meisten import-Teile. Dies ist die zweite Frage, die ich heute gesehen mentionning dieser Anleitung und ich selbst Schwierigkeiten hatte, als ich anfing mit es von Grund auf nicht zu wissen, eine verdammte Ding über Bluetooth…
  • Ich verstehe, wo du herkommst, kann ich nicht kommentiert habe, dass basierend auf Annahmen allein. Jedoch, in der Verteidigung, die Google guide; als ich zuerst anfing, mit Bluetooth habe ich finde es unglaublich hilfreich, wirklich! Ich denke, es unterscheidet sich pro person. Jedoch, ich bin damit einverstanden, dass der guide ist ziemlich hell, durch zu bekommen, haha.
  • ja du hast Recht, weil dieses Handbuch legt die Basis für alles, was Sie brauchen, um loslegen mit einer app, fungiert als client und als server. Es ist nur schwer zu verstehen, alles, was mit dieser seltsamen Art von Unterklassen von Thread ^^
InformationsquelleAutor a.alharazi | 2016-01-08



2 Replies
  1. 1

    Alright, let ‚ s machen es einfach für den moment.

    Wie bereits von @Zimano Kommentare:

    1. Die Sie verwenden können, wie Sie versucht, Absichten zu teilen grundlegende Daten
      (Strings, ints, floats, bytes) zwischen Ihren Tätigkeiten, die
      häufigste Weg, dies zu tun in Android. Mehr details hier: https://stackoverflow.com/a/19287072/3535408
    2. Wenn Sie brauchen, um senden von Daten über die Bluetooth-Verbindung, müssen Sie
      Zugriff auf die ConnectedThread wenn Sie implementiert Google
      Lösung. Aber wenn Sie Anfänger sind Sie, dass Sie (und es ist nicht
      ein problem oder falsch) bewusst sein, dass Android die Aktivitäten Leben
      Zyklus
      . Dies bedeutet im Grunde, dass irgendwann eine Aktivität ist
      erstellt, beginnt, hält und endet schließlich ganz zerstört. Also, wenn
      Sie begann Ihre Verbindung und die Verbundenen threads innerhalb einer Aktivität
      und Sie wechseln zu einer anderen Tätigkeit, es ist hoch und unvoidable
      die Gefahr, dass diese threads werden getötet als die Aktivität begann, die
      Sie wird zerstört für die Befreiung der Ressourcen (teuer wichtig
      für das Android-öko-system).

    Zwei Lösungen. Eine einfache, aber nicht ratsam, und ein bisschen kompliziert, ist aber Teil des Android-SDK und-Politik.

    1. Statischen Kontext oder
    2. Dienstleistungen ;

    Im ersten Fall, verschieben Sie den gesamten code im Zusammenhang mit der Bluetooth-außerhalb Ihrer Tätigkeit in eine andere Klasse. Platzieren Sie es in einem statischen Kontext, so dass es kann verwendet werden, überall in der app (das ist, warum es eine sehr schlechte design-Muster, aber ein funktionierendes…). Dann können Sie auf Ihre Bluetooth-threads überall, und Sie können verwenden Sie die Methode write, um Daten zu senden ;

    Im zweiten Fall, verschieben Sie den gleichen code in einem service. Dienstleistungen sind Teil des Android-SDK und sind der Weg zu gehen für das, was Sie erreichen wollen. Aber es gibt eine Bindung an eine Tätigkeit. Ich wollte nicht mit einer Vielzahl von Dienstleistungen, die in meiner Erfahrung, so bin ich nicht sicher, ob man bind/unbind-Android-Dienstleistungen wird ohne stoppen der Bluetooth-threads nebst beim Wechsel zwischen den Aktivitäten. Mehr details hier : http://developer.android.com/intl/es/guide/components/services.html

    Trotzdem hoffe ich, dass ich genug Erklärungen, so dass Sie arbeiten können, auf Ihr Problem. Wenn Sie Fragen haben werde ich versuchen Sie zu beantworten.

    • Solide Antwort; ich mag, dass Sie zwei Lösungen für die OP zu versuchen. Intents sind auch in der Bluetooth-Beispielprojekt passieren Dinge um, passt also schön, wenn die OP wäre mit dieser Anleitung/Beispiel-Projekt.
    • wie @Zimano dies eine Solide Antwort. Thnak Sie sehr viel
  2. 0

    @Mackovich ich Danke Ihnen sehr viel, und auch die anderen die versucht haben zu helfen. Zum Wohle der anderen Menschen, die gleiche problem. dies ist meine Lösung nach der Suche für eine lange Zeit.

    P. S eine Sache, die ich erwähnen möchte, lese ich über „Dienste“, und es ist der richtige Weg. Aber ich habe es in anderen einfachen Weg.

    Habe ich zwei Aktivitäten (1) die Bluetooth Suche Aktivität, und (2) Richtung Aktivität.

    Mein problem war, dass ich versuchte, alles zu tun, die Bluetooth-stuuf in der Aktivität (1) und senden Sie einfach den Befehl aus Aktivität (2) zu (1) die schicken es zu dem RC-Car. Und das ist problem, weil wie @Mackovich, sagte der Tätigkeit kann zerstört.

    Was habe ich zu lösen?

    In der Aktivität (1) ich habe eine ListView zur Anzeige der Bluetooth-Geräte Rundfunk-und um diese Geräte info. Verwenden Sie dann eine Absicht, übergeben Sie diese info auf die Aktivität (2). Stiftete zu verbinden und zu versuchen, zu senden, in der Aktivität (1).

    Hinweis:, um eine Bluetooth-Verbindung benötigen Sie zwei wichtige Informationen:

    1. – UUID haben (was wir aleard haben).

    2. MAC-Adresse des Ziel-Bluetooth-Gerät. (Wir bekommen es bilden Aktivität(1)).

    Also müssen wir als erstes Bluetooth-Adapter, Array-Adapter (Zur Festlegung der info-Geräte gefunden) und Broadcast Receiver.

    //Declare Bluetooth Stuff
        BluetoothAdapter mBluetoothAdapter; //Make instance of the Bluetooth
        ArrayAdapter mArrayAdapter; //Array where the devices will be stored
        private static final int ENABLE_BT_REQUEST_CODE = 1;
        private static final int DISCOVERABLE_BT_REQUEST_CODE = 2;
        private static final int DISCOVERABLE_DURATION = 300;
        public static String EXTRA_ADDRESS = "Device_MAC_Address";
    
        //In order for the bluetooth to discover the devices that broadcasting and obtain their info.
        BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
            public void onReceive(Context context, Intent intent) {
                String action = intent.getAction();
                //Whenever a remote Bluetooth device is found
                if (BluetoothDevice.ACTION_FOUND.equals(action)) {
                    //Get the BluetoothDevice object from the Intent
                    BluetoothDevice mBluetoothDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                    //Add the name and address to an array adapter to show in a ListView
                    mArrayAdapter.add(mBluetoothDevice.getName() + "\n" + mBluetoothDevice.getAddress());
                } else {
                    Toast.makeText(getApplicationContext(), "No Paired Bluetooth Devices Found.", Toast.LENGTH_LONG).show();
                }
            }
        };

    Dann, nachdem der Benutzer wählen Sie eine der aufgeführten Geräte. Wir erhalten die Geräte-MAC-Adresse und senden Sie es an Aktivität (2) zum verbinden und senden.

    //Obtain the value of the item clicked as String value
                    String itemValue = (String) DevicesList.getItemAtPosition(position);
                    //Extract the MAC Address from the String value above
                    String MAC = itemValue.substring(itemValue.length() - 17);
                    //Make an intent to start next activity.
                    Intent i = new Intent(BluetoothActivity.this, NavigationActivity.class);
                    //Change the activity.
                    i.putExtra(EXTRA_ADDRESS, MAC); //this will be received at  NavigationActivity(class) Activity
                    startActivity(i);
                }
            });

    Nun, Wir lösen das problem der übergabe von Daten zwischen Aktivitäten. Denn es gibt keine Notwendigkeit Feind übergeben von Daten.

    War dies für das Problem (1) im original-post.

    Da für problem (2).
    Das problem ist, wenn Sie den code von Google zur Verfügung gestellt. Es gibt Dinge, die Sie sich anpassen müssen. In der Klasse ConnectThread insaid run Methode, die Sie brauchen, um zu definieren, das Objekt der Klasse ConnectedThread Sie erstellt haben. Von diesem Weg passieren Sie die BluetoothSocket variable verwendet, um eine Verbindung zum senden von Daten werfen.

    … Und das löst auch das problem (3). Und ja du brauchst zwei Klassen.

    Wie gesagt in der Ursprünglichen Post-ich bin Anfänger. Also dachte ich, was ist der beste Weg, um zu erklären, um die Anfänger zu denken wie einer. In diesem Fall bin ich tatsächlich Anfänger.

    Ich hoffe, das wird helfen, jemand anderes. Und BITTE, wenn Sie etwas finden, was in diesem falsch ist. Sagen Sie mir BITTE, es zu korrigieren.

    Danke.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.