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

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

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

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

للحصول على قائمة بجميع مصادر البيانات المتاحة على الجهاز وعلى الأجهزة المصاحبة، استخدِم الإجراء 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."));