闽公网安备 35020302035485号

就算不针对 AI 场景,在其他场景上也可以联动 App,例如:
1.当用户在系统搜索中查找一家 KFC 时,搜索结果可能会包含一个由 KFC 餐厅应用提供的“VM50”选项在之前需要唤起 App 执行然后再返回的操作,现在可以无缝直接联调,Appfunctions 支持异步处理,调用时 App 会收到成功响应、类似 HTTP 的错误代码或取消通知。而实现这一功能的核心在于两个关键组件是:AppFunctionService和 AppFunctionManager:
1.AppFunctionService是一个抽象基类,用户通过创建对应子类来提供具体的应用功能
class YourAppFunctionService : AppFunctionService() {
override fun onExecuteFunction(
request: ExecuteAppFunctionRequest,
callingPackage: String,
callingPackageSigningInfo: SigningInfo,
cancellationSignal: CancellationSignal,
callback: OutcomeReceiver<ExecuteAppFunctionResponse, AppFunctionException>
) {
val functionIdentifier = request.functionIdentifier
when (functionIdentifier) {
"orderFood" -> {
// 堆代码 duidaima.com
// 实现订餐逻辑
val result = ExecuteAppFunctionResponse.Builder(ExecuteAppFunctionResponse.RESULT_OK)
.setResultDocument(GenericDocument.Builder("resultNamespace")
.setProperty("orderId", "12345")
.build())
.build()
callback.onResult(result)
}
else -> {
callback.onError(AppFunctionException(AppFunctionException.ERROR_FUNCTION_NOT_FOUND))
}
}
}
override fun onBind(intent: Intent?): IBinder? {
return object : IAppFunctionService.Stub() {
override fun executeAppFunction(
request: ExecuteAppFunctionRequest?,
callback: IExecuteAppFunctionCallback?
) {
if (request!= null && callback!= null) {
val safeCallback = OutcomeReceiver<ExecuteAppFunctionResponse, AppFunctionException> { result ->
callback.onResult(result)
}
onExecuteFunction(
request,
"", // callingPackage 在这里不直接可用
SigningInfo(), // callingPackageSigningInfo 在这里不直接可用
CancellationSignal(),
safeCallback
)
}
}
}
}
}
fun executeFoodOrder(context: Context) {
val appFunctionManager = context.getSystemService(AppFunctionManager::class.java)
// 堆代码 duidaima.com
// 假设从 App Search 获取到的 com.example.foodapp 的 "orderFood" 功能的标识符是 "orderFood123"
val targetPackageName = "com.example.foodapp"
val functionIdentifier = "orderFood123"
val request = ExecuteAppFunctionRequest.Builder(targetPackageName, functionIdentifier)
.build()
val executor = Executors.newSingleThreadExecutor()
val cancellationSignal = CancellationSignal()
val callback = object : OutcomeReceiver<ExecuteAppFunctionResponse, AppFunctionException> {
override fun onResult(result: ExecuteAppFunctionResponse) {
val resultDocument = result.resultDocument
val orderId = resultDocument?.getPropertyString("orderId")
Log.d("AppFunctions", "订餐成功,订单 ID:$orderId")
}
override fun onError(error: AppFunctionException) {
Log.e("AppFunctions", "执行功能时发生错误:${error.errorCode}")
}
}
if (ContextCompat.checkSelfPermission(context, Manifest.permission.EXECUTE_APP_FUNCTIONS) == PackageManager.PERMISSION_GRANTED) {
appFunctionManager?.executeAppFunction(request, executor, cancellationSignal, callback)
} else {
Log.w("AppFunctions", "未授予 EXECUTE_APP_FUNCTIONS 权限")
}
}
总结下来,整个交互流程: