1. Hast Du Lust, bei uns mitzuarbeiten und das AH-Team zu verstärken? Alle Details zu dieser aktuellen Herausforderung findest Du hier.
  1. CJ0202, 05.01.2011 #1
    CJ0202

    CJ0202 Threadstarter Neuer Benutzer

    Hallo Leute!

    Ich steh seit Tagen vor einem Problem und bekomm es einfach nicht auf die Reihe.

    Ich möchte ein App programmieren, dass via Bluetooth als Fernbedienung zur Farbsteuerung eines LED- Cubes dient.

    Der ganze grafische Teil war nicht so das Problem...

    BLUETOOTH:

    Das Manifest.xml steht. Alles für Bluetooth eingebunden.
    BluetoothChatService.java vom Sample BluetoothChat übernommen.
    DeviceListActivity.java von Sample BluetoothChat übernommen.

    Mein Problem:

    Ich habe 12 Buttons.
    Bei jedem Button soll ein anderer Wert über Bluetooth an den Empfänger geschickt werden (Dort werden dann entsprechend Programme aufgerufen)

    z.b. für PlayButton

    Was muss ich onClick als Parameter eintragen, um über OutStream einen Wert zu senden?

    mPlayButton = (Button) findViewById(R.id.btnplay);
    mPlayButton.setOnClickListener(new OnClickListener()
    {
    public void onClick(View v)
    {

    }

    Hoffe es kann mir jemand helfen

    Lg. Chris

    Fernbedienung.JPG

    Den Anhang LightCube.txt betrachten
     
  2. the_alien, 05.01.2011 #2
    the_alien

    the_alien Android-Lexikon

    Du übergibst gar nichts an onClick, dass macht das Framework für dich.
     
  3. CJ0202, 05.01.2011 #3
    CJ0202

    CJ0202 Threadstarter Neuer Benutzer

    Mhm... ich will ja auch nix an onclick übergeben...

    Nur möchte ich, dass wenn auf den Button Play geklickt wird, dass über Bluetooth der Wert=1 an den Empfänger geschickt wird.

    um den Button Play abzufragen --> der onClickListener

    Und ab da steh ich an... wass muss ich nun als nächstes wo machen?

    Danke für deine Antwort
     
  4. the_alien, 05.01.2011 #4
    the_alien

    the_alien Android-Lexikon

    Was genau ist das Problem? Das du nicht weißt was der LightCube genau erwartet? Wie es gesendet werden soll? Gibt es eine Referenz für den betreffenden Würfel?
     
  5. CJ0202, 05.01.2011 #5
    CJ0202

    CJ0202 Threadstarter Neuer Benutzer

    Mein Problem ist, ich weiß das beim LightCube der Wert 1 ankommen soll, hab aber keine Ahnung, wie ich das im Code umsetze!

    Das ist mein erstes App das ich programmiere (kleiner Teil meiner Diplomarbeit), und anscheinend fehlt mir da das Verständnis zu.

    Wenn ich den onClickListener setzte, dann muss ich ihm doch dort auch sagen, was bei einem Click gemacht werden soll?! Oder?

    Nur, wie sage ich im Code, dass der Wert 1 über Bluetooth gesendet werden soll?
     
  6. the_alien, 05.01.2011 #6
    the_alien

    the_alien Android-Lexikon

    Wert 1 als was? String? Integer? 16bit? 32bit?... ;)

    Im Prinzip musst du nur write(int oneByte) vom OutputStream nutzen und dort die 1 übergeben. Dazu kannst du ja einfach eine neue Methode im Service machen.
    Ich würde aber, wenn du den Code abgeben musst, nicht die OpenSource Samples nehmen, oder nur Teile wiederverwenden.
     
  7. CJ0202, 06.01.2011 #7
    CJ0202

    CJ0202 Threadstarter Neuer Benutzer

    Also anscheinend liegt mein Problem getbyte() und write().
    Da ich einen Integer Wert einlesen möchte, und diese Methoden aber für String Werte gedacht sind.

    Habe nun versucht, das ganze über intValue() zu machen, aber da bekomme ich immer eine Fehlermeldung:

    "Cannot invoke intValue() on the primitive type int"

    Kann mir da jemand weiter helfen?
     
  8. LucianTheDark, 06.01.2011 #8
    LucianTheDark

    LucianTheDark Gewerbliches Mitglied

    Hallo CJ0202,

    wenn ich das richtige verstehe bisher und mir deinen Code anschaue willst du wissen was du in der onClick Methode machen musst um den Button der geklickt wurde abzuarbeiten.

    Code:
    public void onClick(View v)
                {
                    this.sendData(INTEGER.toString(1)); 
                    finish();
                }
    
    So Kannst du einen Integer wert als String sauber übermitteln

    Ansonsten stellt sich mir die Frage ob du die Signatur der Methode nicht einfach ändern kannst da sie ja nicht überschrieben wird:

    Code:
    private void sendData(int data) {}
    
    Grüße
     
  9. the_alien, 06.01.2011 #9
    the_alien

    the_alien Android-Lexikon

    Eine 1 als String ist aber was anderes als eine 1 als int...
     
  10. CJ0202, 06.01.2011 #10
    CJ0202

    CJ0202 Threadstarter Neuer Benutzer

    Genau das ist ja mein Problem. Die 1 als String übermitteln, dazu müsste ich im Code nix ändern. Aber wenn ich die 1 als int übermitteln möchte schon!
     
  11. CJ0202, 06.01.2011 #11
    CJ0202

    CJ0202 Threadstarter Neuer Benutzer

    Wenn ich das wie folgt versuche, bekomme ich die Fehlermeldung (rot):

    The method write(int[]) in the type BluetoothChatService is not applicable for the arguments (int)



    mPlayButton = (Button) findViewById(R.id.btnplay);
    mPlayButton.setOnClickListener(new OnClickListener()
    {
    public void onClick(View v)
    {

    int message = 1;
    sendData(message);


    }
    });

    private void sendData(int message)
    {
    // Check that we're actually connected before trying anything
    if (mChatService.getState() != BluetoothChatService.STATE_CONNECTED)
    {
    Toast.makeText(this, R.string.not_connected, Toast.LENGTH_SHORT).show();
    return;
    }
    // Check that there's actually something to send
    if (message > 0)
    {
    // Get the message bytes and tell the BluetoothChatService to write
    mChatService.write(message);

    // Reset out string buffer to zero and clear the edit text field
    mOutStringBuffer.setLength(0);

    }
    }
     
  12. LucianTheDark, 06.01.2011 #12
    LucianTheDark

    LucianTheDark Gewerbliches Mitglied

    Wieso sollte eine 1 als String was anderes sein als eine 1 als Int.
    Nehmen wir doch mal folgenden Code

    Code:
    Log.d("Integer.toString()", Integer.toString(1));
    Log.d("String 1", "1");
    Log.d("ByteFromInteger",Byte.valueOf(Integer.toString(1)).toString());
    Log.d("ByteFromString",Byte.valueOf("1").toString());
    
    Dann erhalten wir doch erstmal generell die gleiche Ausgabe:

    Code:
    01-06 13:17:59.706: DEBUG/Integer.toString()(343): 1
    01-06 13:17:59.706: DEBUG/String 1(343): 1
    01-06 13:17:59.717: DEBUG/ByteFromInteger(343): 1
    01-06 13:17:59.717: DEBUG/ByteFromString(343): 1
    
    So kann mann dann auch mit

    Code:
    this.sendData(INTEGER.toString(1)); 
    
    Die Daten als String versenden obwohl man ja einen Integer genommen hat.

    Das andere problem was du beschreibst liegt dann an folgendem:

    Alt:
    Code:
     byte[] send = data.getBytes();
     mChatService.write(send);
    
    Neu:
    Code:
    if (message > 0) 
            {
                // Get the message bytes and tell the BluetoothChatService to write
     [COLOR=Red] mChatService.write(message);[/COLOR]
    
    Du hast das Umwandeln in ein ByteArray gleich mitgelöscht das darfst du natürlich nicht machen.


    Wenn dann müsstest du das in
    Code:
    
    int data = 1;
    String binaryString = Integer.toBinaryString(data);
    [COLOR=Red]mChatService.write([/COLOR]binaryString.getBytes()[COLOR=Red]);[/COLOR]
    
    
    umwandeln.

    Das Problem ist das du aber weiter unten im Code

    Code:
    
    private TextView.OnEditorActionListener mWriteListener =
            new TextView.OnEditorActionListener() {
            public boolean onEditorAction(TextView view, int actionId, KeyEvent event) {
                // If the action is a key-up event on the return key, send the message
                if (actionId == EditorInfo.IME_NULL && event.getAction() == KeyEvent.ACTION_UP) {
                    [COLOR=Red]String message = view.getText().toString();[/COLOR]
                    sendData(message);
                }
                if(D) Log.i(TAG, "END onEditorAction");
                return true;
            }
        };
    
    
    Irgendeinen String aus einer Textbox ausliest und den an sendData übergibst dann kannst du den Methoden Kopf auch nicht in int umwandeln oder musst eben hier schon in (int) parsen.


    Grüße Marcel
     
    Zuletzt bearbeitet: 06.01.2011
  13. CJ0202, 06.01.2011 #13
    CJ0202

    CJ0202 Threadstarter Neuer Benutzer

    Ja das stimmt das ich das gelöscht habe, aus dem Grund, dass ich der Variable message den Type int zugewiesen habe. Somit kann ich die Methode getBytes() nicht mehr verwenden, da diese nur für Strings funktionieren.

    Das Problem ist, das ich dieses App als Fernbedienung für einen LightCube verwenden muss. Dass heißt, ich hab auf der Empfängerseite den Bluetoothadapter und dahinter einen ATMEL Microcontroller. Um dort so wenig wie möglich Codezeilen zu haben, möchte ich das ganze als Integer übermitteln- und dass funktioniert soweit ich gelesen habe, mit dem Befehl oneByte() im Outputstream.
     
  14. LucianTheDark, 06.01.2011 #14
    LucianTheDark

    LucianTheDark Gewerbliches Mitglied

    Hallo CJ0202,

    wenn ich an meinen ersten Post denke dann sehe ich es so.
    (Code auf Anfang zurückgestellt) und dann folgendes gemacht:

    Code:
    public void onClick(View v)
                {
                    this.sendData(INTEGER.toString(1));  
                    finish();
                }
    
    sendData muss dann wieder so aussehen:
    
    private void sendData(String data) 
    
    Generell wirst du keinen INT wert als 1 übertragen bekommen sondern den wert als Byte und zwar so viele wie benötigt werden.

    Bsp:

    Code:
            int data = 20;
            String binaryString = Integer.toString(data);
            byte[] byteArray = binaryString.getBytes();
                for (int i = 0; i < byteArray.length; i++) {
                    Log.d("bytes aus nem int an stelle " + i, byteArray[i] + "");
                }
    
            byte[] byteArrayString = "20".getBytes();
                for (int i = 0; i < byteArrayString.length; i++) {
                   Log.d("bytes aus nem int an stelle " + i, byteArrayString[i] + "");
                }
    
    Ausgabe:
    
    01-06 13:51:55.687: DEBUG/bytes aus nem int an stelle 0(563): 50
    01-06 13:51:55.687: DEBUG/bytes aus nem int an stelle 1(563): 48
    01-06 13:51:55.707: DEBUG/bytes aus nem int an stelle 0(563): 50
    01-06 13:51:55.707: DEBUG/bytes aus nem int an stelle 1(563): 48
    
    Wie man sieht werden für den INT wert 20 in den vorhandenem Byte Array die zahlen 50, 48 abgelegt und diese würdest du an deinen Microcontroller gesendet bekommen.

    Grüße Marcel
     
  15. the_alien, 06.01.2011 #15
    the_alien

    the_alien Android-Lexikon

    Lieber Marcel, mit deinem letzten Beitrag hast du dir doch selber erklärt warum eine 1 als Int nicht gleich einer 1 als String ist...
     
  16. CJ0202, 13.01.2011 #16
    CJ0202

    CJ0202 Threadstarter Neuer Benutzer

    So gute Neuigkeiten, das Senden von Daten funktioniert bereits.

    Nun stehe ich vor dem nächsten Problem.

    Bei einem längeren Tastendruck soll, je nachdem wie lange der Butten gedrückt wird, ein Wert gesendet werden, allerdings in Echtzeit.

    Warum? Ganz einfach, ich möchte damit eine LED dimmen.

    Hat jeamand eine Ahnung, wie ich das hinbekomme?

    Danke im Vorraus.
     
  17. AtzeDePeng, 14.01.2011 #17
    AtzeDePeng

    AtzeDePeng Android-Hilfe.de Mitglied

    Probier es doch einfach mit:

    bei onLongClick einen Timer zu starten, in dem du dann was auch immer machst.. (*zaunfahl MotionEvent.ACTION_UP)

    Axo es gibt übrigens eine echt gute Reference zum SDK wo man genau sowas nachlesen kann. *fg
     
    Zuletzt bearbeitet: 14.01.2011
  18. CJ0202, 14.01.2011 #18
    CJ0202

    CJ0202 Threadstarter Neuer Benutzer

    Danke für die Antwort,

    Das ganze mit einem Timer zu machen war mir klar.
    Allerdings habe ich dabei das Problem, dass die Daten erst gesendet werden, wenn der ich den Button wieder loslasse.

    Somit kann ich aber das dimmen einer LED nich realisieren.

    Ich müsste alle 5 - 10ms die Daten senden.

    Das ist das Problem, dass ich lösen muss.
     
  19. CJ0202, 01.02.2011 #19
    CJ0202

    CJ0202 Threadstarter Neuer Benutzer

    Hallo Leute,

    So, wieder mal ne Frage zu meinem kleinen Projekt...

    Wie kann ich am besten einen Timer realisieren?
    Bitte um Beispielcode.

    Danke
     
Die Seite wird geladen...
Ähnliche Themen Forum Datum
[OFFEN] Android app selber entwickeln mit Bluetooth Android App Entwicklung 13.10.2017
[ERLEDIGT] Probleme mit Bluetooth / Beam Ordner Android App Entwicklung 25.07.2017
[ERLEDIGT] Von SPP seriell per Bluetooth lesen Android App Entwicklung 26.04.2017
Bluetooths Android App Entwicklung 02.03.2017
Feststellen, ob Bluetooth-Verbindung noch existiert Android App Entwicklung 07.02.2017
TTL -> USB -> Bluetooth Android App Entwicklung 19.01.2017

Users found this page by searching for:

  1. android bluetooth programmieren

    ,
  2. bluetooth app programmieren

    ,
  3. fernbedienung app erstellen

    ,
  4. android bluetooth fernbedienung,
  5. Bluetooth Fernbedienung app ?,
  6. bluetooth fernbedienung android
Du betrachtest das Thema "Bluetooth Fernbedienung" im Forum "Android App Entwicklung",