前情提要:笔者目前学识尚浅,文中若有疏漏,恳请大家海涵与指正。
文章中的视频及图片请勿未经作者允许使用,谢谢。本篇文章无任何商业行为,仅供个人学习使用。
一、阿里百炼平台AI集成
先上效果图,这里以安卓端为例
1.第一步:先配置好网络权限和相关依赖项
<!--允许程序访问网络连接--><uses-permission android:name="android.permission.INTERNET"/><!--允许程序获取网络信息状态--><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/><!--允许改变WLAN状态的开关--><uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/><!-- 检查WiFi状态 --><uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
这里的网络权限可以按需增加
implementation("com.alibaba:dashscope-sdk-java:2.13.0"){exclude(group = "com.google.guava")exclude(group = "com.google.code.findbugs", module = "jsr305")}// 显式添加兼容的guava版本implementation("com.google.guava:guava:32.1.2-android")// ViewModelimplementation("androidx.lifecycle:lifecycle-viewmodel-compose:2.7.0")//让 ViewModel 能在 Compose 中使用implementation("androidx.lifecycle:lifecycle-runtime-compose:2.7.0")//将生命周期状态转换为 Compose 的 State
这里我使用了排除部分配置,大家可以根据自己的项目进行选择
2.需要文件:
两个接口:
// data/ai/AIService.ktpackage [包名].data.ai
interface AIService {suspend fun sendMessage(message: String): Result<String>fun setApiKey(apiKey: String)// 新增流式响应方法// suspend fun sendMessageStream(// message: String,// onChunk: (String) -> Unit,// onComplete: () -> Unit,// onError: (Throwable) -> Unit// )}// data/ai/AIMessage.ktpackage [包名].data.aiimport java.util.*data class AIMessage(val id: String = UUID.randomUUID().toString(),val content: String,val isUser: Boolean, // true表示用户消息,false表示AI消息val timestamp: Long = System.currentTimeMillis())
我这里并没有用流式,因为有专门的打字机特效,可以先接受全部字符后再打字机输出[狗头]
一个AITab界面,一个AIViewModel和一个AIService(取名任意)
AITab界面的UI设计我就不过多描述,网上很多,这里主要讲一下我自己是如何集成的
3.AI前端服务层的架构
首先需要进入阿里百炼平台获取一个免费的key,然后就可以开始集成工作了。
AIService服务层的架构
首先最熟悉的import
import com.alibaba.dashscope.aigc.generation.Generationimport com.alibaba.dashscope.aigc.generation.GenerationParamimport com.alibaba.dashscope.aigc.generation.GenerationResultimport com.alibaba.dashscope.common.Messageimport com.alibaba.dashscope.common.Roleimport com.alibaba.dashscope.exception.ApiExceptionimport com.alibaba.dashscope.exception.InputRequiredExceptionimport com.alibaba.dashscope.exception.NoApiKeyExceptionimport com.alibaba.dashscope.utils.Constants
然后在class里override显式重写我们的接口方法,其中最关键的就是将APIkey设置到SDK
Constants.apiKey = apiKey
然后在AIViewModel调用
aiService.setApiKey("xx-xxxxx...xxxxxxx")方法设置自己的key即可
其次设置系统提示语、用户消息和消息数组
val systemMessage = Message.builder() .role(Role.SYSTEM.getValue()) .content("你是...应用的AI助手...") .build()val userMsg = Message.builder() .role(Role.USER.getValue()) .content(userMessage) .build()return listOf(systemMessage, userMsg)创建实例,调用API
// 构建对话消息val conversationHistory = buildMessageHistory(message)// 创建Generation实例val gen = Generation()// 构建参数val param = GenerationParam.builder() .apiKey(apiKey) .model("qwen-plus") // 可以使用qwen-turbo降低成本.messages(conversationHistory) .resultFormat(GenerationParam.ResultFormat.MESSAGE) .build()// 调用APIval result: GenerationResult = gen.call(param)这里用了协程,用异步也是可以的
解析结果
val aiResponse = result.output.choices[0].message.content
成功返回
Result.success(aiResponse)
最后再加上一点try-catch防止程序报错崩溃即可
这样就可以直接在viewmodel里面调用AI服务层啦,最后再搞一个美观的UITab,一个简单的AI集成就搞定了。
二、地图集成(这里以华为地图为例)
先上效果图

地图的集成我就不展开叙述了,
地图的坑很多,我踩了不知道多少次,
有异步无响应用实例才能解决等等,
这里就展示一下最简单的集成,其实初始化一行
就行,由于华为地图在非华为手机上(没有
HMScore服务)导致可能会有一定的内存增加,
各位调用前三思
AndroidView(
factory = { context ->
// 1️⃣ 初始化地图SDK
MapsInitializer.initialize(context)
MapView(context).apply {
onCreate(null)
getMapAsync { map ->
// 2️⃣ 基础地图配置
with(map.uiSettings) {
isZoomControlsEnabled = true
isScrollGesturesEnabled = true
isZoomGesturesEnabled = true
isMyLocationButtonEnabled = true // 显示定位按钮
}
// 3️⃣ 初始视角(以上海为例)
map.moveCamera(
CameraUpdateFactory.newLatLngZoom(
LatLng(31.2304, 121.4737),
12f
)
)
// 4️⃣ 添加当前位置标记
addMyLocationMarker(map)
// 5️⃣ 添加业务数据标记
addCustomMarkers(map, getCapsulesData())
}
}
},
modifier = Modifier.fillMaxSize()
)
完[敬礼][狗头]