Android如何使用Bmob后端云实现失物招领功能
作者:龙旋 发布时间:2023-10-15 07:28:05
最近在使用后端云Bmob对数据进行存储,目的是在不搭建服务器的前提下,能对Android应用的数据进行操作处理,其实这篇是比较久之前写的了,有些童鞋反馈说现在的源码会有问题,所以我又重新运行了一下,随着Bmob版本的更新,之前的源码跑不起来,现在重新更新了最新版本做了个Demo.
实现步骤:
一、创建账号
需要的自己去注册,后端云Bmob首页地址:https://www.bmob.cn/
二、网站后台创建应用(如图)
这里使用的是免费版的
创建成功之后点击创建的应用进去,在设置->应用秘钥中可以找到应用秘钥
三、AndroidStudio SDK导入信息配置
详细参考:http://doc.bmob.cn/data/android/index.html
1、在 Project 的 build.gradle 文件中添加 Bmob的maven仓库地址:
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.6.1'
}
}
allprojects {
repositories {
google()
jcenter()
//Bmob的maven仓库地址--必填
maven { url "https://raw.github.com/bmob/bmob-android-sdk/master" }
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
2、在app的build.gradle文件中添加compile依赖文件:
android {
compileSdkVersion 30
buildToolsVersion "30.0.3"
**兼容Android6.0系统所需,如果这句话报错,可在dependencies标签下使用compile 'cn.bmob.android:http-legacy:1.0'**
useLibrary 'org.apache.http.legacy'
...
}
dependencies {
//以下SDK开发者请根据需要自行选择
//bmob-sdk:Bmob的android sdk包,包含了Bmob的数据存储、文件等服务,以下是最新的bmob-sdk:
//3.5.5:请务必查看下面注释[1]
implementation 'cn.bmob.android:bmob-sdk:3.5.5'
//bmob-push:Bmob的推送包
implementation 'cn.bmob.android:bmob-push:0.8'
//bmob-im:Bmob的即时通讯包,注意每个版本的im依赖特定版本的bmob-sdk,具体的依赖关系可查看下面注释[2]
implementation 'cn.bmob.android:bmob-im:2.0.5@aar'
implementation 'cn.bmob.android:bmob-sdk:3.4.7-aar'
//bmob-sms :Bmob单独为短信服务提供的包
implementation 'cn.bmob.android:bmob-sms:1.0.1'
//如果你想应用能够兼容Android6.0,请添加此依赖(org.apache.http.legacy.jar)
implementation 'cn.bmob.android:http-legacy:1.0'
}
3、在你的应用程序的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" />
四、应用中使用详情
这里演示部分的API:
1、启动页:
初始化BmobSDK:
//第一:默认初始化
Bmob.initialize(this,"Your Application ID");
2、由登录界面进入注册页面,进行账户注册:
输入账号密码后点击注册按钮:
private void bmobRegisterAccount() {
final String registerName = accountRegisterName.getText().toString().trim();//账号
final String registerPassword = accountRegisterPassword.getText().toString().trim();//密码
if (TextUtils.isEmpty(registerName) || TextUtils.isEmpty(registerPassword)) {
showToast("注册账号或密码为空");
return;
}
BmobUser bmobUser = new BmobUser();
bmobUser.setUsername(registerName);
bmobUser.setPassword(registerPassword);
bmobUser.signUp(new SaveListener<BmobUser>() {
@Override
public void done(BmobUser bmobUser, BmobException e) {
if (e == null) {
showToast("恭喜,注册账号成功");
finish();
} else {
showToast("register fail:" + e.getMessage());
}
}
});
}
注册成功后在后端云Bmob后台有信心记录:
3、注册成功后回到登录界面
输入账号密码后点击登录按钮:
private void bmobUserAccountLogin() {
final String accountName = accountLoginName.getText().toString().trim();//账号
final String accountPassword = accountLoginPassword.getText().toString().trim();//密码
if (TextUtils.isEmpty(accountName)) {
showToast("账号不能为空");
return;
}
if (TextUtils.isEmpty(accountPassword)) {
showToast("密码不能为空");
return;
}
//登录过程
showProgressBar();
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
//BmobUser类为Bmob后端云提供类
BmobUser bmobUser = new BmobUser();
bmobUser.setUsername(accountName);
bmobUser.setPassword(accountPassword);
bmobUser.login(new SaveListener<BmobUser>() {
@Override
public void done(BmobUser bmobUser, BmobException e) {
if (e == null) {
//登录成功后进入主界面
Intent intent = new Intent(LoginActivity.this, LostAndFoundActivity.class);
startActivity(intent);
finish();
} else {
showToast("" + e.getMessage());
hiddenProgressBar();//隐藏
}
}
});
}
}, 3000);
}
4、登录成功后进入主界面,右上方按钮进入失物招领的信息发布界面
4-1、信息完成后,点击右上角点击发布按钮,此时需要添加数据:
先创建bean类,继承BmobObject类
public class LostInfomationReq extends BmobObject{
private String title; //标题
private String phoneNum;//手机号码
private String desc;//描述
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getPhoneNum() {
return phoneNum;
}
public void setPhoneNum(String phoneNum) {
this.phoneNum = phoneNum;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
}
4-2、发布信息:
/**
* @param titleName 标题
* @param num 电话号码
* @param descridle 描述
*/
private void publishLostInfo(String titleName, String num, String descridle) {
LostInfomationReq lostInfomationReq = new LostInfomationReq();
lostInfomationReq.setTitle(titleName);//titleName为用户输入的标题
lostInfomationReq.setPhoneNum(num);//num为用户输入的号码
lostInfomationReq.setDesc(descridle);//descridle为信息描述
lostInfomationReq.save(new SaveListener<String>() {
@Override
public void done(String s, BmobException e) {
if (e == null) {
showToast("招领信息发布成功");
//成功后提示主界面刷新数据
Intent intent = new Intent();
setResult(RESULT_OK, intent);
//成功后将页面销毁
finish();
} else {
showToast("信息发布失败");
}
}
});
}
4-3、添加数据成功后,在后台会有插入的数据:
5、主界面的信息需要读取后台用户插入的数据:
数据的查询:
private void initData() {
BmobQuery<LostInfomationReq> lostInfomationReqBmobQuery = new BmobQuery<>();
lostInfomationReqBmobQuery.order("-updatedAt");//排序
lostInfomationReqBmobQuery.findObjects(new FindListener<LostInfomationReq>() {
@Override
public void done(List<LostInfomationReq> list, BmobException e) {
if (e == null) {
lostInfomationReqList = list;
lostAndFoundAdapter.setData(list);
recyclerView.setAdapter(lostAndFoundAdapter);
} else {
showToast("查询数据失败");
}
}
});
}
6、长按RecyclerView每条Item进行编辑与删除操作:
6-1、删除操作即是将后台中的将选中的信息删除
private void deleteItemData(final int position) {
if (lostInfomationReqList.size() != 0) {
LostInfomationReq lostInfomationReq = new LostInfomationReq();
lostInfomationReq.setObjectId(lostInfomationReqList.get(position).getObjectId());
lostInfomationReq.delete(new UpdateListener() {
@Override
public void done(BmobException e) {
if (e == null) {
lostInfomationReqList.remove(position);
lostAndFoundAdapter.setData(lostInfomationReqList);
lostAndFoundAdapter.notifyDataSetChanged();
} else {
showToast("删除数据失败");
}
}
});
}
}
6-2、编辑操作即对数据进行修改
/**
* @param titleName 标题
* @param num 电话号码
* @param descridle 描述
*/
private void updataInfo(String titleName, String num, String descridle) {
LostInfomationReq lostInfomationReq = new LostInfomationReq();
lostInfomationReq.setTitle(titleName);//titleName为用户输入的标题
lostInfomationReq.setPhoneNum(num);//num为用户输入的号码
lostInfomationReq.setDesc(descridle);//descridle为信息描述
lostInfomationReq.update(infomationReq.getObjectId(), new UpdateListener() {
@Override
public void done(BmobException e) {
if (e == null) {
showToast("更新信息成功");
//更新数据后提示主界面进行数据刷新
Intent intent = new Intent();
setResult(RESULT_OK, intent);
finish();
}
}
});
}
7、使用PopupWindow长按弹出框
private void showWindow(LostAndFoundHolder holder, final int pos) {
//加载布局文件
View contentview = LayoutInflater.from(mContext).inflate(R.layout.pop_window_view,null);
final PopupWindow popupWindow = new PopupWindow(contentview, LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
//设置焦点
popupWindow.setFocusable(true);
//触摸框外
popupWindow.setOutsideTouchable(true);
//点击空白处的时候让PopupWindow消失
popupWindow.setBackgroundDrawable(new ColorDrawable(0x00000000));
//设置偏移量
popupWindow.showAsDropDown(holder.time, 300, -100);
//showAsDropDown(View anchor):相对某个控件的位置(正左下方),无偏移
// showAsDropDown(View anchor, int xoff, int yoff):相对某个控件的位置,有偏移
//showAtLocation(View parent, int gravity, int x, int y):相对于父控件的位置(例如正中央Gravity.CENTER,下方Gravity.BOTTOM等),可以设置偏移或无偏移
//点击编辑按钮
contentview.findViewById(R.id.edit_btn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//回调给主界面,进行数据操作
mItemClickListener.onEditOrDeleteClick(pos, EDIT_CODE);
//销毁弹出框
popupWindow.dismiss();
}
});
//点击删除按钮
contentview.findViewById(R.id.delete_btn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//回调给主界面,进行数据操作
mItemClickListener.onEditOrDeleteClick(pos, DELETE_CODE);
//销毁弹出框
popupWindow.dismiss();
}
});
}
8、总结
8-1、实现登录、注册的过程:
使用Bmob提供专门的用户类——BmobUser来自动处理用户账户管理所需的功能。有了这个类,你就可以在你的应用程序中添加用户账户功能。BmobUser是BmobObject的一个子类,它继承了BmobObject所有的方法,具有BmobObject相同的功能。不同的是,BmobUser增加了一些特定的关于用户账户管理相关的功能。
8-2、失物招领:
这个过程中,我们对数据进行了添加、查询、删除以及更新操作,当然后端云Bmob还不止提供了这些API,还有很多API还需要掌握。
BmobDemo源码:
链接:https://pan.baidu.com/s/1wTcWWEitQT65MDtr3PSvhQ
提取码:emue
来源:https://mp.weixin.qq.com/s/3JiR7Xcj-yi9e9TW9rLetA


猜你喜欢
- 一、准备java我已经把java装到了在D盘:二、配置java环境变量点击设置,进入windows设置页面;搜索高级系统设置:在系统变量里添
- 背景SpringBoot bean 加载顺序如何查看,想看加载了哪些bean, 这些bean的加载顺序是什么?实际加载顺序不受控制,但会有一
- Hook是一种思想,也就是将原来的事件,替换到我们自己的事件,方便我们做一些切入处理。目的是不修改原来的代码,同时也避免遗漏的N多类里面处理
- JAVA的 * 代理模式 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤
- 1、实现循环队列【OJ链接】循环队列一般通过数组实现。我们需要解决几个问题。(1)数组下标实现循环a、下标最后再往后(offset 小于 a
- 1.实例1(主要看到[2])1.1.系统功能: 开发一个计算器服务CalculateService,这个服务包含加(plus)、减(minu
- 我们首先看下BASEJDBC的写法实例:package com.dao;import java.sql.Connection;import
- 模板的定义C++中的模板和泛型编程是非常重要的概念。模板是一种将数据类型作为参数的通用程序设计方法。它们允许开发人员编写可以处理各种数据类型
- 1. 简单工厂模式简介简单工厂模式(Simple Factory),又被称为"静态工厂方法模式"。它属于"创建
- 使用INI配置文件,简单便捷。该辅助工具类为C#操作INI文件的辅助类,源码在某位师傅的基础上完善的来,因为忘记最初的来源了,因此不能提及引
- @Scheduled不执行的原因1. 今天用@Schedule做了一个定时任务希望凌晨1点执行,代码如下@Servicepublic cla
- 一、项目简述(+需求文档+PPT)功能:卡管理,卡消费,卡充值,图书借阅,消费,记录,注销等等功能。二、项目运行环境配置:Jdk1.8 +
- 前言Kafka是现在非常热门的分布式消息队列,常用于微服务间异步通信,业务解耦等场景。kafka的性能非常强大,但是单个微服务吞吐性能是有上
- 本文实例为大家分享了java实现录音播放的具体代码,供大家参考,具体内容如下需求:1.实现可以从麦克风进行录音2.可以停止录音3.实现播放录
- 本文实例讲述了Java基于socket实现简易聊天室的方法。分享给大家供大家参考。具体实现方法如下:chatroomdemo.javapac
- 上篇并发编程之Java内存模型volatile的内存语义介绍了volatile的内存语义,本文讲述的是final的内存语义,相比之下,fin
- Spring Boot如何实现分布式锁的自动释放在分布式系统中,为了保证数据的一致性和可靠性,常常需要使用分布式锁。在实际开发中,我们可以使
- java 请求跨域问题解决方法实例详解新建Util类,在Util中添加下面方法: /* * response请求跨域公共设置
- 一.服务器端获取Session对象依赖于客户端携带的Cookie中的JSESSIONID数据。如果用户把浏览器的隐私级别调到最高,这时浏览器
- 1.Jquery验证1)引入头文件<script src="../../Scripts/jquery-1.7.1.js&qu