软件信息
- gradle-8.0
- Sdk信息
//编译版本
compileSdk=33
//最小版本
minSdk=24
//目标版本
targetSdk=31 - Android Studio Giraffe | 2022.3.1 Patch 2(建议版本不要太低)
- MVVM
- Android Jetpack
项目注意
- 没有服务器,用的是Apifox模拟服务器返回,所以有的功能是不能测试的,比如注册等。
- 这是根据教学视频学习,码出来的项目,跟视频里面的一样。
- 通过https://sqlitebrowser.org/dl/下载工具,把手机/模拟器的data/data/包名/databases/.db文件打开进行查看数据库内容。
项目涉及功能
- 商城;
- 即时通讯;
- 微信、qq登录;
- 微信、支付宝支付等;
项目运行界面效果图

注:项目源码在gitee里(设置私有),想要教学视频+code,私聊(非无偿,介意勿扰谢谢)。
问题及解决
按照视频敲代码出现过的问题集合。某些问题是因为是用Apifox模拟服务器返回。只提供一种解决方法,不能保证最优,可作为参考。
1.问题:java.security.cert.CertificateException: Chain validation failed
解决:
object NetworkModule {/*** 提供OkHttpClient*/fun provideOkHttpClient(): OkHttpClient {//初始化okhttpval okhttpClientBuilder = OkHttpClient.Builder()//新增下面这段//接受自签名或不受信任的证书。这通常用于开发环境或内部测试,生产环境不建议使用if (Config.DEBUG){okhttpClientBuilder.sslSocketFactory(UnsafeSSLHelper.createUnsafeSSLContext().socketFactory,UnsafeSSLHelper.createUnsafeTrustManager())okhttpClientBuilder.hostnameVerifier { _, _ -> true } // 跳过主机名验证}
…………………………………………………………}
}
class UnsafeSSLHelper {companion object {// 创建不安全的 TrustManager,接受所有证书fun createUnsafeTrustManager(): X509TrustManager {return object : X509TrustManager {@Throws(CertificateException::class)override fun checkClientTrusted(chain: Array<X509Certificate>, authType: String) {// 接受所有客户端证书}@Throws(CertificateException::class)override fun checkServerTrusted(chain: Array<X509Certificate>, authType: String) {// 接受所有服务器证书}override fun getAcceptedIssuers(): Array<X509Certificate> {return arrayOf()}}}// 创建不安全的 SSLContextfun createUnsafeSSLContext(): SSLContext {try {val sslContext = SSLContext.getInstance("SSL")sslContext.init(null,arrayOf<TrustManager>(createUnsafeTrustManager()),SecureRandom())return sslContext} catch (e: Exception) {throw RuntimeException(e)}}}
}
2. 解决高德地图AMapUtilCoreApi、NetProxy类冲突
3.优化:发布界面进入“当前位置”一进来不显示PIO列表,如下左图优化成右图
解决:
步骤1:class SelectLocationActivity:AMap.OnMyLocationChangeListener{}
步骤2:binding.mapView.map.setOnMyLocationChangeListener(this)//设置定位监听
步骤3://实现 AMap.OnMyLocationChangeListener 监听器,通过如下回调方法获取经纬度信息:override fun onMyLocationChange(location: Location?) {location?.let {searchPOI(LatLng(it.latitude,it.longitude), null)}}