ShareSDK分享和SMS的使用
使用的是第三方的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);
}
}
ShareSDK分享和SMS的使用的更多相关文章
- 自己定义ShareSDK分享平台界面
自己定义ShareSDK分享平台界面 执行效果图: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ2FvX2NodW4=/font/5a6L5L2T/fo ...
- 使用ShareSDK分享-图片的链接
微信中使用ShareSDK分享,需要申请微信开放平台账号,并且以微信中的声明的应用签名打包程序. private void showShare(String url, String title, St ...
- ShareSDK分享失败的原因
关于分享估计很多都用的是ShareSDK的社会化分享,简单方便,支持的种类很多,但是一般的话都还是QQ,微信,新浪微博,腾讯微博为主. 最近需要导入一个分享的模块,失败了几次之后最终成功,分享给大家, ...
- Android使用Mob ShareSDK 分享不同平台
Share分享,要注意的是,如果不能调用起微信相关,看看微信开发者平台是否添加正式,微信开发者正式之后,打正式包进行分享调用 /*分享弹框*/ private void showShare2() { ...
- shareSdk分享图片
/** * 只分享图片 * * @param bitmap bitmap */ private void sharedImage(Bitmap bitmap) { RxPermissions rxPe ...
- Android 集成ShareSDK分享QQ或空间成功后,回调却不执行的原因
AndroidMainifest.xml中的如箭头所示的id一定要与assets下ShareSDK.xml中配置的QQ的AppId一定要相同. 如下图
- Android开发 sharesdk分享微信/朋友圈的时候只显示文字,不显示链接
问题:分享的时候只将分享的content分享出去了,连标题及链接都没有分享出去. 原因:没有配置image导致. 解决办法: 在 showShare 方法里面添加配置: if(ImageUrlOrP ...
- cocoapods导入shareSDK分享实现
这个在官方文档没有说这两个库是必须导入的,但是不导入是会有错误的 pod 'ShareSDK3/ShareSDKConfigurationFile' pod 'ShareSDK3/ShareSDKEx ...
- 28、shareSDK分享以及 QQ应用平台申请遇到的问题
第一点:菜单列表没出来 未添加白名单 第二点: QQ平台申请,和安卓共用一个APP名字,出现的 问题 第三点
随机推荐
- 【性能测试】:JVM内存监控策略的方法,以及监控结果说明
JVM内存监控主要在稳定性压测期间,监控应用服务器内存泄露等问题: [JVM远程监控设置] 1.打开WAS控制台:https://ip:port/ibm/console/login.do 2.进入路径 ...
- 蓝桥杯-正则问题(dfs,解决()的计算)
历届试题 正则问题 时间限制:1.0s 内存限制:256.0MB 问题描述 考虑一种简单的正则表达式: 只由 x ( ) | 组成的正则表达式. 小明想求出这个正则表达式能接受的最长 ...
- jedis 整合 Spring
一, 单机版整合spring 1. 使用默认配置文件进行配置 <bean id="redisClient" class="redis.clients.jedis ...
- MAVEN打zip包
https://blog.csdn.net/yulin_hu/article/details/81835945 https://www.cnblogs.com/f-zhao/p/6929814.htm ...
- 通过CGI实现在Html页面上执行shell命令
在mac上配置cgi(不用系统自带的apache cgi.) 安装cgi 1. brew update 2. brew install httpd24 安装完后,会有如下提示 DocumentRoot ...
- 【Kafka】Broker之Server.properties的重要参数说明
名称 描述 类型 默认值 有效值区间 重要程度 zookeeper.connect zk地址 string 高 advertised.host.name 过时的:只有当advertised.liste ...
- Ubuntu 10.10, 11.04, 11.10这三个版本无法从优盘启动
问题:Ubuntu 10.10, 11.04, 11.10这三个版本无法从优盘启动 解决:从U盘启动安装的时候,会卡住不动.搞定办法相当简单,修改syslinux/syslinuxfg文件:将defa ...
- WeifenLuo.WinFormsUI.Docking.dll的用法
基本框架 说明 weiFenLuo.winFormsUI.Docking.dll是开源项目DockPanel Suite的一个类库,可以实现像Visual Studio的窗口停靠.拖拽等功能.Weif ...
- rust by example 2
本来这篇准备明天在写的,但正好今天的Release没出问题,就接着写吧 rust里的原生类型: 有符号整数: i8, i16, i32, i64和isize(指针大小) 无符号整数:u8, u16, ...
- JAVA注释方式
1.单行(single-line)注释 //…… 2.块(block)注释 /*……*/ 3.文档注释 /**……*/