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

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

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

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

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