Hallo,
ich habe mir vor Kurzem eine Smartwatch bzw. ein Fitnessarmband gekauft. Und zwar die Samsung Gear Fit. Als ich das Gerät soweit zum Laufen gebracht habe (und das war wirklich nicht schwer), wollte ich wissen, wie man eigene Apps für diese Smartwatch programmieren kann. Auf der Suche nach einem SDK bzw. Tutorials wurde ich zunächst enttäuscht. Von offizieller Seite kann man keine Unterstützung erwarten. Samsung bietet derzeit kein SDK für die Gear Fit an. Also habe ich mich auf die Suche nach Alternativen gemacht. Über xda-developers wurde ich dann letztendlich fündig. Dort gibt es ein SDK inkl. einer Dokumentation zum Download. Hier der Link: xda-developers.
Ich wollte zunächst eine ganz simple App entwickeln. Und zwar eine App, mit der man den Punktestand beim Sport zählen kann ( z. B. für Tennis, Squash, Kickern….)
Hier mal ein Screenshot der App:
Durch Klicken auf das jeweilige Personen-Icon wird der Punktestand hochgezählt. Außerdem kann man den Punktestand zurücksetzen und speichern.
Bei der Realisierung bin ich im Groben so vorgegangen:
Über Android Studio habe ich ein neues Projekt angelegt (Android API 19).
Dann habe ich die Datei cup-v1.0.0.jar in das App Verzeichnis „libs“ kopiert und anschließend über Rechtsklick auf „add as library“ geklickt. Nun kann man die Funktionen innerhalb der Java-Klassen verwenden.
Außerdem muss die Datei „AndroidManifest.xml“ angepasst bzw. erweitert werden werden. Meine sieht dabei so aus:
Anschließend habe ich die Scup-Klasse initialisiert und die Methode onCreate() innerhalb meiner MainActivity entsprechend implementiert:
super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ArrayAdapter adapter = new ArrayAdapter(MainActivity.this, android.R.layout.simple_list_item_1, NAMES); // init scrup Scup scup = new Scup(); try { scup.initialize(getApplicationContext()); if (mHelloCupDialog == null) { mHelloCupDialog = new HelloCupDialog( getApplicationContext()); } else { mHelloCupDialog.finish(); mHelloCupDialog = null; } } catch (SsdkUnsupportedException e) { if (e.getType() == SsdkUnsupportedException.VENDOR_NOT_SUPPORTED) { // throw error } }
Für die eigentliche Programmlogik habe ich eine eigene Klasse implementiert. Zusätzlich stellt die Klasse das Layout zur Verfügung (Buttons, Labels, Icons…). Die Klasse ist nicht besonders ausgereift, aber sie zeigt, wie man von Prinzip her Elemente auf die Smartwatch bringen kann.
package com.example.dennis.sportcounter; import java.util.ArrayList; import java.util.ArrayList; import com.samsung.android.sdk.cup.*; import android.content.Context; import android.graphics.Color; import android.util.Log; /** * Created by Dennis on 08.03.2015. */ public class HelloCupDialog extends ScupDialog { private int pointsPlayer1 = 0; private int pointsPlayer2 = 0; private ScupButton player1Button; private ScupButton player2Button; private ScupButton resetButton; private ScupButton saveButton; private ScupButton exitButton; public HelloCupDialog(Context context) { super(context); } @Override protected void onCreate() { super.onCreate(); this.setWidgetAlignment(ScupDialog.WIDGET_ALIGN_VERTICAL_CENTER); this.addPlayerButtons(); this.resetButton = this.createButton("Reset", 8, ScupButton.ALIGN_LEFT, 0); this.resetButton.setClickListener(new ScupButton.ClickListener() { @Override public void onClick(ScupButton arg0) { player1Button.setText("00"); player2Button.setText("00"); update(); } }); this.resetButton.setPadding(5,5,0,0); this.resetButton.show(); this.saveButton = this.createButton("Save", 8, ScupButton.ALIGN_LEFT, 0); this.saveButton.setPadding(5,5,0,0); this.saveButton.setClickListener(new ScupButton.ClickListener() { @Override public void onClick(ScupButton arg0) { } }); this.saveButton.show(); this.exitButton = this.createButton("Exit", 8, ScupButton.ALIGN_LEFT, 0); this.exitButton.setPadding(5,5,0,0); this.exitButton.setClickListener(new ScupButton.ClickListener() { @Override public void onClick(ScupButton arg0) { } }); this.exitButton.show(); } private void addPlayerButtons() { this.player1Button = this.createButton("00", 18, ScupButton.ALIGN_LEFT, R.drawable.sample); this.player2Button = this.createButton("00", 18, ScupButton.ALIGN_RIGHT, R.drawable.sample); this.player1Button.setPadding(5,0,0,0); this.player1Button.setClickListener(new ScupButton.ClickListener() { @Override public void onClick(ScupButton arg0) { int text = Integer.parseInt(player1Button.getText()); text++; String displayText = Integer.toString(text); if (text < 10) { displayText = "0" + displayText; } player1Button.setText(displayText); //btState.setBackgroundColor(color[i]); update(); } }); this.player1Button.show(); this.player2Button.setPadding(3,0,0,0); this.player2Button.setClickListener(new ScupButton.ClickListener() { @Override public void onClick(ScupButton arg0) { int text = Integer.parseInt(player2Button.getText()); text++; String displayText = Integer.toString(text); if (text < 10) { displayText = "0" + displayText; } player2Button.setText(displayText); //btState.setBackgroundColor(color[i]); update(); } }); this.player2Button.show(); } public ScupButton createButton(String text, int size, int align, int icon) { final ScupButton btState = new ScupButton(this); btState.setAlignment(align); btState.setSingleLineModeEnabled(true); // Text parameter btState.setText(text); if(icon != 0) { btState.setIcon(icon); } btState.setTextSize(size); return btState; } /** * method for creating a label widget * * @param scupDialog * @param txt * @param align * @param color * @param iconId * @param size * @return */ private ScupLabel createLabel(ScupDialog scupDialog, String txt, int align, int color, int iconId, int size) { ScupLabel scupLabel = new ScupLabel(scupDialog); if (iconId != 0) { scupLabel.setIcon(iconId); } scupLabel.setTextSize(size); scupLabel.setTextColor(color); scupLabel.setText(txt); scupLabel.setAlignment(align); scupLabel.show(); return scupLabel; } }
Zum Nachschlagen von allgemeinen Funktionen kann man das PDF-Dokument von xda-developers gut verwenden. Falls ihr Fragen zu dem Thema habt, könnt ihr gern die Kommentarfunktion verwenden.
Krass! Soooo viel Quellwasser, äh, Quellcode für zwei Männchen und zwei Zahlen…
Wirklich cool, dass Ganze!
Sehr cooler Post über die Gear Fit!
Habe mir auch überlegt, Sie zu kaufen. Bin aber noch unschlüssig.
Eine Seite die allgemein über Smartwatch App Entwicklung aufklärt gibt es hier:
https://www.inserteffect.com/smartwatch/
Hallo,
ich würde gerne auf der Gear fit meine aktuellen Geschwindigkeit anzeigen lassen. Wäre dies nach Deiner Meinung möglich und wie aufwändig schätzt du es ein?
Hallo Harald,
die Komplexität ist eigentlich überschaubar, sofern du schon mal in Kontakt mit App-Programmierung gekommen bist. Die Logik, sowie die GPS-Informationen müssen natürlich vom Smartphone kommen.
Du musst die entsprechenden Permissions setzen. (android.permission.ACCESS_FINE_LOCATION)
Und dann die GPS Informationen über die Android Location-Klasse beziehen.
http://developer.android.com/reference/android/location/Location.html
Bei Fragen sag Bescheid. Auch würde mich dein Ergebnis interessieren ;-)
Hi, ich bin total begeistert.
Ich suche eine Möglichkeit eine andere Sportart einzurichten. Ich arbeite mit dem Step und da will keine Sportart auf der Uhr passen.
Denkst du man kann so was nachprogrammieren?
Dann wäre es auch nett, wenn man den Puls und die Kalorien größer darstellen könnte.
Hallo,
gibt es auch eine Möglichkeit über das Android Studio die App auf der Gear Fit 2 zu debuggen oder deployen?
Und was für ein Projekt hast du angelegt? Ein wearable?
Gruß
Peter