Bmob 萌新也能简易上手 之一 注册登录- *2020版 (有demo)
前言:一切以Bmob官方开发文档为准: http://doc.bmob.cn/data/android/develop_doc/ ,新手快速入门: http://doc.bmob.cn/data/android/ 。查看Bmob后台数据是个好习惯
作为只会app客户端,不懂服务端的人,Bmob简直就是救命稻草!用它来存放爬取的数据,朋友圈数据,图片语音视频,还有app版本更新…易如反掌。经常有同学问如何上传头像、文件、图片bla bla,重要的事说三遍:绑定独立域名,绑它,绑它!具体怎么绑问度娘。当然Bmob也提供此类服务,收费,至于价格,还好啦…demo下载:
链接:https://pan.baidu.com/s/1qwQ8AzaLjxUtaqVqDGaNzg
提取码:yrdt
demo基于androidx,AS4.0导入demo无压力。先让app跑起来,再细看代码 。固执使用V4,V7包的同学,自行导包,代码基本一致。官网下个AS 4.0不香么,无需翻墙,速度很快: https://developer.android.google.cn/studio 。安装参考: https://blog.csdn.net/qq_41976613/article/details/91432304
本文除Bmob注册登录,还有沉浸式状态栏、权限申请的方法
特别提醒:使用androidx的同学 ,查看下 gradle.properties文件中 是否包含以下两行,若无则加上:
android.useAndroidX=true
android.enableJetifier=true
一、Bmob SDK 导入
1) 工程目录下的 build.gradle 文件中添加:
maven {url 'https://dl.bintray.com/chaozhouzhang/maven' }
添加后的样子:
// Top-level build file where you can add configuration options common to all sub-projects/modules.buildscript {repositories {google()jcenter()}dependencies {classpath 'com.android.tools.build:gradle:3.5.3'// NOTE: Do not place your application dependencies here; they belong// in the individual module build.gradle files}
}allprojects {repositories {google()jcenter()maven {url 'https://dl.bintray.com/chaozhouzhang/maven' }}
}task clean(type: Delete) {delete rootProject.buildDir
}
2) app下 build.gradle 文件中添加:
1)useLibrary 'org.apache.http.legacy'
2)compileOptions {sourceCompatibility JavaVersion.VERSION_1_8targetCompatibility JavaVersion.VERSION_1_8}3)implementation 'cn.bmob.android:bmob-sdk:3.7.8'implementation 'io.reactivex.rxjava2:rxjava:2.2.6'implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'implementation 'com.squareup.okhttp3:okhttp:3.14.1'implementation 'com.squareup.okio:okio:2.2.2'implementation 'com.google.code.gson:gson:2.8.5'
添加后的build.gradle文件:
apply plugin: 'com.android.application'android {useLibrary 'org.apache.http.legacy'compileSdkVersion 29buildToolsVersion "29.0.2"defaultConfig {applicationId "com.example.asus.bmobtest"minSdkVersion 21targetSdkVersion 29versionCode 1versionName "1.0"testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"}buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'}}compileOptions {sourceCompatibility JavaVersion.VERSION_1_8targetCompatibility JavaVersion.VERSION_1_8}
}dependencies {implementation fileTree(dir: 'libs', include: ['*.jar'])implementation 'androidx.appcompat:appcompat:1.1.0'implementation 'androidx.constraintlayout:constraintlayout:1.1.3'testImplementation 'junit:junit:4.12'androidTestImplementation 'androidx.test:runner:1.2.0'androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'implementation 'cn.bmob.android:bmob-sdk:3.7.8'implementation 'io.reactivex.rxjava2:rxjava:2.2.6'implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'implementation 'com.squareup.okhttp3:okhttp:3.14.1'implementation 'com.squareup.okio:okio:2.2.2'implementation 'com.google.code.gson:gson:2.8.5'
}
前面两步是如何导入Bmob,不要忘记同步一下
二、清单文件配置
配置 Bmob Provider
<!--Bmob--><providerandroid:name="cn.bmob.v3.util.BmobContentProvider"android:authorities="自己的包名.BmobContentProvider" />
***强烈建议在清单文件里加上相应权限,否则注册时会出现9015错误
errorCode:9015,errorMsg:java.net.Inet6AddressImpl.lookupHostByName(Inet6AddressImpl.java:150)
FileProvider请改成自己报名
完整 清单文件:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"package="com.example.asus.bmobtest"><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /><uses-permission android:name="android.permission.WAKE_LOCK" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.READ_PHONE_STATE" /><uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/><uses-permission android:name="android.permission.CAMERA"/><uses-permission android:name="android.permission.READ_CONTACTS"/><uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /><uses-permission android:name="android.permission.RECORD_AUDIO"/><uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/><uses-permission android:name="android.permission.VIBRATE"/><uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/><uses-permission android:name="android.permission.CALL_PHONE"/><applicationandroid:name=".base.BaseApp"android:allowBackup="true"android:icon="@mipmap/ic_launcher"android:networkSecurityConfig="@xml/network_security_config"android:requestLegacyExternalStorage="true"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/AppTheme"android:usesCleartextTraffic="true"tools:ignore="GoogleAppIndexingWarning"><activity android:name=".activity.LoginActivity" ><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity> <!-- Bmob --><providerandroid:name="cn.bmob.v3.util.BmobContentProvider"android:authorities="com.example.asus.bmobtest.BmobContentProvider" /><providerandroid:name="androidx.core.content.FileProvider"android:authorities="com.example.asus.bmobtest.fileprovider"android:exported="false"android:grantUriPermissions="true"><meta-dataandroid:name="android.support.FILE_PROVIDER_PATHS"android:resource="@xml/filepaths" /></provider><activity android:name=".TestActivity" /><activity android:name=".activity.RegisterActivity" /></application></manifest>
三、数据类
1)用户类 MyUser,注意要继承BmobUser
public class MyUser extends BmobUser {private String tokenNickName;public String getTokenNickName() {return tokenNickName;}public void setTokenNickName(String tokenNickName) {this.tokenNickName = tokenNickName;}
}
2)Bmob单例管理类:BmobManager
public class BmobManager {private static final String BMOB_SDK_ID = "自己Bmob账号";private volatile static BmobManager mInstance = null;private BmobManager() {}public static BmobManager getInstance() {if (mInstance == null) {synchronized (BmobManager.class) {if (mInstance == null) {mInstance = new BmobManager();}}}return mInstance;}//初始化Bmobpublic void initBmob(Context mContext) {Bmob.initialize(mContext, BMOB_SDK_ID);}// 手机登录成功后获取本地对象public MyUser getUser() {return BmobUser.getCurrentUser(MyUser.class);}// 是否登录public boolean isLogin() {return BmobUser.isLogin();}}
3)自定义Application类
对Bmob进行初始化,并在清单文件 AndroidManafest.xml 标签下进行指定,保险起见务必加上该类完整包名!
public class BaseApp extends Application {private static Context sContext;private static int mainThreadId;private static Handler handler;@Overridepublic void onCreate() {super.onCreate();sContext = getApplicationContext();mainThreadId = android.os.Process.myTid();handler = new Handler();//只在主进程中初始化if (getApplicationInfo().packageName.equals(getCurProcessName(getApplicationContext()))) {//初始化bmobBmobManager.getInstance().initBmob(this);SpUtils.getInstance().initSp(sContext);//对SharedPreference进行初始化}}@Overridepublic void onTrimMemory(int level) {super.onTrimMemory(level);}// 获取当前进程名public static String getCurProcessName(Context context) {int pid = android.os.Process.myPid();ActivityManager activityManager = (ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE);for (ActivityManager.RunningAppProcessInfo appProcess :activityManager.getRunningAppProcesses()) {if (appProcess.pid == pid) {return appProcess.processName;}}return null;}public static Handler getHandler() {return handler;}public static Context getContext() {return sContext;}public static int getMainThreadId() {return mainThreadId;}
}
android:name=".base.BaseApp"
四、活动基类BaseActivity
权限申请,其他项目也能用
public class BaseActivity extends AppCompatActivity {//申请运行时权限的Codeprivate static final int PERMISSION_REQUEST_CODE = 1000;//申请窗口权限的Codepublic static final int PERMISSION_WINDOW_REQUEST_CODE = 1001;//申明所需权限private String[] mStrPermission = {Manifest.permission.READ_PHONE_STATE,Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.CAMERA,Manifest.permission.READ_CONTACTS,Manifest.permission.ACCESS_COARSE_LOCATION,Manifest.permission.RECORD_AUDIO,Manifest.permission.CALL_PHONE,Manifest.permission.ACCESS_FINE_LOCATION};//保存没有同意的权限private List<String> mPerList = new ArrayList<>();//保存没有同意的失败权限private List<String> mPerNoList = new ArrayList<>();private OnPermissionsResult permissionsResult;/*** 一个方法请求权限** @param permissionsResult*/protected void request(OnPermissionsResult permissionsResult) {Log.i("register","base activity request 请求权限:" );if (!checkPermissionsAll()) {requestPermissionAll(permissionsResult);}}/*** 判断单个权限** @param permissions* @return*/protected boolean checkPermissions(String permissions) {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {int check = checkSelfPermission(permissions);return check == PackageManager.PERMISSION_GRANTED;}return false;}/*** 判断是否需要申请权限** @return*/protected boolean checkPermissionsAll() {mPerList.clear();for (int i = 0; i < mStrPermission.length; i++) {boolean check = checkPermissions(mStrPermission[i]);//如果不同意则请求if (!check) {mPerList.add(mStrPermission[i]);}}return mPerList.size() > 0 ? false : true;}/*** 请求权限** @param mPermissions*/protected void requestPermission(String[] mPermissions) {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {requestPermissions(mPermissions, PERMISSION_REQUEST_CODE);}}/*** 申请所有权限** @param permissionsResult*/protected void requestPermissionAll(OnPermissionsResult permissionsResult) {this.permissionsResult = permissionsResult;requestPermission((String[]) mPerList.toArray(new String[mPerList.size()]));}@Overridepublic void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {mPerNoList.clear();if (requestCode == PERMISSION_REQUEST_CODE) {if (grantResults.length > 0) {for (int i = 0; i < grantResults.length; i++) {if (grantResults[i] == PackageManager.PERMISSION_DENIED) {//你有失败的权限mPerNoList.add(permissions[i]);}}if (permissionsResult != null) {if (mPerNoList.size() == 0) {permissionsResult.OnSuccess();} else {permissionsResult.OnFail(mPerNoList);}}}}super.onRequestPermissionsResult(requestCode, permissions, grantResults);}protected interface OnPermissionsResult {void OnSuccess();void OnFail(List<String> noPermissions);}/*** 判断窗口权限** @return*/protected boolean checkWindowPermissions() {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {return Settings.canDrawOverlays(this);}return true;}/*** 请求窗口权限*/protected void requestWindowPermissions() {Toast.makeText(this, "申请窗口权限,暂时没做UI交互", Toast.LENGTH_SHORT).show();Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + getPackageName()));startActivityForResult(intent, PERMISSION_WINDOW_REQUEST_CODE);} }
五、注册类RegisterActivity
这里为了方便,使用账号密码登录,也可用短信或者第三方登录。短信登录每天有免费条数限制,具体查看官方文档。下面的注册方法,请从界面的EditText读取相关数据再调用。
参数:
myAccount 账号,方便起见,请填入电话号码
password 密码
nickName 你的网络称呼
关键注册代码:
//账号密码注册,private void signUp(final String myAccount, final String password,String nickName) {MyUser user = new MyUser();user.setUsername(myAccount);user.setPassword(password);user.setTokenNickName(nickName);user.signUp(new SaveListener<MyUser>() {@Overridepublic void done(MyUser user, BmobException e) {if (e == null) {Loggerr.i("注册成功");//去登录loginByAccount(myAccount, password);} else {Loggerr.i("注册失败:" + e.toString());}}});}
五、登录类LoginActivity
若为单独登录界面,请从界面的EditText读取相关数据再调用。参数注册。关键代码:
/*** 账号密码登录*/private void loginByAccount(final String username, String password) {//此处替换为你的用户名密码BmobUser.loginByAccount(username, password, new LogInListener<MyUser>() {@Overridepublic void done(MyUser user, BmobException e) {if (e == null) {Loggerr.i("登录成功");startActivity(new Intent(LoginActivity.this, TestActivity.class));} else {Loggerr.i("登录失败:" + e.toString());Toast.makeText(LoginActivity.this, "登录失败:"+ e.toString(), Toast.LENGTH_SHORT).show();//不能回复自己评论弹出删除框}}});}
六、运行代码
登录成功后,去Bmob后台查看_User表,确定注册成功
登录Bmob,查看后台数据
Bmob后台用户数据:
登录成功后,成功跳转主页面:
Bmob 萌新也能简易上手 之一 注册登录- *2020版 (有demo)相关推荐
- 萌新学习Python爬取B站弹幕+R语言分词demo说明
代码地址如下: http://www.demodashi.com/demo/11578.html 一.写在前面 之前在简书首页看到了Python爬虫的介绍,于是就想着爬取B站弹幕并绘制词云,因此有了这 ...
- OpenCV萌新福音:易上手的数字识别实践案例
摘要:信用卡识别的案例用到了图像处理的一些基本操作,对刚上手CV的人来说还是比较友好的. 本文分享自华为云社区<Python openCV案例:信用卡数字识别>,原文作者:深蓝的回音 . ...
- 给萌新的Flexbox简易入门教程
转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. [年末促销]葡萄城 2018 岁末福利火热放送中 原文出处:https://www.sitepoint.co ...
- 【Qt萌新开发】简易PC微信::只能自娱自乐的实时通信软件
故事开端:: 数据结构课上,老师布置了一项任务::实验课结束前,完成以下任意一个作业 大概,长这样子:: 这,都是,啥呀~~~~ 他喵的我会啥呀~~~~~ 瓜达尔港是啥呀~~~~~~ 顺便一提, ...
- 【萌新入门向】vivado从新建工程到上版观察现象--拨码开关点亮LED
写在前面 --Fraay 大家好,本人普通一本大学的电子信息工程小白一枚,在CSDN上面白嫖程序已经很久了,尤其是这一个多月一直在钻FPGA,现在稍微有点起色,于是把自己的一点心得记录一下.希 ...
- 小萌新准备参加五一建模大赛纪实
小萌新准备参加五一数学建模大赛纪实 2020.4.20 2020.4.21 2020.4.22 2020.4.28 2020.5.1 本萌新在对数学建模一无所知的情况下,被邀请一起参加数学建模比赛,虽 ...
- 机器学习萌新必学的 Top10 算法
点击上方"Datawhale",选择"星标"公众号 价值内容第一时间获取 来源: 量子位 在机器学习领域里,不存在一种万能的算法可以完美解决所有问题,尤其是像预 ...
- 刚毕业的职场萌新应具备这9种技能
一年一度的毕业季又到了 不知道各位有没有找到心仪的工作呢 初入职场的萌新 一定是既激动又紧张 今日分享一份职场新人书单 介绍9种职场必备的技能 这既是图灵君多年工作的经验总结 也是送给所有毕业生的一份 ...
- kafaka生产者消费者demo(简易上手demo)
kafaka生产者消费者demo(简易上手demo) 文章目录 kafaka生产者消费者demo(简易上手demo) 导包 kafka官方client spring官方template spring官 ...
最新文章
- Map的分类和不同的应用场景
- javascript高级程序设计之BOM
- 中间代码生成器-5-编译原理
- Hadoop:eclipse配置hadoop-eclipse-plugin(版本hadoop2.7.3)
- 如何逃离「信息茧房」?
- php for next,Nextcloud停留无限登录页面 PHP7的问题及解决方案
- 小米Civi 1S获美女产品经理确认:依旧是最美小米机型
- mySql 修改字段自增
- python画曲线图-python画曲线
- shiro源码_基于Redis的shiro集中式缓存解决方案源码免费分享
- matlab中画花瓣,matlab花瓣图的编程原理是什么,向天下大侠求解!!!!给力的? 爱问知识人...
- 密码学原语如何应用?解析单向哈希的妙用|第9论
- 百兆宽带插网线只有1mb/s的下载速度问题!
- 一个FC游戏的下载站点
- 资讯App排行榜出炉,凤凰新闻客户端如何成了行业变量?
- 设计模式 模版方法模式 展现程序员的一天
- Selenium浏览器自动化测试工具
- 别把爱变成伤害,不要在朋友圈里乱晒娃,朋友圈晒娃注意四点
- oracle utl file putf,UTL_FILE包详解(第二篇)
- 0603-0605读书报告
热门文章
- 前端页面生成神器以及后端变量命名神器
- 浅析 Hadoop 中的数据倾斜
- oraoledb.oracle.11,Oracle11g链接提示未“在本地计算机注册“OraOLEDB.Oracle”解决方法...
- 头歌 初识Redis
- 如何做好性能压测(一):压测环境的设计和搭建
- a豆:在讲一个珍重每一个人的故事
- Python程序设计,pygame飞机大战课程设计
- Tapestry入门
- 服务器一直被攻击怎么办?
- 80亿美元侵权诉讼的随想