我使用活动识别api和活动转换。当我第一次运行应用程序时,第一个转换总是。在这个应用程序中,它是WALKING-ENTER
。当我在转换
中仅使用IN_VEHICLE-ENTER
和IN_VEHICLE-EXIT
时,它是IN_VEHICLE-ENTER
。我想忽略第一个转换,但我测试过的设备没有这样的问题。有这些问题的设备是Android 8.1,没有问题的设备是6.0。
MainActivity扩展AppCompatActivity
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;
}
TransitionReceiver扩展了BroadcastReceiver。
public void onReceive(final Context context, Intent intent) {
Log.d("hmm: ","DriveBuddyTransitionReceiver - Enter");
if (ActivityTransitionResult.hasResult(intent)) {
ActivityTransitionResult result = ActivityTransitionResult.extractResult(intent);
for (ActivityTransitionEvent event : result.getTransitionEvents()) {
ServiceS.transitionArrived(event, context);
}
}
}
我也观察到了同样的情况。最后一个活动似乎保存在缓存中或类似的地方。我在Android 7.1和Android 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..
}
}
}
}
我通常会看到回调在发生的0-10秒内到达。
在最近的Google Play服务更新中,有人对活动识别API有问题吗? 我已经在一个应用程序中实现了它。在5.0更新之前,它工作得非常好。现在,当用户走路或坐着不动时,它会在车内返回:/ 并且根本不返回、或。 我应该知道的活动识别API是否有任何更改? 如果你需要更多的细节,请告诉我。
我将使用google play services活动识别api编写一个应用程序。android开发者网站上的培训是直接进行的,但在过去的几个小时里,我编写了一个简单的应用程序,但没有得到任何结果。更新:实际上,我将在5秒钟的时间间隔内以toast消息的形式显示用户的当前活动(如ActivityRecognitionService-Intent服务中的OnIntentHandler方法所示)。我认为
我试图在项目中使用活动识别来检测用户何时“在车内”。(驾驶)问题是几乎不可能使用它,因为大多数可能的活动经常报告“车内”,即使我已经在办公桌前坐了很长时间,或者只是在家里走来走去。很高兴知道API是如何得出这一结论的。 我认为这个功能有很大的潜力,但现在有些东西显然不起作用。 这是一份每30秒进行一次的最有可能的活动日志,以显示我的意思。坐在办公桌前,4分钟后,我把电话转了几次,结果是“最有可能的
我正在制作一个应用程序,使用ActivityRecognition API跟踪用户在后台的活动,如果用户在指定的时间段(例如1小时)内保持在同一位置,则系统会推送通知,告诉用户散步。我已经实现了活动识别,但仅适用于打开应用程序的情况。显然,Google API客户端需要保持连接才能发送活动更新。我的问题是-对于后台活动跟踪,什么是更好的解决方案: 1)在主活动(或单独活动)中实现警报管理器,该活动
我正在尝试建立一个简单的 ActiveMQ 代理网络。我有2台机器,比如A和B。 在A的< code>activemq.xml文件中,我放置了networkConnector,它具有指向机器b的URI。在A的日志中,显示它连接到了b 我有一个向A发送消息的应用程序。在ActiveMQ的网络控制台的网络选项卡中,我可以看到我的消息正在排队和出队(我认为这意味着消息被转发到机器B)。 我的问题是消息在
我正在写一个Android应用程序,有Java和静态编程语言活动。我希望从静态编程语言移动到Java,已经完成了,现在我希望回到静态编程语言活动,我找不到具体的代码。 我的应用程序名称是starter,Kotlin活动是MainActivity。kt和java类是face_detect。JAVA我已经试过:` ` 我希望单击face_detect上的按钮。java,这将把我带到MainActivi