Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/193.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android RequestActivityTransitionUpdate从不调用已注册的BroadcastReceiver_Android_Kotlin_Android Activity - Fatal编程技术网

Android RequestActivityTransitionUpdate从不调用已注册的BroadcastReceiver

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

我正在编写一个简单的应用程序,用于测量android设备的所有可用传感器(Wifi、BT等)。其中之一是用户活动(通过ActivityRecognition API),但我无法使其正常工作

我编写了一个类来完成与用户活动相关的所有工作。我只想获得4个状态和一个属性来存储当前状态:

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