前言:一切以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)相关推荐

  1. 萌新学习Python爬取B站弹幕+R语言分词demo说明

    代码地址如下: http://www.demodashi.com/demo/11578.html 一.写在前面 之前在简书首页看到了Python爬虫的介绍,于是就想着爬取B站弹幕并绘制词云,因此有了这 ...

  2. OpenCV萌新福音:易上手的数字识别实践案例

    摘要:信用卡识别的案例用到了图像处理的一些基本操作,对刚上手CV的人来说还是比较友好的. 本文分享自华为云社区<Python openCV案例:信用卡数字识别>,原文作者:深蓝的回音 . ...

  3. 给萌新的Flexbox简易入门教程

    转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. [年末促销]葡萄城 2018 岁末福利火热放送中 原文出处:https://www.sitepoint.co ...

  4. 【Qt萌新开发】简易PC微信::只能自娱自乐的实时通信软件

    故事开端:: 数据结构课上,老师布置了一项任务::实验课结束前,完成以下任意一个作业 大概,长这样子:: 这,都是,啥呀~~~~   他喵的我会啥呀~~~~~  瓜达尔港是啥呀~~~~~~ 顺便一提, ...

  5. 【萌新入门向】vivado从新建工程到上版观察现象--拨码开关点亮LED

    写在前面     --Fraay 大家好,本人普通一本大学的电子信息工程小白一枚,在CSDN上面白嫖程序已经很久了,尤其是这一个多月一直在钻FPGA,现在稍微有点起色,于是把自己的一点心得记录一下.希 ...

  6. 小萌新准备参加五一建模大赛纪实

    小萌新准备参加五一数学建模大赛纪实 2020.4.20 2020.4.21 2020.4.22 2020.4.28 2020.5.1 本萌新在对数学建模一无所知的情况下,被邀请一起参加数学建模比赛,虽 ...

  7. 机器学习萌新必学的 Top10 算法

    点击上方"Datawhale",选择"星标"公众号 价值内容第一时间获取 来源: 量子位 在机器学习领域里,不存在一种万能的算法可以完美解决所有问题,尤其是像预 ...

  8. 刚毕业的职场萌新应具备这9种技能

    一年一度的毕业季又到了 不知道各位有没有找到心仪的工作呢 初入职场的萌新 一定是既激动又紧张 今日分享一份职场新人书单 介绍9种职场必备的技能 这既是图灵君多年工作的经验总结 也是送给所有毕业生的一份 ...

  9. kafaka生产者消费者demo(简易上手demo)

    kafaka生产者消费者demo(简易上手demo) 文章目录 kafaka生产者消费者demo(简易上手demo) 导包 kafka官方client spring官方template spring官 ...

最新文章

  1. Map的分类和不同的应用场景
  2. javascript高级程序设计之BOM
  3. 中间代码生成器-5-编译原理
  4. Hadoop:eclipse配置hadoop-eclipse-plugin(版本hadoop2.7.3)
  5. 如何逃离「信息茧房」?
  6. php for next,Nextcloud停留无限登录页面 PHP7的问题及解决方案
  7. 小米Civi 1S获美女产品经理确认:依旧是最美小米机型
  8. mySql 修改字段自增
  9. python画曲线图-python画曲线
  10. shiro源码_基于Redis的shiro集中式缓存解决方案源码免费分享
  11. matlab中画花瓣,matlab花瓣图的编程原理是什么,向天下大侠求解!!!!给力的? 爱问知识人...
  12. 密码学原语如何应用?解析单向哈希的妙用|第9论
  13. 百兆宽带插网线只有1mb/s的下载速度问题!
  14. 一个FC游戏的下载站点
  15. 资讯App排行榜出炉,凤凰新闻客户端如何成了行业变量?
  16. 设计模式 模版方法模式 展现程序员的一天
  17. Selenium浏览器自动化测试工具
  18. 别把爱变成伤害,不要在朋友圈里乱晒娃,朋友圈晒娃注意四点
  19. oracle utl file putf,UTL_FILE包详解(第二篇)
  20. 0603-0605读书报告

热门文章

  1. 前端页面生成神器以及后端变量命名神器
  2. 浅析 Hadoop 中的数据倾斜
  3. oraoledb.oracle.11,Oracle11g链接提示未“在本地计算机注册“OraOLEDB.Oracle”解决方法...
  4. 头歌 初识Redis
  5. 如何做好性能压测(一):压测环境的设计和搭建
  6. a豆:在讲一个珍重每一个人的故事
  7. Python程序设计,pygame飞机大战课程设计
  8. Tapestry入门
  9. 服务器一直被攻击怎么办?
  10. 80亿美元侵权诉讼的随想