ShareSDK主要用于qq、qq空间、微信、微信朋友圈的分享功能以及第三方登录功能
SMSSDK主要用于短信验证码
集成工作:将sharesdk与smssdk同时集成到android-studio项目中:
注册账号获取key与secret(有两对奥,一个是sharesdk一个是SMSSdk,这里只贴了一个图)
如果项目的主模块同时依赖ShareSDKLibs与SMSSDKLibs,那么肯定回报jar包重复的错误。这里我们可以让我们项目的主模块去依赖SMSSDKLibs,让模块SMSSDKLibs去依赖ShareSDKLibs,并删除里面重复导入的jar包,至于是哪个我也不记得,我上个图大家对比一下。
配置工作
这里主要是一些初始化工作,官方文档里写的很清楚,这里主要说一下一些当初困扰我的地方
首先是短信验证码:
初始化与注册监听
SMSSDK.initSDK(getApplicationContext(), Contacts.GELINGPHONE_APPKEY, Contacts.GELINGPHONE_APPSECRET);
SMSSDK.registerEventHandler(new MySMSCALLBACKHANDLER());
监听的类:
private class MySMSCALLBACKHANDLER extends EventHandler {
@Override
public void afterEvent(int event, int result, Object data) {
Message msg = Message.obtain();
msg.what = MSG_SMSSDK_CALLBACK;
Log.i("PPPPP", event+" "+result);
msg.arg1 = event;
msg.arg2 = result;
msg.obj = data;
myHandler.sendMessage(msg);
}
}
处理返回信息的handler
private class MyHandler extends Handler {
WeakReference weakReference;
public MyHandler(Activity activity) {
weakReference = new WeakReference(activity);
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
Activity activity = weakReference.get();
if (activity != null) {
switch (msg.what) {
case 2:
Toast.makeText(UserRegisterActivity.this,
"手机号不能为空", Toast.LENGTH_SHORT).show();
btn_getVerificationCode.setEnabled(true);
break;
case 3:
Toast.makeText(UserRegisterActivity.this,
"手机号错误", Toast.LENGTH_SHORT).show();
btn_getVerificationCode.setEnabled(true);
break;
case MSG_SMSSDK_CALLBACK:
if (msg.arg2 == SMSSDK.RESULT_ERROR) {
if (msg.arg1 == 3 && msg.arg2 == 0) {
Toast.makeText(UserRegisterActivity.this,
"验证码错误", Toast.LENGTH_SHORT).show();
// flag = false;
btn_getVerificationCode.setEnabled(true);
btn_getVerificationCode.setText("获取验证码");
repeatCodeTime=VerificationCodeTime;//复位
}
if (msg.arg1 == 2 && msg.arg2 == 0) {
Toast.makeText(UserRegisterActivity.this,
"验证码发送失败",
Toast.LENGTH_SHORT).show();
btn_getVerificationCode.setEnabled(true);
btn_getVerificationCode.setText("获取验证码");
repeatCodeTime=
Contacts.VerificationCodeTime;//复位
}
} else {
switch (msg.arg1) {
case
SMSSDK.EVENT_SUBMIT_
VERIFICATION_CODE: {
Toast.makeText
(UserRegisterActivity.this,
"验证成功",
Toast.LENGTH_SHORT).show();
}
break;
case SMSSDK.EVENT_GET_VERIFICATION_CODE: {
// if (RE_SEND_FLAG) {
Toast.makeText(UserRegisterActivity.this, "验证码已经发送", Toast.LENGTH_SHORT).show();
//flag = true;
// btn_resend.setEnabled(false);
myHandler.sendEmptyMessageDelayed(SEND_OK, 1000);
// RE_SEND_FLAG = false;
// }
}
break;
}
}
break;
case SEND_OK:
// if (flag) {
if (repeatCodeTime >= 0) {
btn_getVerificationCode.setText(repeatCodeTime + "秒后重发");
// Log.i(TAG, time + "");
if (repeatCodeTime == 0) {
btn_getVerificationCode.setText("获取验证码");
btn_getVerificationCode.setEnabled(true);
repeatCodeTime = Contacts.VerificationCodeTime;//复位
} else {
repeatCodeTime--;
btn_getVerificationCode.setEnabled(false);
myHandler.sendEmptyMessageDelayed(SEND_OK, 1000);
}
}
// }
break;
}
}
}
}
主要注意的是发送短信与验证验证码是同一个监听,所在在逻辑上要搞清楚什么是发送成功or失败,什么是验证成功or失败。还有一个问题就是明明已经搭建成功,同一个手机号也没有测试超过10条,但就是显示短信发送失败也就是监听里的值event与result总是2,0。这也许有可能是被智能验证了,只要到官网主页项目里把短信设置里的智能验证关闭就ok了。
社会化分享
QQ与QQ空间分享:
ShareSDK.initSDK(this);
1.创建assets目录将ShareSDk.xml放进去
当然要到对应的平台去申请key罗(http://open.qq.com/)
AppKey = "XXXXXXX"/>
<QZone
Id="3"
SortId="3"
AppId="XXXXXXXXXXXXXXX"
AppKey="XXXXXXXXXXXXXXXXXXXX"
Enable="true" />
<QQ
Id="7"
SortId="7"
AppId="XXXXXXXXXXXXXXX"
AppKey="XXXXXXXXXXXXXXXXXXXX"
ShareByAppClient="true"//有客户端先调用客户端
Enable="true" />
配置文件除了权限之外还有添加activity
<activity
android:name="com.mob.tools.MobUIShell"
android:configChanges="keyboardHidden|orientation|screenSize"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:windowSoftInputMode="stateHidden|adjustResize">
<intent-filter>
<data android:scheme="tencent(填腾讯申请的id)" />
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT" />
intent-filter>
activity>
代码:
/**
* qq好友
*/
private void showQQShare() {
ShareSDK.initSDK(this);
ShareParams sp = new ShareParams();
sp.setTitle(Contacts.SHARESDK_TITLE);
if (Share_Content != null) {
sp.setText(Share_Content);
}
sp.setImageUrl(Contacts.SHARESDK_IMAGE_URL);//网络图片rul
sp.setTitleUrl(Contacts.SHARESDK_NET_URL); //网友点进链接后,可以看到分享的详情
//3、非常重要:获取平台对象
Platform qq = ShareSDK.getPlatform(QQ.NAME);
qq.setPlatformActionListener(TestActivity.this); // 设置分享事件回调
qq.authorize();
// 执行分享
qq.share(sp);
if (mShareDialog != null) {
mShareDialog.dismiss();
}
Log.i("GGGG", "mShareDialog关闭");
}
/**
* qq空间
*/
private void showQQShare2() {
ShareSDK.initSDK(this);
ShareParams sp = new ShareParams();
sp.setTitle(Contacts.SHARESDK_TITLE);
if (Share_Content != null) {
sp.setText(Share_Content);
}
sp.setImageUrl(Contacts.SHARESDK_IMAGE_URL);//网络图片rul
sp.setTitleUrl(Contacts.SHARESDK_NET_URL); //网友点进链接后,可以看到分享的详情
//3、非常重要:获取平台对象
Platform qq = ShareSDK.getPlatform(QZone.NAME);
qq.setPlatformActionListener(TestActivity.this); // 设置分享事件回调
// qq.authorize();//空间分享不需要这句 否则报错
// 执行分享
qq.share(sp);
if (mShareDialog != null) {
mShareDialog.dismiss();
}
Log.i("GGGG", "mShareDialog关闭");
}
微信分享
<Wechat
Id="4"
SortId="4"
AppId="XXXXXXX"
AppSecret="XXXXX" //微信开发平台
BypassApproval="false"
Enable="true" />
<WechatMoments
Id="5"
SortId="5"
AppId="XXXXXXX"
AppSecret="XXXXX"
BypassApproval="false"
Enable="true" />
添加WXEntryActivity注意文件夹的名字此activity必须放在wxapi文件下,不能改文件夹的名字。
配置文件
<activity
android:name=".wxapi.WXEntryActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:exported="true"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.Translucent.NoTitleBar" />
代码
/**
* 微信好友分享
*/
private void showWeiXinShare2() {
ShareSDK.initSDK(this);
ShareParams sp = new ShareParams();
sp.setShareType(Platform.SHARE_WEBPAGE); //非常重要:一定要设置分享属性
sp.setTitle(Contacts.SHARESDK_TITLE);
if (Share_Content != null) {
sp.setText(Share_Content);
}
sp.setImageUrl(Contacts.SHARESDK_IMAGE_URL);//网络图片rul
sp.setUrl(Contacts.SHARESDK_NET_URL); //网友点进链接后,可以看到分享的详情
//3、非常重要:获取平台对象
Platform wechatMoments = ShareSDK.getPlatform(Wechat.NAME);
wechatMoments.setPlatformActionListener(TestActivity.this); // 设置分享事件回调
// 执行分享
wechatMoments.share(sp);
if (mShareDialog != null) {
mShareDialog.dismiss();
}
}
/**
* 微信朋友圈分享
*/
private void showWeiXinShare() {
ShareSDK.initSDK(this);
ShareParams sp = new ShareParams();
sp.setShareType(Platform.SHARE_WEBPAGE); //非常重要:一定要设置分享属性
// sp.setTitle("我是分享标题"); //分享标题 此属性微信用不了
sp.setTitle(Contacts.SHARESDK_TITLE);
/* if (Share_Content != null) {
sp.setText(Share_Content);
}*/
sp.setImageUrl(Contacts.SHARESDK_IMAGE_URL);//网络图片rul
sp.setUrl(Contacts.SHARESDK_NET_URL); //网友点进链接后,可以看到分享的详情
//3、非常重要:获取平台对象
Platform wechatMoments = ShareSDK.getPlatform(WechatMoments.NAME);
wechatMoments.setPlatformActionListener(TestActivity.this); // 设置分享事件回调
// 执行分享
wechatMoments.share(sp);
if (mShareDialog != null) {
mShareDialog.dismiss();
}
}
分享的三个回调监听
@Override
public void onComplete(Platform platform, int i, HashMap hashMap) {
//分享成功
mHandler.sendEmptyMessage(2);
}
@Override
public void onError(Platform platform, int i, Throwable throwable) {
//分享失败
throwable.printStackTrace();
Message msg = new Message();
msg.what = 6;
msg.obj = throwable.getMessage();
mHandler.sendMessage(msg);
}
@Override
public void onCancel(Platform platform, int i) {
//取消分享
mHandler.sendEmptyMessage(5);
}
分享主要是微信分享那块注意一下,WXEntryActivity必须放在wxapi文件夹下,不然没用,还有就是去各大平台去申请账号了。
第三方登录:
//qq第三方登录
dialogBuilder=FileUtils.showDialog(UserLoginActivity.this);
Platform qq = ShareSDK.getPlatform(QQ.NAME);
qq.SSOSetting(false); //设置false表示使用SSO授权方式
qq.setPlatformActionListener(this); // 设置分享事件回调
if (qq.isValid()) {
qq.removeAccount(true);
}
if (qq.isClientValid()) {
Log.i("QQ快速登录", "安装了QQ");
} else {
Log.i("QQ快速登录", "没有安装了QQ");
// Toast.makeText(UserLoginActivity.this, "检测到您的手机没有安装QQ", Toast.LENGTH_SHORT).show();
FileUtils.showToast(UserLoginActivity.this, mToast, "检测到您的手机没有安装QQ");
return;
}
qq.showUser(null);//获取到用户信息
//微信登录
dialogBuilder=FileUtils.showDialog(UserLoginActivity.this);
Log.i("KKK::::KKK","iv_weixin");
Platform weixinfd = ShareSDK.getPlatform(Wechat.NAME);
weixinfd.SSOSetting(false);
weixinfd.setPlatformActionListener(this);
if (weixinfd.isAuthValid ()){
weixinfd.removeAccount(true);
}
if (weixinfd.isClientValid()){
Log.i("微信快速登录", "安装了微信");
}else{
Log.i("微信快速登录", "没有安装了微信");
//Toast.makeText(UserLoginActivity.this, "检测到您的手机没有安装QQ", Toast.LENGTH_SHORT).show();
FileUtils.showToast(UserLoginActivity.this, mToast, "检测到您的手机没有安装微信");
if (dialogBuilder!=null){
dialogBuilder.dismiss();
}
return;
}
weixinfd.showUser(null);
也有三个监听
@Override
public void onComplete(Platform platform, int i, HashMap hashMap) {
//登陆成功
Log.i("KKK::::KKK","获取用户名字:"+ platform.getDb().getUserName());
Log.i("KKK::::KKK","获取用户头像:"+ platform.getDb().getUserIcon());
Message msg = new Message();
msg.what = 1;
msg.arg1 = 1;
msg.arg2 = i;
msg.obj = platform;
UIHandler.sendMessage(msg, this);
Toast.makeText(UserLoginActivity.this,"onComplete",Toast.LENGTH_SHORT).show();
}
@Override
public void onError(Platform platform, int i, Throwable throwable) {
/**
* 登录失败
*/
Log.i("KKK::::KKK","onError");
throwable.printStackTrace();
Toast.makeText(UserLoginActivity.this,"onError",Toast.LENGTH_SHORT).show();
/**
* 判断第三方登录失败
*/
Message msg = new Message();
msg.what = 1;
msg.arg1 = 2;
msg.arg2 = 1;
msg.obj = throwable;
UIHandler.sendMessage(msg, this);
// 分享失败的统计
ShareSDK.logDemoEvent(4, platform);
}
@Override
public void onCancel(Platform platform, int i) {
/**
* 取消登录
*/
Log.i("KKK::::KKK","onCancel");
Toast.makeText(UserLoginActivity.this,"onCancel",Toast.LENGTH_SHORT).show();
Message msg = new Message();
msg.what = 1;
msg.arg1 = 3;
msg.arg2 = 1;
msg.obj = platform;
UIHandler.sendMessage(msg, this);
}
第三方登录的细节:像英雄联盟手机助手一样qq快速登录的时候会有英雄联盟的图片,而这里只是单纯的显示APP,没有图片,我问过怎么弄,他们说只要在腾讯开发平台上发布apk,提交app的图片,就会有了。
这里只是大概介绍了share的分享,第三方登录以及短信验证码。具体操作还是以官方文档为准。
关于视频录制:ShareRec
我遇到的问题:视频黑屏有声音,我建议这么排查(前提是sdk搭的没问题)
1.需要录制的view(一般应该是个viewgroup吧)是否设置背景,有时候没设置背景style导致黑屏
2.设置刷新屏幕的频率,本人遇到过,比如录制的画面是一个viewpager里加载的fragment就是黑屏,问了客服问了一下午,自己看文档设置频率搞定
private void initVideoRecord(Context context) {
recorder = new ViewRecorder(activity_start_class, "XXXXXXXX", "XXXXXXXXX");
// 设置视频的最大尺寸
recorder.setMaxFrameSize(Recorder.LevelMaxFrameSize.LEVEL_1280_720);
// 设置视频的质量(高、中、低)
recorder.setVideoQuality(Recorder.LevelVideoQuality.LEVEL_HIGH);
// 设置视频的最短时长
recorder.setMinDuration(10 * 1000);
// 设置视频的输出路径
recorder.setCacheFolder(ProjectUtils.getDiskCacheDir2(context, "video"));
// 设置是否强制使用软件编码器对视频进行编码(兼容性更高)
recorder.setForceSoftwareEncoding(true, true);
recorder.startAuotRefreshRate(1);
}
频率不能设置太大,倒置您的操作
提醒:sharerec没有截图功能,且对popwindow,dialog之类不会录制