Распознавание активности не работает после того, как телефон засыпает
Отказ от ответственности: это не дубликатФункция распознавания активности перестает получать обновления, когда телефон переходит в режим ожидания (состояние выключенного экрана) потому что я уже использую этот подход, и это не помогает.
Проблема:Кажется, что служба распознавания активности перестает работать и не отправляет никаких обновлений, когда устройство засыпает. Он работает нормально (распознанные действия сохраняются в sqlite), когда устройство не спит, но как только я нажимаю кнопку питания в HTC M8, с этого момента ничего не сохраняется, пока я не разбуду устройство, но снова нажму кнопку питания.
Некоторые детали того, как я делаю распознавание активности:
Запрос обновлений распознавания активности выглядит так (взято изофициальные образцы Google но я изменилсяIntentService
вBroadcastReceiver
):
public class DevActivity extends AppCompatActivity implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener {
//...
private PendingIntent getActivityDetectionPendingIntent() {
Intent intent = new Intent(this, ActRecReceiver.class);
return PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
}
public void requestActivityUpdatesButtonHandler(View view) {
if (!googleApiClient.isConnected()) {
Toast.makeText(this, "not_connected", Toast.LENGTH_SHORT).show();
return;
}
final Preferences pref = new Preferences(this);
ActivityRecognition.ActivityRecognitionApi.requestActivityUpdates(
googleApiClient,
pref.getActRecInterval(0),
getActivityDetectionPendingIntent()
).setResultCallback(this);
}
}
Получение обновлений распознавания активности выглядит так (стандартноWakefulBroadcastReceiver
+ IntentService
сотрудничество)
public class ActRecReceiver extends WakefulBroadcastReceiver {
private static final String TAG = "ActRecReceiver";
private static final boolean LOG = BuildConfig.LOGGING;
@Override
public void onReceive(Context context, Intent intent) {
if (LOG) Log.d(TAG, "onReceive");
Intent serviceStarter = new Intent(context, DetectedActivitiesIntentService.class);
serviceStarter.putExtra("ActivityRecognitionResult", ActivityRecognitionResult.extractResult(intent));
startWakefulService(context, serviceStarter);
}
}
public class DetectedActivitiesIntentService extends IntentService {
protected static final String TAG = "DetectedActivitiesIS";
public DetectedActivitiesIntentService() {
super(TAG);
}
@Override
protected void onHandleIntent(Intent intent) {
ActivityRecognitionResult result = intent.getParcelableExtra("ActivityRecognitionResult");
List<DetectedActivity> detectedActivities = result.getProbableActivities();
HashMap<Integer, Integer> detectedActivitiesMap = new HashMap<>();
for (DetectedActivity activity : detectedActivities) {
detectedActivitiesMap.put(activity.getType(), activity.getConfidence());
}
storeEventToSqlite(detectedActivitiesMap);
ActRecReceiver.completeWakefulIntent(intent);
}
}
я используюcompile 'com.google.android.gms:play-services-location:8.1.0'
После прочтения подсказок от пользователя bjiang и этого ответаhttps://stackoverflow.com/a/32965481/2401535 Похоже, что на устройствах HTC есть какая-то проблема, потому что она НЕ работает так, как в api docs распознавания активности:
Для экономии заряда аккумулятора отчеты об активности могут прекратиться, если устройство находится в состоянии «ЕЩЕ» в течение длительного периода времени. Он возобновится, как только устройство снова начнет двигаться. Это происходит только на устройствах, которые поддерживают оборудование Sensor.TYPE_SIGNIFICANT_MOTION.
HTC M8 действительно поддерживаетSensor.TYPE_SIGNIFICANT_MOTION
поэтому распознавание активности должно начаться снова послеdevice moves again
, Но это не так. Это действительно начинает распознавание активности после того, как я просыпаюсь устройство с кнопкой питания