您的位置:首页 > 移动开发 > Android开发

Android-Studio 用ShareSDK集成社会化分享,短信验证码,视频录制功能

2016-09-10 15:40 471 查看
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<Activity> weakReference;

public MyHandler(Activity activity) {
weakReference = new WeakReference<Activity>(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"/>
<!-- 修改成你在sharesdk后台注册      的应用的appkey"-->
<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<String, Object> 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<String, Object> 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

配置:libs 下放jar包,jnilib放so文件



我遇到的问题:视频黑屏有声音,我建议这么排查(前提是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之类不会录制
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: