الوصول إلى بيانات جهاز الاستشعار الأولية

تتيح لك واجهة برمجة تطبيقات أجهزة الاستشعار إمكانية قراءة بيانات جهاز الاستشعار الأولية في تطبيقك في الوقت الفعلي. يمكنك استخدام واجهة برمجة التطبيقات هذه لإجراء ما يلي:

  • أدرِج مصادر البيانات المتاحة على الجهاز وعلى الأجهزة المصاحبة له.
  • يمكنك تسجيل المستمعين لتلقي بيانات جهاز الاستشعار الأولي.
  • إلغاء تسجيل المستمعين حتى لا يتلقّوا بيانات جهاز الاستشعار الأولي بعد ذلك

سرد مصادر البيانات المتاحة

للحصول على قائمة بجميع مصادر البيانات المتاحة على الجهاز وعلى الأجهزة المصاحبة، استخدِم الطريقة SensorsClient.findDataSources:

Kotlin

private val fitnessOptions = FitnessOptions.builder().addDataType(DataType.TYPE_STEP_COUNT_DELTA).build()

// Note: Fitness.SensorsApi.findDataSources() requires the
// ACCESS_FINE_LOCATION permission.
Fitness.getSensorsClient(requireContext(), GoogleSignIn.getAccountForExtension(requireContext(), fitnessOptions))
    .findDataSources(
        DataSourcesRequest.Builder()
            .setDataTypes(DataType.TYPE_STEP_COUNT_DELTA)
            .setDataSourceTypes(DataSource.TYPE_RAW)
            .build())
    .addOnSuccessListener { dataSources ->
        dataSources.forEach {
            Log.i(TAG, "Data source found: ${it.streamIdentifier}")
            Log.i(TAG, "Data Source type: ${it.dataType.name}")

            if (it.dataType == DataType.TYPE_STEP_COUNT_DELTA) {
                Log.i(TAG, "Data source for STEP_COUNT_DELTA found!")

                ...
            }
        }
    }
    .addOnFailureListener { e ->
        Log.e(TAG, "Find data sources request failed", e)
    }

Java

FitnessOptions fitnessOptions = FitnessOptions.builder().addDataType(DataType.TYPE_STEP_COUNT_DELTA).build();

// Note: Fitness.SensorsApi.findDataSources() requires the
// ACCESS_FINE_LOCATION permission.
Fitness.getSensorsClient(getApplicationContext(), GoogleSignIn.getAccountForExtension(getApplicationContext(), fitnessOptions))
        .findDataSources(
                new DataSourcesRequest.Builder()
                        .setDataTypes(DataType.TYPE_STEP_COUNT_DELTA)
                        .setDataSourceTypes(DataSource.TYPE_RAW)
                        .build())
        .addOnSuccessListener(dataSources -> {
            dataSources.forEach(dataSource -> {
                Log.i(TAG, "Data source found: ${it.streamIdentifier}");
                Log.i(TAG, "Data Source type: ${it.dataType.name}");

                if (dataSource.getDataType() == DataType.TYPE_STEP_COUNT_DELTA) {
                    Log.i(TAG, "Data source for STEP_COUNT_DELTA found!");
                    ...
                }
            })})
        .addOnFailureListener(e ->
            Log.e(TAG, "Find data sources request failed", e));

للحصول على معلومات عن الجهاز لمصدر بيانات معيّن، استخدِم الطريقة DataSource.getDevice. يمكن التعرّف على معلومات الجهاز الخاصة بأجهزة الاستشعار المشابهة على الأجهزة المختلفة أو عرض معلومات الجهاز من جهاز استشعار للمستخدم، أو معالجة البيانات بشكل مختلف بناءً على الجهاز. على سبيل المثال، قد تكون مهتمًا بقراءة البيانات من جهاز الاستشعار على جهاز قابل للارتداء ولكن ليس من النوع نفسه من أجهزة الاستشعار على الهاتف.

للحصول على مثيل Device للجهاز الذي يشغِّل نشاطك، استخدِم الطريقة Device.getLocalDevice. ويكون ذلك مفيدًا عندما تريد التحقق مما إذا كان مصدر البيانات يستخدم الجهاز نفسه الذي يعمل عليه تطبيقك.

إضافة مستمع

لإضافة مستمع لتلقي بيانات أولية من نوع معيّن من بيانات اللياقة البدنية أو من مصدر بيانات معيّن، استخدِم الطريقة SensorsClient.add:

Kotlin

val listener = OnDataPointListener { dataPoint ->
        for (field in dataPoint.dataType.fields) {
            val value = dataPoint.getValue(field)
            Log.i(TAG, "Detected DataPoint field: ${field.name}")
            Log.i(TAG, "Detected DataPoint value: $value")
        }
    }

Fitness.getSensorsClient(this, GoogleSignIn.getAccountForExtension(this, fitnessOptions))
    .add(
        SensorRequest.Builder()
            .setDataSource(dataSource) // Optional but recommended for custom
            // data sets.
            .setDataType(dataType) // Can't be omitted.
            .setSamplingRate(10, TimeUnit.SECONDS)
            .build(),
        listener
    )
    .addOnSuccessListener {
    	Log.i(TAG, "Listener registered!")
    }
    .addOnFailureListener {
    	Log.e(TAG, "Listener not registered.", task.exception)
    }

Java

OnDataPointListener listener = dataPoint -> {
    for (Field field : dataPoint.getDataType().getFields()) {
        Value value = dataPoint.getValue(field);
        Log.i(TAG, "Detected DataPoint field: ${field.getName()}");
        Log.i(TAG, "Detected DataPoint value: $value");
    }
};
Fitness.getSensorsClient(this, GoogleSignIn.getAccountForExtension(this, fitnessOptions))
        .add(
                new SensorRequest.Builder()
                        .setDataSource(dataSource) // Optional but recommended
                        // for custom data sets.
                        .setDataType(dataType) // Can't be omitted.
                        .setSamplingRate(10, TimeUnit.SECONDS)
                        .build(),
                listener
        )
        .addOnSuccessListener(unused ->
                Log.i(TAG, "Listener registered!"))
        .addOnFailureListener(task ->
    Log.e(TAG, "Listener not registered.", task.getCause()));
}

إزالة مستمع

لإزالة مستمع من تحديثات البيانات الأولية، استخدِم الطريقة SensorsClient.remove:

Kotlin

Fitness.getSensorsClient(this, GoogleSignIn.getAccountForExtension(this, fitnessOptions))
    .remove(listener)
    .addOnSuccessListener {
    	Log.i(TAG, "Listener was removed!")
    }
    .addOnFailureListener {
    	Log.i(TAG, "Listener was not removed.")
    }

Java

Fitness.getSensorsClient(this, GoogleSignIn.getAccountForExtension(this, fitnessOptions))
        .remove(listener)
        .addOnSuccessListener(unused ->
                Log.i(TAG, "Listener was removed!"))
        .addOnFailureListener(e ->
                Log.i(TAG, "Listener was not removed."));