ActivityRecognitionClient.requestActivityUpdates Ожидающее намерение доставить предыдущий результат - PullRequest
0 голосов
/ 26 августа 2018

Я использую 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()
    }
...