由于最近要做一个Android的项目作为课程设计,因此又开启了我的学习(ao ye)之旅。今天首先要完成的是登录注册的实现,由于想学习一下LeanCloud的用法,因此我的用户的用户名密码等数据是存储在LeanCloud中的。
1、先在LeanCloud上进行注册,选择个人开发版是有访问次数的限制但是是免费的,点击创建应用——设置,获取APP Key和ID:
2、接下来在Android Studio中新建一个项目(这个自己决定自己的项目),
使用 Android Studio 创建一个新的项目的时候,它的目录结构如下:
.
├── app // 应用源代码
├── ...
├── build.gradle // 应用 Gradle 构建脚本
├── ...
├── build.gradle // 项目 Gradle 构建脚本
├── YOUR-APP-NAME.iml // YOUR-APP-NAME 为你的应用名称
├── gradle
└── settings.gradle
3、进行基本的配置:
(1) 首先打开 app
目录下的 build.gradle
进行如下配置:
android {
//为了解决部分第三方库重复打包了META-INF的问题
packagingOptions{
exclude 'META-INF/LICENSE.txt'
exclude 'META-INF/NOTICE.txt'
}
lintOptions {
abortOnError false
}
}
dependencies {
compile ('com.android.support:support-v4:21.0.3')
// LeanCloud 基础包
compile ('cn.leancloud.android:avoscloud-sdk:4.7.9')
// 推送与即时通讯需要的包
compile ('cn.leancloud.android:avoscloud-push:4.7.9@aar'){transitive = true}
// Android 混合推送需要的包
compile ('cn.leancloud.android:avoscloud-mixpush:4.7.9@aar'){transitive = true}
// LeanCloud 用户反馈包
compile ('cn.leancloud.android:avoscloud-feedback:4.7.9@aar')
// LeanCloud 应用内搜索包
compile ('cn.leancloud.android:avoscloud-search:4.7.9@aar')
}
(2)从 4.7.8 版本开始,已经把 SDK library 推送到了 maven central repository,推荐大家使用这种方式。 同时,也搭建了 LeanCloud 的 maven 仓库,以便在中央仓库访问不了的时候备用,如果要访问maven 仓库,需要在项目根目录下的 build.gradle
进行如下标准配置:
打开根目录下的build.gradle进行如下配置:
buildscript {
repositories {
google()
jcenter()
maven {
url "http://mvn.leancloud.cn/nexus/content/repositories/public"//仓库地址
}
}
dependencies {
classpath 'com.android.tools.build:gradle:3.1.2'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
google()
jcenter()
maven {
url "http://mvn.leancloud.cn/nexus/content/repositories/public"//仓库地址
}
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
然后打开APP目录下的build.gradle进行如下配置:
apply plugin: 'com.android.application'
android {
compileSdkVersion 28
defaultConfig {
applicationId "com.example.flag"
minSdkVersion 15
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support:design:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
implementation 'com.android.support:support-vector-drawable:28.0.0'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}
3、新建一个类继承Application,并初始化AppId和AppKey,作为全局变量,以便使用:
import android.app.Application;
import com.avos.avoscloud.AVOSCloud;
public class MyLeanCloudApp extends Application {
@Override
public void onCreate() {
super.onCreate();
// 初始化参数依次为 this, AppId, AppKey
AVOSCloud.initialize(this,"AppID","AppKey");
}
}
4、在AndroidManifest.xml
文件来配置 SDK 所需要的手机的访问权限以及声明刚才我们创建的MyLeanCloudApp
类,
因为要访问权限所以需要申请一系列的许可:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.flagapplication">
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<application
android:name=".MyLeanCloudApp"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<uses-library
android:name="org.apache.http.legacy"
android:required="false" />
<activity
android:name=".MainActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".registerActivity"></activity>
<activity android:name=".flagActivity"></activity>
</application>
</manifest>
特别需要注意的是新版本的SDK已经不再支持“org.apache.http”,在库里已经不默认包含了,如果还要继续使用的话需要在Manifest文件输入以下代码进行设置:
<uses-library
android:name="org.apache.http.legacy"
android:required="false" />
5、点击登录按钮时,实现功能的函数如下:
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.login:
AVUser.logInInBackground(edit_name.getText().toString(), edit_pwd.getText().toString(), new LogInCallback<AVUser>() {
@Override
public void done(AVUser avUser, AVException e) {
if(e==null){
startActivity(new Intent(MainActivity.this,flagActivity.class));
finish();
}
else{
Toast.makeText(MainActivity.this,"用户名或密码错误",Toast.LENGTH_LONG).show();
}
}
});
break;
case R.id.register:
Intent intent=new Intent(this,registerActivity.class);
startActivity(intent);
break;
case R.id.forget:
break;
}
}
6、实现注册功能:
@Override
public void onClick(View v) {
switch(v.getId()){
case R.id.cancel:
Intent intent=new Intent(this,MainActivity.class);
startActivity(intent);
break;
case R.id.Re:
AVUser user=new AVUser();
user.setUsername(edit_rename.getText().toString());
user.setEmail(edit_reemail.getText().toString());
user.setPassword(edit_repwd.getText().toString());
user.signUpInBackground(new SignUpCallback() {
@Override
public void done(AVException e) {
if(e==null){
startActivity(new Intent(registerActivity.this,MainActivity.class));
registerActivity.this.finish();
}
else{
Toast.makeText(registerActivity.this,"账号已经存在,请重新输入",Toast.LENGTH_LONG).show();
}
}
});
break;
}
}