O reconhecimento de atividade não funciona depois que o telefone adormece
Isenção de responsabilidade: isso não é duplicado deO Reconhecimento de atividade para de receber atualizações quando o telefone entra em espera (tela desligada) porque eu já estou usando essa abordagem e não ajuda.
Problema:Parece que o serviço de reconhecimento de atividade para de funcionar e não está enviando nenhuma atualização quando o dispositivo entra no modo de espera. Funciona bem (atividades reconhecidas são armazenadas no sqlite) quando o dispositivo não está no modo de espera, mas assim que eu pressiono o botão liga / desliga no HTC M8, nada é armazenado a partir deste momento até que eu acorde o dispositivo, mas pressione novamente o botão liga / desliga.
Alguns detalhes de como estou fazendo o reconhecimento de atividades:
Solicitando atualizações de reconhecimento de atividades se parece com isso (tirado deamostras oficiais do google mas eu mudeiIntentService
paraBroadcastReceiver
):
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);
}
}
Recebendo atualizações de reconhecimento de atividades se parece com isso (padrãoWakefulBroadcastReceiver
+ IntentService
cooperação)
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);
}
}
estou a usarcompile 'com.google.android.gms:play-services-location:8.1.0'
Depois de ler as dicas do usuário bjiang e esta respostahttps://stackoverflow.com/a/32965481/2401535 parece que há algum problema nos dispositivos HTC porque NÃO funciona como o api docs do Reconhecimento de Atividade diz:
Para economizar bateria, os relatórios de atividades podem parar quando o dispositivo fica "AINDA" por um longo período de tempo. Ele será retomado assim que o dispositivo se mover novamente. Isso acontece apenas em dispositivos que suportam o hardware Sensor.TYPE_SIGNIFICANT_MOTION.
HTC M8 realmente suportaSensor.TYPE_SIGNIFICANT_MOTION
então o reconhecimento de atividade deve começar novamente depoisdevice moves again
. Mas NÃO. Inicia o reconhecimento da atividade depois que eu acordo o dispositivo com o botão liga / desliga.