进入mob官网,注册账号,创建应用,在管理控制台集成想要的功能。我们这里只使用maven的方式集成(这个很方便)。
文件配置参考http://wiki.mob.com/mobpush-for-android/,主要是前面的集成方式。如果自己有Application,在oncreate()方法中添加初始化信息:
MobSDK.init(this);如果自己没有Application,MobSDK会将这个设置为com.mob.MobApplication。
一、第三方登录
1.第三方登录的通用方法(也可以写成一个工具类)
/**
* 第三方登录
*/
private void WXLogin(String name) {
Platform platform = ShareSDK.getPlatform(name);
if(platform==null){
return;
}
//判断指定平台是否已经完成授权
if(platform.isAuthValid()){
String userId=platform.getDb().getUserId();
if(userId!=null){
UIHandler.sendEmptyMessage(MSG_USERID_FOUND,LoginActivity.this);
login(platform.getName(),userId,null);
}
}
platform.SSOSetting(false);//单点登录,设置为false,优先采用客户端授权
//设置监听
platform.setPlatformActionListener(this);
//获取登录用户的信息,如果没有授权,会先授权,然后获取用户信息
platform.authorize();
}
@Override
public boolean handleMessage(Message message) {
switch (message.what){
case MSG_USERID_FOUND:
Toast.makeText(this, "信息已找到", Toast.LENGTH_SHORT).show();
break;
case MSG_LOGIN:
Toast.makeText(this, "已登陆", Toast.LENGTH_SHORT).show();
break;
case MSG_AUTH_CANCEL:
Toast.makeText(this, "已取消", Toast.LENGTH_SHORT).show();
break;
case MSG_AUTH_ERROR:
Toast.makeText(this, "请求错误", Toast.LENGTH_SHORT).show();
break;
case MSG_AUTH_COMPLETE:
Toast.makeText(this, "信息已收到", Toast.LENGTH_SHORT).show();
break;
default:
break;
}
return false;
}
/**
* 发送登录请求
*/
private void login(String plat,String userId,HashMap<String,Object>userInfo){
Message message=new Message();
message.what=MSG_LOGIN;
message.obj=plat;
UIHandler.sendMessage(message,this);
}
/**
* 登陆成功
* @param platform
* @param i
* @param hashMap
*/
@Override
public void onComplete(Platform platform, int i, HashMap<String, Object> hashMap) {
if(i==Platform.ACTION_AUTHORIZING){
//登陆成功,获取需要的信息
UIHandler.sendEmptyMessage(MSG_AUTH_COMPLETE,this);
login(platform.getName(),platform.getDb().getUserId(),hashMap);
String openid=platform.getDb().getUserId()+"";
String gender=platform.getDb().getUserGender();
String gead_url=platform.getDb().getUserIcon();
String nickname=platform.getDb().getUserName();
// Log.e("openid,",openid);
Log.e("gender,",gender+"");
// Log.e("gead_url,",gead_url);
// Log.e("nickname,",nickname);
// Log.e("登陆,",openid+""+gender+""+gead_url+""+nickname);
Intent intent=new Intent(LoginActivity.this,MainActivity.class);
// Bundle bundle=new Bundle();
intent.putExtra("image_tx",gead_url);
intent.putExtra("name",nickname);
startActivity(intent);
}
}
@Override
public void onError(Platform platform, int i, Throwable throwable) {
if(i==Platform.ACTION_AUTHORIZING){
UIHandler.sendEmptyMessage(MSG_AUTH_ERROR,this);
}
throwable.printStackTrace();
Log.e("登陆1,","失败");
}
@Override
public void onCancel(Platform platform, int i) {
if(i==Platform.ACTION_AUTHORIZING){
UIHandler.sendEmptyMessage(MSG_AUTH_CANCEL,this);
}
Log.e("登陆2,","取消");
}
2.上面为请求登录的整个过程,我们点击相应的按钮,就可以进行不同类型的登录请求,如:
3.mobsdk{}里面各个平台的配置参数需要自行上个平台申请,下面为实际的示例:
自行更换即可。
注意:微信登录需要打包,并且需要申请开通相应的接口(一年300块)
二、一键分享
下面直接给出示例,只需要调用方法即可。
/** * 一键分享 */ private void showShare(){ OnekeyShare onekeyShare=new OnekeyShare(); //关闭sso授权 onekeyShare.disableSSOWhenAuthorize(); //title标题,微信,qq和qq空间 onekeyShare.setTitle("我是我是一键分享"); //titleURL QQ和空间跳转链接 onekeyShare.setTitleUrl("http://sharesdk.cn"); //text是分享文本,所有平台都需要这个字段 onekeyShare.setText("我是一键分享"); //imagePath是图片的本地路径,所有平台都支持此参数 // oks.setImagePath("/sdcard/test.jpg");//确保SDcard下面存在此张图片 // url在微信、微博,Facebook等平台中使用 onekeyShare.setUrl("http://sharesdk.cn"); // comment是我对这条分享的评论,仅在人人网使用 // onekeyShare.setComment("我是测试评论文本"); onekeyShare.setCallback(new PlatformActionListener() { @Override public void onComplete(Platform platform, int i, HashMap<String, Object> hashMap) { getActivity().runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(getActivity(), "onComplete", Toast.LENGTH_LONG).show(); } }); } @Override public void onError(Platform platform, int i, final Throwable throwable) { getActivity().runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(getActivity(), "onError"+throwable.toString(), Toast.LENGTH_LONG).show(); } }); } @Override public void onCancel(Platform platform, int i) { getActivity().runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(getActivity(), "onCancel", Toast.LENGTH_LONG).show(); } }); } }); // 启动分享GUI onekeyShare.show(getActivity()); }
三、短信验证(mob每天都有大概20条免费的短信,超过要收费)。示例包含自定义UI界面,还有默认的GUI界面。
直接给代码:
package com.example.myapplication.loginfragment; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.support.v4.app.Fragment; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.EditText; import android.widget.LinearLayout; import android.widget.Toast; import com.example.myapplication.R; import com.example.myapplication.activity.MainActivity; import java.util.HashMap; import java.util.Timer; import java.util.TimerTask; import java.util.regex.Matcher; import java.util.regex.Pattern; import butterknife.BindView; import butterknife.ButterKnife; import butterknife.OnClick; import butterknife.Unbinder; import cn.smssdk.EventHandler; import cn.smssdk.SMSSDK; import cn.smssdk.gui.RegisterPage; /** * A simple {@link Fragment} subclass. */ public class PhoneFragment extends Fragment { private Timer tm; private TimerTask tt; private int TIME = 60;//倒计时60s这里应该多设置些因为mob后台需要60s,我们前端会有差异的建议设置90,100或者120 public String country = "86";//这是中国区号,如果需要其他国家列表,可以使用getSupportedCountries();获得国家区号 private String phone; private static final int CODE_REPEAT = 1; //重新发送 @BindView(R.id.et_phone) EditText etPhone; @BindView(R.id.et_yanzheng) EditText etYanzheng; @BindView(R.id.bt_login) Button btLogin; Unbinder unbinder; @BindView(R.id.bt_getYanzheng) Button btGetYanzheng; Handler hd = new Handler() { @Override public void handleMessage(Message msg) { if (msg.what == CODE_REPEAT) { btGetYanzheng.setEnabled(true); btLogin.setEnabled(true); tm.cancel();//取消任务 tt.cancel();//取消任务 TIME = 60;//时间重置 btGetYanzheng.setText("重新发送验证码"); } else { btGetYanzheng.setText(TIME + "重新发送验证码"); } } }; //回调 EventHandler eh = new EventHandler() { @Override public void afterEvent(int event, int result, Object data) { if (result == SMSSDK.RESULT_COMPLETE) { if (event == SMSSDK.EVENT_SUBMIT_VERIFICATION_CODE) { Intent intent = new Intent(getContext(), MainActivity.class); startActivity(intent); toast("验证成功"); } else if (event == SMSSDK.EVENT_GET_VERIFICATION_CODE) { //获取验证码成功 toast("获取验证码成功"); } else if (event == SMSSDK.EVENT_GET_SUPPORTED_COUNTRIES) {//如果你调用了获取国家区号类表会在这里回调 //返回支持发送验证码的国家列表 } } else {//错误等在这里(包括验证失败) //错误码请参照http://wiki.mob.com/android-api-错误码参考/这里我就不再继续写了 ((Throwable) data).printStackTrace(); String str = data.toString(); toast(str); } } }; //Toast的一个小方法 private void toast(final String str) { getActivity().runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(getActivity(), str, Toast.LENGTH_SHORT).show(); } }); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_phone, container, false); unbinder = ButterKnife.bind(this, view); SMSSDK.registerEventHandler(eh); initView(); return view; } private void initView() { } @Override public void onDestroyView() { super.onDestroyView(); unbinder.unbind(); } @Override public void onDestroy() { super.onDestroy(); SMSSDK.unregisterEventHandler(eh); } @OnClick({R.id.et_phone, R.id.et_yanzheng, R.id.bt_login, R.id.bt_getYanzheng}) public void onViewClicked(View view) { switch (view.getId()) { case R.id.et_phone: break; case R.id.et_yanzheng: break; case R.id.bt_login: //获得用户输入的验证码 String code = etYanzheng.getText().toString().replaceAll("/s", ""); if (!TextUtils.isEmpty(code)) {//判断验证码是否为空 //验证 SMSSDK.submitVerificationCode(country, phone, code); } else {//如果用户输入的内容为空,提醒用户 toast("请输入验证码后再提交"); } break; case R.id.bt_getYanzheng: phone = etPhone.getText().toString().trim().replaceAll("/s", ""); if (!TextUtils.isEmpty(phone)) { //定义需要匹配的正则表达式的规则 String REGEX_MOBILE_SIMPLE = "[1][35678]\\d{9}"; //把正则表达式的规则编译成模板 Pattern pattern = Pattern.compile(REGEX_MOBILE_SIMPLE); //把需要匹配的字符给模板匹配,获得匹配器 Matcher matcher = pattern.matcher(phone); // 通过匹配器查找是否有该字符,不可重复调用重复调用matcher.find() if (matcher.find()) {//匹配手机号是否存在 alterWarning(); } else { toast("手机号格式错误"); } } else { toast("请先输入手机号"); } // sendCode(getActivity()); break; } } //弹窗确认下发 private void alterWarning() { // 2. 通过sdk发送短信验证 AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); //先得到构造器 builder.setTitle("提示"); //设置标题 builder.setMessage("我们将要发送到" + phone + "验证"); //设置内容 builder.setIcon(R.mipmap.ic_launcher);//设置图标,图片id即可 builder.setPositiveButton("确定", new DialogInterface.OnClickListener() { //设置确定按钮 @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); //关闭dialog // 2. 通过sdk发送短信验证(请求获取短信验证码,在监听(eh)中返回) SMSSDK.getVerificationCode(country, phone); //做倒计时操作 Toast.makeText(getActivity(), "已发送" + which, Toast.LENGTH_SHORT).show(); btGetYanzheng.setEnabled(false); btLogin.setEnabled(true); tm = new Timer(); tt = new TimerTask() { @Override public void run() { hd.sendEmptyMessage(TIME--); } }; tm.schedule(tt, 0, 1000); } }); builder.setNegativeButton("取消", new DialogInterface.OnClickListener() { //设置取消按钮 @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); Toast.makeText(getActivity(), "已取消" + which, Toast.LENGTH_SHORT).show(); } }); //参数都设置完成了,创建并显示出来 builder.create().show(); } //使用默认GUI public void sendCode(Context context) { RegisterPage page = new RegisterPage(); //如果使用我们的ui,没有申请模板编号的情况下需传null page.setTempCode(null); page.setRegisterCallback(new EventHandler() { public void afterEvent(int event, int result, Object data) { if (result == SMSSDK.RESULT_COMPLETE) { // 处理成功的结果 HashMap<String, Object> phoneMap = (HashMap<String, Object>) data; String country = (String) phoneMap.get("country"); // 国家代码,如“86” String phone = (String) phoneMap.get("phone"); // 手机号码,如“13800138000” // TODO 利用国家代码和手机号码进行后续的操作 } else { // TODO 处理错误的结果 } } }); page.show(context); } }
xml布局文件:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.example.myapplication.loginfragment.PhoneFragment"> <EditText android:id="@+id/et_phone" android:layout_width="match_parent" android:layout_height="40dp" android:background="@drawable/edit_login" android:layout_marginTop="10dp" android:layout_marginLeft="15dp" android:layout_marginRight="15dp" android:hint="请输入手机号码" android:textSize="15dp" /> <LinearLayout android:id="@+id/ll_yanzheng" android:layout_width="match_parent" android:layout_height="40dp" android:layout_marginTop="10dp" android:layout_marginLeft="15dp" android:layout_marginRight="15dp" android:orientation="horizontal"> <EditText android:id="@+id/et_yanzheng" android:layout_width="0dp" android:layout_weight="3" android:layout_height="40dp" android:background="@drawable/edit_login" android:textSize="15dp" android:hint="验证码"/> <Button android:id="@+id/bt_getYanzheng" android:layout_width="0dp" android:layout_weight="1" android:layout_height="match_parent" android:background="@drawable/bt_login" android:text="获取验证码" android:textColor="@color/white" /> </LinearLayout> <Button android:id="@+id/bt_login" android:layout_width="match_parent" android:layout_height="40dp" android:background="@drawable/bt_login" android:text="登录" android:textColor="@color/white" android:layout_marginTop="15dp" android:layout_marginLeft="15dp" android:layout_marginRight="15dp"/> </LinearLayout>