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

تتيح لك 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."));