Я использую API Google: ActivityRecognitionClient.requestActivityUpdates для своего приложения.Логика, лежащая в основе приложения, заключается в отслеживании движения пользователя в пределах короткого радиуса.Например, из одной комнаты в другую в доме.Поэтому я продолжаю опрашивать этот API с помощью таймера обратного отсчета и проверять состояние конкретного устройства каждые 30000 миллисекунд.Если у пользователя есть какое-либо движение, я отправлю местоположение (WiFi) на сервер.
Я использую тот же образец Google с более легкой модификацией, основанной на моей логике.Но моя проблема здесь в том, что ожидающее намерение доставляет предыдущий результат случайным образом (3/10).Поэтому я не получаю точный результат с помощью этого API большую часть времени.
Из моего анализа я обнаружил, что, если интервал опроса увеличивается, точность результата также увеличивается.
Я уже проанализировал точку переполнения стека [ Стоп Ожидания распознавания активности был вызван посреди ночи .Но моя проблема в другом.Если у кого-то есть лучшее решение / обходной путь, пожалуйста, обновите мне.Я добавляю свою кодовую базу для вашей справки.
Протестированное устройство
Nexus 6P-OS - 8.1.0
Кодовая база
/**
* Check the Device Moving Activity Status
* Integrated Google Activity Status API to get the Device is Idle or not
* If the device Idle status is 95% Accurate, then the App will send the user info to Server
*/
private fun checkActivityStatus() {
//Request the Activity status with the help of An Intent Service
val task = mActivityRecognitionClient.requestActivityUpdates(
Constants.DETECTION_INTERVAL_IN_MILLISECONDS,
getActivityDetectionPendingIntent())
task.addOnSuccessListener {
// Toast.makeText(this,
//getString(R.string.activity_updates_enabled),
// Toast.LENGTH_SHORT)
//.show()
setUpdatesRequestedState(true)
updateDetectedActivitiesList()
}
task.addOnFailureListener {
Log.w(TAG, getString(R.string.activity_updates_not_enabled))
/* Toast.makeText(this,
getString(R.string.activity_updates_not_enabled),
Toast.LENGTH_SHORT)
.show()*/
setUpdatesRequestedState(false)
}
}
/**
* Gets a PendingIntent to be sent for each activity detection.
*/
private fun getActivityDetectionPendingIntent(): PendingIntent {
val intent = Intent(this, DetectedActivitiesIntentService::class.java)
// We use FLAG_UPDATE_CURRENT so that we get the same pending intent back when calling
// requestActivityUpdates() and removeActivityUpdates().
return PendingIntent.getService(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT)
}
/**
* Processes the list of freshly detected activities. Asks the adapter to update its list of
* DetectedActivities with new `DetectedActivity` objects reflecting the latest detected
* activities.
*/
private fun updateDetectedActivitiesList() {
val detectedActivities: ArrayList<DetectedActivity> = Utils.detectedActivitiesFromJson(
PreferenceManager.getDefaultSharedPreferences(this)
.getString(Constants.KEY_DETECTED_ACTIVITIES, ""))
val detectedActivitiesMap = HashMap<Int, Int>()
for (activity in detectedActivities) {
detectedActivitiesMap[activity.type] = activity.confidence
}
val ideleConfidence = detectedActivitiesMap[Constants.MONITORED_ACTIVITIES[0]]
Log.i(TAG, "***IDLE Status = $ideleConfidence Present Location ${mSpDataSupplier.getSelectedLocation()}")
if (ideleConfidence != null && ideleConfidence!! > 95) {
// sendIdleStatusToServer(ideleConfidence)
if (!mLocationDataList.isEmpty()) {
sendLocationInfo(mLocationDataList.get(mLocationDataList.size - 1))
}
} else {
// The user is in Moving state- Need to clear the Data
synchronized(mLocationDataList) {
mLocationDataList.clear()
mDuration = 0
}
mSpDataSupplier.removeLocation()
sendBroadcastEndTraining()
sendToast("End Training...")
}
}
/**
* Sets the boolean in SharedPreferences that tracks whether we are requesting activity
* updates.
*/
private fun setUpdatesRequestedState(requesting: Boolean) {
PreferenceManager.getDefaultSharedPreferences(this)
.edit()
.putBoolean(Constants.KEY_ACTIVITY_UPDATES_REQUESTED, requesting)
.apply()
}