Hi, danke für die Tipps! Dann bin ich mal fleißig
Beiträge von ChrisD85
-
-
Und noch die HeartRateReporter Klasse..
Java
Alles anzeigenpackage com.samsung.android.simplehealth; import com.samsung.android.sdk.healthdata.HealthConstants; import com.samsung.android.sdk.healthdata.HealthDataObserver; import com.samsung.android.sdk.healthdata.HealthDataResolver; import com.samsung.android.sdk.healthdata.HealthDataResolver.Filter; import com.samsung.android.sdk.healthdata.HealthDataResolver.ReadRequest; import com.samsung.android.sdk.healthdata.HealthDataResolver.ReadResult; import com.samsung.android.sdk.healthdata.HealthDataStore; import com.samsung.android.sdk.healthdata.HealthResultHolder; import android.database.Cursor; import android.util.Log; import java.util.Calendar; public class HeartRateReporter { private final HealthDataStore mStore; public HeartRateReporter(HealthDataStore store) { mStore = store; } public void start() { // Register an observer to listen changes of step count and get today step count HealthDataObserver.addObserver(mStore, HealthConstants.HeartRate.HEALTH_DATA_TYPE, mObserver); readTodayStepCount(); } // Read the today's step count on demand private void readTodayStepCount() { HealthDataResolver resolver = new HealthDataResolver(mStore, null); // Set time range from start time of today to the current time long startTime = getStartTimeOfToday(); long endTime = System.currentTimeMillis(); Filter filter = Filter.and(Filter.greaterThanEquals(HealthConstants.HeartRate.START_TIME, startTime), Filter.lessThanEquals(HealthConstants.HeartRate.START_TIME, endTime)); HealthDataResolver.ReadRequest request = new ReadRequest.Builder() .setDataType(HealthConstants.HeartRate.HEALTH_DATA_TYPE) .setProperties(new String[] {HealthConstants.HeartRate.HEART_RATE}) .setFilter(filter) .build(); try { resolver.read(request).setResultListener(mListener); } catch (Exception e) { Log.e(MainActivity.APP_TAG, e.getClass().getName() + " - " + e.getMessage()); Log.e(MainActivity.APP_TAG, "Getting step count fails."); } } private long getStartTimeOfToday() { Calendar today = Calendar.getInstance(); today.set(Calendar.HOUR_OF_DAY, 0); today.set(Calendar.MINUTE, 0); today.set(Calendar.SECOND, 0); today.set(Calendar.MILLISECOND, 0); return today.getTimeInMillis(); } private final HealthResultHolder.ResultListener<ReadResult> mListener = new HealthResultHolder.ResultListener<ReadResult>() { @Override public void onResult(ReadResult result) { int count = 0; Cursor c = null; try { c = result.getResultCursor(); if (c != null) { while (c.moveToNext()) { count = c.getInt(c.getColumnIndex(HealthConstants.HeartRate.HEART_RATE)); } } } finally { if (c != null) { c.close(); } } MainActivity.getInstance().drawStepCount(String.valueOf(count)); } }; private final HealthDataObserver mObserver = new HealthDataObserver(null) { // Update the step count when a change event is received @Override public void onChange(String dataTypeName) { Log.d(MainActivity.APP_TAG, "Observer receives a data changed event"); readTodayStepCount(); } }; }
-
Hi Christopher,
danke für die Antwort. Ich hab inzwischen die App zum laufen gekriegt. Ich musste noch einen Eintrag in der AndroidManifest.xml bearbeiten. (android:value="com.samsung.health.heart_rate")
Die App stellt inzwischen den aktuellen Wert der Herzrate aus S Health dar und updatet diesen auch automatisch.
Jetzt steh ich jedoch vor dem nächsten Problem Und zwar möchte ich den aktuellen Wert via UPD ja an einen Datenlogger senden.
Ich hab schon viel heute gegoogelt und auch UPD Client Beispiele gefunden...Bekomme sie jedoch irgendwie nicht richtig in meinen Code integriert.Wie gehe ich generell ran?
- Am besten für den UPD Client eine eigene Klasse erstellen?
- Muss das über einen Thread laufen?
- Gibts vlt. ein Tutorial das mir weiterhelfen kann?Ich hab einfach zu wenig Ahnung von Java^^ Ich hab schonmal sowas ähnliches in C++ Qt gebastelt, doch das war irgendwie anders...da konnte ich das mit paar Zeilen Code lösen.
Freu mich über jede Hilfe! <3
Hier mein aktueller Code:
Code
Alles anzeigenpackage com.samsung.android.simplehealth; import... public class MainActivity extends Activity { public static final String APP_TAG = "SimpleHealth"; private final int MENU_ITEM_PERMISSION_SETTING = 1; private static MainActivity mInstance = null; private HealthDataStore mStore; private HealthConnectionErrorResult mConnError; private Set<PermissionKey> mKeySet; private HeartRateReporter mReporter; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); getActionBar().setIcon(new ColorDrawable(getResources().getColor(android.R.color.transparent))); mInstance = this; mKeySet = new HashSet<PermissionKey>(); mKeySet.add(new PermissionKey(HealthConstants.HeartRate.HEALTH_DATA_TYPE, PermissionType.READ)); HealthDataService healthDataService = new HealthDataService(); try { healthDataService.initialize(this); } catch (Exception e) { e.printStackTrace(); } // Create a HealthDataStore instance and set its listener mStore = new HealthDataStore(this, mConnectionListener); // Request the connection to the health data store mStore.connectService(); } @Override public void onDestroy() { mStore.disconnectService(); super.onDestroy(); } private final HealthDataStore.ConnectionListener mConnectionListener = new HealthDataStore.ConnectionListener() { @Override public void onConnected() { Log.d(APP_TAG, "Health data service is connected."); HealthPermissionManager pmsManager = new HealthPermissionManager(mStore); mReporter = new HeartRateReporter(mStore); try { // Check whether the permissions that this application needs are acquired Map<PermissionKey, Boolean> resultMap = pmsManager.isPermissionAcquired(mKeySet); if (resultMap.containsValue(Boolean.FALSE)) { // Request the permission for reading step counts if it is not acquired pmsManager.requestPermissions(mKeySet, MainActivity.this).setResultListener(mPermissionListener); } else { // Get the current step count and display it mReporter.start(); } } catch (Exception e) { Log.e(APP_TAG, e.getClass().getName() + " - " + e.getMessage()); Log.e(APP_TAG, "Permission setting fails."); } } @Override public void onConnectionFailed(HealthConnectionErrorResult error) { Log.d(APP_TAG, "Health data service is not available."); showConnectionFailureDialog(error); } @Override public void onDisconnected() { Log.d(APP_TAG, "Health data service is disconnected."); } }; private final HealthResultHolder.ResultListener<PermissionResult> mPermissionListener = new HealthResultHolder.ResultListener<PermissionResult>() { @Override public void onResult(PermissionResult result) { Log.d(APP_TAG, "Permission callback is received."); Map<PermissionKey, Boolean> resultMap = result.getResultMap(); if (resultMap.containsValue(Boolean.FALSE)) { drawStepCount(""); showPermissionAlarmDialog(); } else { // Get the current step count and display it mReporter.start(); } } }; public void drawStepCount(String count){ TextView stepCountTv = (TextView)findViewById(R.id.editHealthDateValue1); // Display the today step count so far stepCountTv.setText(count); } public static MainActivity getInstance() { return mInstance; } private void showPermissionAlarmDialog() { if (isFinishing()) { return; } AlertDialog.Builder alert = new AlertDialog.Builder(MainActivity.this); alert.setTitle("Notice"); alert.setMessage("All permissions should be acquired"); alert.setPositiveButton("OK", null); alert.show(); } private void showConnectionFailureDialog(HealthConnectionErrorResult error) { AlertDialog.Builder alert = new AlertDialog.Builder(this); mConnError = error; String message = "Connection with S Health is not available"; if (mConnError.hasResolution()) { switch(error.getErrorCode()) { case HealthConnectionErrorResult.PLATFORM_NOT_INSTALLED: message = "Please install S Health"; break; case HealthConnectionErrorResult.OLD_VERSION_PLATFORM: message = "Please upgrade S Health"; break; case HealthConnectionErrorResult.PLATFORM_DISABLED: message = "Please enable S Health"; break; case HealthConnectionErrorResult.USER_AGREEMENT_NEEDED: message = "Please agree with S Health policy"; break; default: message = "Please make S Health available"; break; } } alert.setMessage(message); alert.setPositiveButton("OK", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int id) { if (mConnError.hasResolution()) { mConnError.resolve(mInstance); } } }); if (error.hasResolution()) { alert.setNegativeButton("Cancel", null); } alert.show(); } @Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); menu.add(1, MENU_ITEM_PERMISSION_SETTING, 0, "Connect to S Health"); return true; } @Override public boolean onOptionsItemSelected(android.view.MenuItem item) { if(item.getItemId() == (MENU_ITEM_PERMISSION_SETTING)) { HealthPermissionManager pmsManager = new HealthPermissionManager(mStore); try { // Show user permission UI for allowing user to change options pmsManager.requestPermissions(mKeySet, MainActivity.this).setResultListener(mPermissionListener); } catch (Exception e) { Log.e(APP_TAG, e.getClass().getName() + " - " + e.getMessage()); Log.e(APP_TAG, "Permission setting fails."); } } return true; } }
-
Hallo an alle, ich bin neu hier
Bin noch sehr frisch in Android Studio unterwegs. Zu meinem Problem:
Für ein Projekt möchte ich die in S Health gespeicherten Daten (eigentlich nur die Herz rate) abrufen und via UPD an einen Datenlogger streamen.
Dafür habe ich mir die S Health SDK geschnappt und gehe gerade das Simple Health Beispiel durch, wo ja schon mal die Daten des Schrittzählern abgerufen werden.Als ersten Schritt öffnet die App ein Fenster in dem man die Berechtigung zum lesen der Daten erteilt. Jetzt habe ich einfach mal versucht den Code des Beispiels anzupassen,
um Read Permission für HeartRate zu erteilen:Code
Alles anzeigen@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); getActionBar().setIcon(new ColorDrawable(getResources().getColor(android.R.color.transparent))); mInstance = this; mKeySet = new HashSet<PermissionKey>(); mKeySet.add(new PermissionKey(HealthConstants.HeartRate.HEALTH_DATA_TYPE, PermissionType.READ)); HealthDataService healthDataService = new HealthDataService(); try { healthDataService.initialize(this); } catch (Exception e) { e.printStackTrace(); } // Create a HealthDataStore instance and set its listener mStore = new HealthDataStore(this, mConnectionListener); // Request the connection to the health data store mStore.connectService(); }
In Zeile 9 habe ich also HealthConstants.StepCount.HEALTH_DATA_TYPE zu HealthConstants.HeartRate.HEALTH_DATA_TYPE geändert. Laut der PDF zur SDK müsste das, dass richtige Interface sein.
Die App buildet sich auch und startet, jedoch poppt nun nicht mehr das Fenster auf in dem man die Berechtigung zu SHealh setzten kann. Auch über das Menü kann es nicht aufgerufen werden, es passiert einfach gar nichts.Woran kann das liegen?
Danke für eure Hilfe :))