Par*_*ria 2 android android-pendingintent activity-recognition android-broadcastreceiver activitytransitionapi
我希望使用新的Activity过渡API,在按照此处的教程进行操作后,我无法获得所需的结果。
这是我用于设置要检测的活动过渡的代码:
public void setActivityTransitions() {
transitionList = new ArrayList<>();
ArrayList<Integer> activities = new ArrayList<>(Arrays.asList(
DetectedActivity.STILL,
DetectedActivity.WALKING,
DetectedActivity.ON_FOOT,
DetectedActivity.RUNNING,
DetectedActivity.ON_BICYCLE,
DetectedActivity.IN_VEHICLE));
for (int activity :
activities) {
transitionList.add(new ActivityTransition.Builder()
.setActivityType(activity)
.setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_ENTER).build());
transitionList.add(new ActivityTransition.Builder()
.setActivityType(activity)
.setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_EXIT).build());
}
}
Run Code Online (Sandbox Code Playgroud)
然后请求活动转换更新:
ActivityTransitionRequest activityTransitionRequest = new ActivityTransitionRequest(transitionList);
Intent intent = new Intent(context, ActivityDetectorTransitionService.class);
intent.setAction("com.test.activityrecognition.START_ACTIVITY_TRANSITION_DETECTION_ALARM");
PendingIntent pendingIntent = PendingIntent.getService(context, 1, intent, PendingIntent.FLAG_UPDATE_CURRENT);
Task<Void> task = ActivityRecognition.getClient(context).requestActivityTransitionUpdates(activityTransitionRequest, pendingIntent);
task.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void result) {
System.out.println("onSuccess");
}
});
task.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
e.printStackTrace();
System.out.println("onFailure");
}
});
Run Code Online (Sandbox Code Playgroud)
这是广播接收器:
public class ActivityDetectorTransitionService extends BroadcastReceiver {
private static final String TAG = "ActivityDetectorTransitionService";
@Override
public void onReceive(Context context, Intent intent) {
if (ActivityTransitionResult.hasResult(intent)) {
ActivityTransitionResult activityTransitionResult = ActivityTransitionResult.extractResult(intent);
ActivityDetectorTransitionAPI.getInstance().handleActivityRecognitionResult(activityTransitionResult);
}
}
}
Run Code Online (Sandbox Code Playgroud)
(名称中包含服务,因为起初我一直为它提供服务,但仍然无法使用。)
并在清单中:
<receiver
android:name=".tracking.activityrecognition.ActivityDetectorTransitionService">
<intent-filter>
<action android:name="com.test.activityrecognition.START_ACTIVITY_TRANSITION_DETECTION_ALARM"/>
</intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)
小智 5
您PendingIntent.getService()与结合使用BroadcastReceiver。
要使用接收待处理的意图,BroadcastReceiver您必须使用检索PendingIntent实例PendingIntent.getBroadcast()。可以在此处找到有关意图和意图过滤器的相应开发人员指南。
自Android 8起,存在一些后台服务限制。IntentService仅当应用程序处于前台时,才使用“ 仅”。要在应用关闭后接收活动转换更新,您甚至必须使用BroadcastReceiver。为此,BroadcastReceiver必须先获得相应的许可才能在应用清单中进行注册,如Jan Mad?ra所述。
<receiver android:name="com.mypackage.ActivityTransitionBroadcastReceiver"
android:exported="false"
android:permission="com.google.android.gms.permission.ACTIVITY_RECOGNITION">
<intent-filter>
<action android:name="com.mypackage.ACTION_PROCESS_ACTIVITY_TRANSITIONS" />
</intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)
此外onReceive(),由于意图过滤器不能保证是排他性的,因此只能响应您的特定操作。
public class ActivityTransitionBroadcastReceiver extends BroadcastReceiver {
public static final String INTENT_ACTION = "com.mypackage" +
".ACTION_PROCESS_ACTIVITY_TRANSITIONS";
@Override
public void onReceive(Context context, Intent intent) {
if (intent != null && INTENT_ACTION.equals(intent.getAction())) {
if (ActivityTransitionResult.hasResult(intent)) {
ActivityTransitionResult intentResult = ActivityTransitionResult
.extractResult(intent);
// handle activity transition result ...
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
使用PendingIntent.getBroadcast()以下方法请求活动转换更新:
ActivityTransitionRequest request = new ActivityTransitionRequest(transitionList);
Intent intent = new Intent(context, ActivityTransitionBroadcastReceiver.class);
intent.setAction(ActivityTransitionBroadcastReceiver.INTENT_ACTION);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent,
PendingIntent.FLAG_UPDATE_CURRENT);
Task<Void> task = ActivityRecognition.getClient(context)
.requestActivityTransitionUpdates(request, pendingIntent);
Run Code Online (Sandbox Code Playgroud)
请注意,活动转换更新可能会延迟接收。这取决于设备,并且还可能受到电源管理限制的影响。
小智 5
这是一篇旧帖子,但这个答案可能会对某人有所帮助。
请记住,延迟实际上可能是问题所在,就像我的情况一样。我以为我的实现不起作用,但实际上是这样。Activity Transitions API 只是有大约 1 分钟的巨大延迟来通知您转换。因此,请尝试四处走动或开车几分钟以开始接收通知。
我遇到了类似的问题,但帮助我将接收器添加到清单中
<receiver
android:name=".service.ActivityTransitionReceiver"
android:permission="com.google.android.gms.permission.ACTIVITY_RECOGNITION"
android:exported="false" />
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1537 次 |
| 最近记录: |