Android RequestActivityTransitionUpdate从不调用已注册的BroadcastReceiver
我正在编写一个简单的应用程序,用于测量android设备的所有可用传感器(Wifi、BT等)。其中之一是用户活动(通过ActivityRecognition API),但我无法使其正常工作 我编写了一个类来完成与用户活动相关的所有工作。我只想获得4个状态和一个属性来存储当前状态:Android RequestActivityTransitionUpdate从不调用已注册的BroadcastReceiver,android,kotlin,android-activity,Android,Kotlin,Android Activity,我正在编写一个简单的应用程序,用于测量android设备的所有可用传感器(Wifi、BT等)。其中之一是用户活动(通过ActivityRecognition API),但我无法使其正常工作 我编写了一个类来完成与用户活动相关的所有工作。我只想获得4个状态和一个属性来存储当前状态: var VEHICLE = "vehicle" var WALKING = "walking" var STILL = "still" var UNKNOWN = "unknown" private var curr
var VEHICLE = "vehicle"
var WALKING = "walking"
var STILL = "still"
var UNKNOWN = "unknown"
private var current: String? = null
它还包括用于处理活动转换的BroadcastReceiver对象:
private var recognitionHandler = object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
if (ActivityRecognitionResult.hasResult(intent)) {
val result = ActivityRecognitionResult.extractResult(intent)
val activity = result.mostProbableActivity
current = when(activity.type) {
DetectedActivity.IN_VEHICLE,
DetectedActivity.ON_BICYCLE -> VEHICLE
DetectedActivity.WALKING,
DetectedActivity.RUNNING -> WALKING
DetectedActivity.STILL -> STILL
else -> UNKNOWN
}
}
}
}
该类还有两种方法来定义意图和请求:
private fun createIntent() : PendingIntent {
val intent = Intent(context, recognitionHandler.javaClass)
val pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0)
context.registerReceiver(recognitionHandler, IntentFilter())
return pendingIntent
}
private fun createRequest() : ActivityTransitionRequest {
val types = listOf(
DetectedActivity.IN_VEHICLE,
DetectedActivity.WALKING,
DetectedActivity.RUNNING,
DetectedActivity.ON_BICYCLE,
DetectedActivity.STILL
)
val transitions = mutableListOf<ActivityTransition>()
types.forEach { activity ->
transitions.add(
ActivityTransition.Builder()
.setActivityType(activity)
.setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_ENTER)
.build()
)
}
return ActivityTransitionRequest(transitions)
}
问题在于current
属性始终为空。我想我在意向或处理程序注册方面有一些问题,但我不知道在哪里
有人有什么意见吗?:)
谢谢 这是你的问题。在来自
createIntent()
的代码中:
返回调用requestActivityTransitionUpdates()
时使用的PendingEvent
。但是,pendingent
引用了一个动态创建的内部类(您的BroadcastReceiver
),Android无法实例化该类
您还额外调用了registerReceiver()
,但是在该调用中传递了一个空的IntentFilter
,因此注册的BroadcastReceiver
永远不会被调用
要解决此问题,您可以提供与您的pendingent
匹配的正确IntentFilter
,或者可以将BroadcastReceiver
重构为适当的类(而不是私有内部类),并确保已将BroadcastReceiver
添加到清单中并使其公开(exported=“true”
)
下面是如何使用广播接收器执行此操作的示例:
是否执行onReceive()
get Call?您添加了清单权限了吗?下面是一个示例:您解决了问题吗?@DavidWasser不,没有。@KaljaTolkki是的,已经添加了该示例工作吗?我已经克隆了repo并将其部署到实际设备上,但我没有收到任何转换。我可以从日志中看到注册成功ssful,但不调用onReceive(走动约2分钟)。使用两台设备进行测试。
override fun start(onResult: (res: String?) -> Unit) {
// ...
intent = createIntent()
val request = createRequest()
ActivityRecognition.getClient(context)
.requestActivityTransitionUpdates(request, intent)
.addOnSuccessListener {
Log.d("UserActivity Service info", "listening...")
}
.addOnFailureListener { e ->
Log.d("UserActivity Service error", e.toString())
}
// ...
}
val intent = Intent(context, recognitionHandler.javaClass)
val pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0)
context.registerReceiver(recognitionHandler, IntentFilter())
return pendingIntent