安卓开发使用Bmob遇到的一些问题及解决办法
最近在做安卓的大作业,在数据库方面遇到了很多困难,最后决定使用Bmob云数据库作为后端。在按照官方文档将Bmob SDK配置到Android Studio和初始化Bmob时,出现了很多问题,下面记录了我在使用Bmob时的问题和一些解决方案(Android Studio版本为3.6,项目使用的Android10.0)
初始化Bmob时,在执行到初始化语句时页面出现闪退的情况。
一开始,我是按照文档里的快速入门配置的BmobSDK,用的是官方推荐的通过添加依赖自动导入的方法。配置完成后,在项目中加入初始化语句,结果每次打开都会闪退。查了很多办法,没有解决问题,也没有找到到底什么原因。后来尝试手动导入,导入成功后,再使用初始化语句就不会闪退了。
手动导入方法:在BmobSDK下载中心下载数据服务 的Android 版本的SDK。下载后,将本地导入SDK文件夹下的libs文件夹里的东西复制到项目工程里的libs目录下。
图上标记的androidx-core-1.0.0在导入后报错,报错信息全是关于androidx-core-1.0.0的,应该是跟已有的版本冲突了,所以不用导入这个。okio-2.1.0导入后未报错,但是在有bmob数据操作的activity会闪退,所以不能本地添加这个okio-2.1.0 jar包。详细信息将在后面给出。
导入成功以后,添加依赖
在app的build.gradle文件中添加依赖文件
// 设置JDK1.8,支持Lambda表达式android{compileOptions {sourceCompatibility JavaVersion.VERSION_1_8targetCompatibility JavaVersion.VERSION_1_8}//添加依赖sourceSets {main.jniLibs.srcDirs = ['libs']}useLibrary 'org.apache.http.legacy'}dependencies {implementation "org.reactivestreams:reactive-streams:1.0.2"implementation fileTree(dir: 'libs', include: ['*.aar', '*.jar'], exclude: [])//导入okio包implementation 'com.squareup.okhttp3:okhttp:3.14.1'implementation 'com.squareup.okio:okio:2.2.2'}
接下来就是配置文件了。
配置AndroidManifest.xml
添加相应的权限
<uses-permission android:name="android.permission.INTERNET" /> <!-- 获取GSM(2g)、WCDMA(联通3g)等网络状态的信息 --><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <!-- 获取wifi网络状态的信息 --><uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <!-- 保持CPU 运转,屏幕和键盘灯有可能是关闭的,用于文件上传和下载 --><uses-permission android:name="android.permission.WAKE_LOCK" /> <!-- 获取sd卡写的权限,用于文件上传和下载 --><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- 允许读取手机状态 用于创建BmobInstallation --><uses-permission android:name="android.permission.READ_PHONE_STATE" />
配置ContentProvider
// A code block<application<providerandroid:name="cn.bmob.v3.util.BmobContentProvider"android:authorities="应用包名.BmobContentProvider"></provider></application>
到这一步BmobSDK就导入成功了,在application的oncreate方法里加入初始化语句 Bmob.initialize(this, “Your Application ID”);这个时候初始化就成功啦!
按照官方文档本地导入SDK后,在执行插入数据时,仍出现了闪退的情况,所以上面给出的配置文件或依赖有官方文档没写的东西。按照以上的步骤配置,应该不会出现我当初的问题。
2.save方法导致的闪退。
当初按照文档给的仅添加配置 sourceSets {
main.jniLibs.srcDirs = [‘libs’]}
调用bmob里的save方法会闪退,调试时主要报错有
LambdaObserver.onError 解决办法:设置JDK1.8,在上面配置文件以给出 Lorg/reactivestreams/Publisher 解决办法:缺少reactive-streams.jar包, implementation “org.reactivestreams:reactive-streams:1.0.2” 上面添加依赖时已给出 Failed resolution of: Lokhttp3/MediaType 解决办法:okio这个包要通过implementation导入,不能本地导入
我给出的本地导入的步骤,里面都直接配置好了这些,可以避免踩雷。
3.网络请求问题
终于没有闪退时,我做了注册登录功能,结果发现在注册完成后接着点击登录,并不能查询到用户信息,必须得重启一下才能登录成功。登录失败获取到的返回报错信息为.UnknownServiceException: CLEARTEXT communication to not permitted by network security policy。
这是由于http请求阻塞不能联网导致的。安卓9强制使用https,这个时候一种解决办法就是让它兼容。在AndroidManifest文件的application里加入android:usesCleartextTraffic=“true”。加入后,多次测试,都没有再出现这个问题。
在大作业中遇到的其他问题将以后再整理。