Java 第一个转换总是相同的-活动识别API-活动转换
我使用活动识别api和活动转换。当我第一次运行应用程序时,第一次转换始终是。在这个应用程序中,它是Java 第一个转换总是相同的-活动识别API-活动转换,java,android,activity-recognition,Java,Android,Activity Recognition,我使用活动识别api和活动转换。当我第一次运行应用程序时,第一次转换始终是。在这个应用程序中,它是WALKING-ENTER。当我尝试仅在车辆进入中使用和在车辆退出中使用时,在车辆进入中使用。我曾想过忽略第一次转换,但我测试过的设备没有出现这样的问题。有这些问题的设备是安卓8.1,没有问题的设备是6.0 MainActivity扩展了AppCompative活动 private static Intent serviceIntent; @Override protected void onCr
WALKING-ENTER
。当我尝试仅在车辆进入中使用和在车辆退出中使用时,在车辆进入中使用。我曾想过忽略第一次转换,但我测试过的设备没有出现这样的问题。有这些问题的设备是安卓8.1,没有问题的设备是6.0
MainActivity扩展了AppCompative活动
private static Intent serviceIntent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
int PERMISSION_ALL = 1;
String[] PERMISSIONS = {Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION};
if(!hasPermissions(this, PERMISSIONS)){
ActivityCompat.requestPermissions(this, PERMISSIONS, PERMISSION_ALL);
}
Button button = findViewById(R.id.button);
button.setOnClickListener(
new View.OnClickListener() {
public void onClick(View view) {
serviceIntent = new Intent(MainActivity.this, ServiceS.class);
MainActivity.this.startService(serviceIntent);
}
});
}
public static boolean hasPermissions(Context context, String... permissions) {
if (permissions != null) {
for (String permission : permissions) {
if (ActivityCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) {
return false;
}
}
}
return true;
}
服务扩展服务
public ServiceS() {
super();
}
public static void locationArrived(Context context, Location location) {
Log.d("hmm: ", location.toString());
}
@SuppressLint("MissingPermission")
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onCreate() {
initActivityTransition();
super.onCreate();
}
@Override
public void onDestroy() {
Log.d("hmm: ", "Updates stopped!");
Task task = ActivityRecognition.getClient(this)
.removeActivityTransitionUpdates(activityPendingIntent);
super.onDestroy();
}
// ACTIVITY TRANSITION BLOCK START
private static List<ActivityTransition> transitions = new ArrayList<>();
private static PendingIntent activityPendingIntent;
private static ActivityTransitionRequest transitionRequest;
void initActivityTransition(){
transitions.add(
new ActivityTransition.Builder()
.setActivityType(DetectedActivity.IN_VEHICLE)
.setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_EXIT)
.build());
transitions.add(
new ActivityTransition.Builder()
.setActivityType(DetectedActivity.IN_VEHICLE)
.setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_ENTER)
.build());
transitions.add(
new ActivityTransition.Builder()
.setActivityType(DetectedActivity.WALKING)
.setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_EXIT)
.build());
transitions.add(
new ActivityTransition.Builder()
.setActivityType(DetectedActivity.WALKING)
.setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_ENTER)
.build());
transitions.add(
new ActivityTransition.Builder()
.setActivityType(DetectedActivity.STILL)
.setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_ENTER)
.build());
transitions.add(
new ActivityTransition.Builder()
.setActivityType(DetectedActivity.STILL)
.setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_EXIT)
.build());
Intent activityIntentService = new Intent(this, TransitionReceiver.class);
activityPendingIntent = PendingIntent.getBroadcast(this, 1, activityIntentService, PendingIntent.FLAG_UPDATE_CURRENT);
Log.d("hmm: ","DriveBuddyService - initActivityTransition");
}
static void transitionArrived(final ActivityTransitionEvent event, final Context context){
Log.d("hmm: ", event.toString());
Toast.makeText(context, event.getActivityType() + "-" + event.getTransitionType(), Toast.LENGTH_LONG).show();
}
@Override
public void onStart(Intent intent, int startId) {
if(transitionRequest==null) {
transitionRequest = new ActivityTransitionRequest(transitions);
}
Task task = ActivityRecognition.getClient(this)
.requestActivityTransitionUpdates(transitionRequest, activityPendingIntent);
super.onStart(intent, startId);
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
我也观察到了同样的事情。最后一个活动似乎保存在缓存或类似的东西中。我在安卓7.1和安卓8.1上看到了这种情况
为了解决这个问题,我检查了转换发生时经过的时间。如果转换发生在30秒前,我将忽略回调
这就是我的代码的样子:
@Override
public void onReceive(Context context, Intent i) {
if (ActivityTransitionResult.hasResult(i)) {
ActivityTransitionResult result = ActivityTransitionResult.extractResult(i);
for (ActivityTransitionEvent event : result.getTransitionEvents()) {
//continue only if the activity happened in the last 30 seconds
//for some reason callbacks are received for old activities when the receiver is registered
if(((SystemClock.elapsedRealtime()-(event.getElapsedRealTimeNanos()/1000000))/1000) <= 30) {
//activity transition is legit. Do stuff here..
}
}
}
}
@覆盖
公共void onReceive(上下文,意图i){
if(ActivityTransitionResult.hasResult(i)){
ActivityTransitionResult=ActivityTransitionResult.extractResult(i);
for(ActivityTransitionEvent事件:result.getTransitionEvents()){
//仅当活动发生在最后30秒内时才继续
//由于某些原因,在注册接收者时会收到旧活动的回调
如果(((SystemClock.elapsedRealtime()-(event.getelapsedrealtimenos()/1000000))/1000)我有android 9的OnePlus 6,根据我的测试,我有时会收到发生在5秒以上的事件(大约9-10秒之前),应该被视为可靠事件。@dor506 true,我也看到了。我在代码中将此更改为30秒。我也将在此处更新代码。我也遇到了同样的情况。现在我知道了原因。谢谢
@Override
public void onReceive(Context context, Intent i) {
if (ActivityTransitionResult.hasResult(i)) {
ActivityTransitionResult result = ActivityTransitionResult.extractResult(i);
for (ActivityTransitionEvent event : result.getTransitionEvents()) {
//continue only if the activity happened in the last 30 seconds
//for some reason callbacks are received for old activities when the receiver is registered
if(((SystemClock.elapsedRealtime()-(event.getElapsedRealTimeNanos()/1000000))/1000) <= 30) {
//activity transition is legit. Do stuff here..
}
}
}
}