免责声明:这不是Activity Recognition 在手机进入待机状态(屏幕关闭状态)时停止接收更新的重复,因为我已经在使用这种方法并且它没有帮助。
问题:
似乎活动识别服务停止工作并且在设备进入睡眠状态时没有发送任何更新。当设备没有睡着时,它工作正常(识别的活动存储到 sqlite),但只要我按下 HTC M8 上的电源按钮,从这一刻起什么都没有存储,直到我唤醒设备但再次按下电源按钮。
我如何进行活动识别的一些细节:
请求活动识别更新看起来像这样(取自官方谷歌样本,但我改为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'
编辑1:
在阅读了用户 bjiang 的提示和这个答案https://stackoverflow.com/a/32965481/2401535之后,HTC 设备似乎存在一些问题,因为它不像 Activity Recognition api docs 所说的那样工作:
为了节省电池电量,当设备长时间处于“静止”状态时,活动报告可能会停止。一旦设备再次移动,它将恢复。这只发生在支持 Sensor.TYPE_SIGNIFICANT_MOTION 硬件的设备上。
HTC M8 确实支持Sensor.TYPE_SIGNIFICANT_MOTION
,所以 Activity Recognition 应该会在之后重新启动device moves again
。但事实并非如此。在我用电源按钮唤醒设备后,它确实开始了活动识别。