使用的是第三方的Mob来实现分享和发送短信的Demo
如图是项目的结构,结合了分享,发送短信,读取短信内容的功能
代码地址:https://github.com/1825492258/MobShare
1.SMS发送短信 主要是3部
第一步:初始化SDK initSDK
第二步:注册回调接口 registerEventHandler(EventHandler handler)
第三步:注销回调接口 unregisterEventHandler(EventHandler handler)
如下是程序的主要代码
实现了点击获取验证码,出现倒计时,读取短信的,验证验证码的一套登录流程
package com.item.jiejie; import android.Manifest;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.CountDownTimer;
import android.os.Handler;
import android.os.Message;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast; import org.json.JSONObject; import java.lang.ref.SoftReference; import cn.smssdk.EventHandler;
import cn.smssdk.SMSSDK; public class SMSActivity extends AppCompatActivity implements TextWatcher { private EditText edtPhone; // 输入的手机号
private EditText edtCode; // 输入的验证码
private Button btnCode; // 获取验证码
private Button btnLogin; // 登录 private MyHandler myHandler;
private SMSContentObserver smsContentObserver; // 回调接口
private MyCountDownTimer countDownTimer = new MyCountDownTimer(60000, 1000); // 计时器 private static class MyHandler extends Handler {
SoftReference<SMSActivity> mActivity; private MyHandler(SMSActivity activity) {
mActivity = new SoftReference<>(activity);
} @Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
SMSActivity activity = mActivity.get();
if (activity == null) {
return;
}
switch (msg.what) {
case 1001: // 短信的返回
activity.edtCode.setText(msg.obj.toString());
break;
case 1002: // 这个是EventHandler发送短信的返回
int event = msg.arg1;
int result = msg.arg2;
Object data = msg.obj;
if (result == SMSSDK.RESULT_COMPLETE) { // 回调完成
if (event == SMSSDK.EVENT_SUBMIT_VERIFICATION_CODE) {
// 提交验证码成功
Toast.makeText(activity, "提交验证码成功", Toast.LENGTH_SHORT).show();
} else if (event == SMSSDK.EVENT_GET_VERIFICATION_CODE) {
// 获取验证码成功
Toast.makeText(activity, "验证码发送成功", Toast.LENGTH_SHORT).show();
activity.countDownTimer.start(); // 发送成功,开启倒计时
activity.setSmsPermission(); // 发送成功了,要开始读取短信了
}
} else {
// 报错了
try {
Throwable throwable = (Throwable) data;
JSONObject object = new JSONObject(throwable.getMessage());
String des = object.optString("detail");
if (!TextUtils.isEmpty(des)) {
Toast.makeText(activity, des, Toast.LENGTH_SHORT).show();
}
} catch (Exception e) {
e.printStackTrace();
}
}
break;
}
}
} /**
* 这里好像要加个动态的权限
*/
private void setSmsContentObserver() {
if (smsContentObserver == null) {
smsContentObserver = new SMSContentObserver(SMSActivity.this, myHandler);
getContentResolver().registerContentObserver(Uri.parse("content://sms/"), true, smsContentObserver);
}
} /**
* 动态权限
*/
private void setSmsPermission() {
if (ToastUtils.hasPermission(this, Manifest.permission.READ_SMS)) {
setSmsContentObserver();
} else {
ToastUtils.requestPermission(this, 0x01, Manifest.permission.READ_SMS);
}
} @Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == 0x01) {
if ((grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED)) {
setSmsContentObserver();
}
}
} @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sms);
edtPhone = (EditText) findViewById(R.id.edt_login_phone);
edtCode = (EditText) findViewById(R.id.edt_login_code);
btnCode = (Button) findViewById(R.id.btn_login_code);
btnLogin = (Button) findViewById(R.id.btn_login);
btnCode.setEnabled(false);
btnLogin.setEnabled(false);
edtPhone.addTextChangedListener(this);
myHandler = new MyHandler(this);
btnCode.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// 点击获取验证码,获取短信目前支持国家列表,在监听中返回
//getContentResolver().registerContentObserver();
SMSSDK.getVerificationCode("86", edtPhone.getText().toString());
}
});
btnLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// 提交验证码 submitVerificationCode(String country, String phone, String code)
SMSSDK.submitVerificationCode("86", edtPhone.getText().toString().trim(), edtCode.getText().toString().trim());
}
});
EventHandler mEventHandler = new EventHandler() {
@Override
public void afterEvent(int event, int result, Object data) {
Message msg = new Message();
msg.what = 1002;
msg.arg1 = event;
msg.arg2 = result;
msg.obj = data;
myHandler.sendMessage(msg);
}
};
SMSSDK.registerEventHandler(mEventHandler);
edtCode.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { } @Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { } @Override
public void afterTextChanged(Editable editable) {
if (editable.length() >= 2 && edtPhone.getText().toString().length() >= 11) {
btnLogin.setEnabled(true);
} else {
btnLogin.setEnabled(false);
}
}
});
} @Override
protected void onDestroy() {
super.onDestroy();
SMSSDK.unregisterAllEventHandler();
countDownTimer.cancel(); // 取消定时器
if (smsContentObserver != null) {
getContentResolver().unregisterContentObserver(smsContentObserver);
}
} @Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { } @Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { } @Override
public void afterTextChanged(Editable editable) {
if (editable.length() == 11) {
btnCode.setEnabled(true);
} else {
btnCode.setEnabled(false);
}
} /**
* 定时器
*/
private class MyCountDownTimer extends CountDownTimer { private MyCountDownTimer(long millisInFuture, long countDownInterval) {
super(millisInFuture, countDownInterval);
} @Override
public void onTick(long l) {
btnCode.setEnabled(false);
btnCode.setText(l / 1000 + "s");
} @Override
public void onFinish() {
btnCode.setEnabled(true);
btnCode.setText("获取验证码");
cancel();
}
}
}
2.使用ShareSDK来实现分享功能
分享要注意ShareSDK.xml 的位置,还有些清单文件微信 qq等的回调要配置
参考官方的http://wiki.mob.com/%e5%88%86%e4%ba%ab%e5%88%b0%e6%8c%87%e5%ae%9a%e5%b9%b3%e5%8f%b0/
分享到指定平台的功能
ShareParams sp = new ShareParams();
sp.setTitle("测试分享的标题");
sp.setTitleUrl("http://sharesdk.cn"); // 标题的超链接
sp.setText("测试分享的文本");
sp.setImageUrl("http://www.someserver.com/测试图片网络地址.jpg");
sp.setSite("发布分享的网站名称");
sp.setSiteUrl("发布分享网站的地址"); Platform qzone = ShareSDK.getPlatform (QZone.NAME);
// 设置分享事件回调(注:回调放在不能保证在主线程调用,不可以在里面直接处理UI操作)
qzone.setPlatformActionListener (new PlatformActionListener() {
public void onError(Platform arg0, int arg1, Throwable arg2) {
//失败的回调,arg:平台对象,arg1:表示当前的动作,arg2:异常信息
}
public void onComplete(Platform arg0, int arg1, HashMap<String, Object> arg2) {
//分享成功的回调
}
public void onCancel(Platform arg0, int arg1) {
//取消分享的回调
}
});
// 执行图文分享
qzone.share(sp);
如下是自定义一个Dialog然后进行分享
package com.item.jiejie.share; import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.TextView; import com.item.jiejie.R; import java.util.HashMap; import cn.sharesdk.framework.Platform;
import cn.sharesdk.framework.PlatformActionListener;
import cn.sharesdk.framework.ShareSDK;
import cn.sharesdk.tencent.qq.QQ;
import cn.sharesdk.tencent.qzone.QZone;
import cn.sharesdk.wechat.friends.Wechat;
import cn.sharesdk.wechat.moments.WechatMoments; /**
* 这是分享弹窗
* Created by Administrator on 2017/11/7.
*/ public class ShareDialog extends Dialog implements View.OnClickListener { private Context mContext;
private DisplayMetrics dm; /**
* UI
*/
private TextView mDialogOne;
private TextView mDialogTwo;
private TextView mDialogThree;
private TextView mDialogFour; public ShareDialog(Context context) {
super(context, R.style.SheetDialogStyle);
mContext = context;
dm = mContext.getResources().getDisplayMetrics();
} @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.dialog_share_layout);
initView();
} private void initView() {
/**
* 通过获得的Dialog的Window来控制Dialog的宽高及位置
*/
Window dialogWindow = getWindow();
dialogWindow.setGravity(Gravity.BOTTOM);
WindowManager.LayoutParams lp = dialogWindow.getAttributes();
lp.width = dm.widthPixels;//设置宽度
dialogWindow.setAttributes(lp);
mDialogOne = (TextView) findViewById(R.id.dialog_item_one);
mDialogTwo = (TextView) findViewById(R.id.dialog_item_two);
mDialogThree = (TextView) findViewById(R.id.dialog_item_three);
mDialogFour = (TextView) findViewById(R.id.dialog_item_four);
mDialogOne.setOnClickListener(this);
mDialogTwo.setOnClickListener(this);
mDialogThree.setOnClickListener(this);
mDialogFour.setOnClickListener(this);
} @Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.dialog_item_one: // 分享微信
shareData(Wechat.NAME);
break;
case R.id.dialog_item_two: // 微信朋友圈
shareData(WechatMoments.NAME);
break;
case R.id.dialog_item_three: // QQ
shareData(QQ.NAME);
break;
case R.id.dialog_item_four: // QQ空间
shareData(QZone.NAME);
break;
}
dismiss();
} private PlatformActionListener mListener = new PlatformActionListener() {
@Override
public void onComplete(Platform platform, int i, HashMap<String, Object> hashMap) {
Log.d("jiejie", "onComplete");
} @Override
public void onError(Platform platform, int i, Throwable throwable) {
Log.d("jiejie", "onError");
} @Override
public void onCancel(Platform platform, int i) {
Log.d("jiejie", "onCancel");
}
}; private void shareData(String name) {
Platform.ShareParams params = new Platform.ShareParams();
params.setTitle("测试分享的标题");
params.setTitleUrl("https://www.baidu.com/"); // 标题的超链接
params.setText("测试的分享文本啊啊啊啊啊啊啊啊啊啊啊"); // text是分享文本
params.setUrl("http://sharesdk.cn"); // url仅在微信(包括好友和朋友圈)中使用
params.setImageUrl("https://qlogo4.store.qq.com/qzone/2524921779/2524921779/100"); //分享网络图片
params.setSite("发布分享的网站名称"); // site是分享此内容的网站名称,仅在QQ空间使用
params.setSiteUrl("https://github.com/"); // siteUrl是分享此内容的网站地址,仅在QQ空间使用
Platform platform = ShareSDK.getPlatform(name);
platform.setPlatformActionListener(mListener);
platform.share(params);
}
}