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

ShareSDK主要用于qq、qq空间、微信、微信朋友圈的分享功能以及第三方登录功能

SMSSDK主要用于短信验证码

集成工作:将sharesdk与smssdk同时集成到android-studio项目中:
注册账号获取key与secret(有两对奥,一个是sharesdk一个是SMSSdk,这里只贴了一个图)
Android-Studio 用ShareSDK集成社会化分享,短信验证码,视频录制功能_第1张图片
如果项目的主模块同时依赖ShareSDKLibs与SMSSDKLibs,那么肯定回报jar包重复的错误。这里我们可以让我们项目的主模块去依赖SMSSDKLibs,让模块SMSSDKLibs去依赖ShareSDKLibs,并删除里面重复导入的jar包,至于是哪个我也不记得,我上个图大家对比一下。
Android-Studio 用ShareSDK集成社会化分享,短信验证码,视频录制功能_第2张图片

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

配置工作
这里主要是一些初始化工作,官方文档里写的很清楚,这里主要说一下一些当初困扰我的地方

首先是短信验证码:

初始化与注册监听

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放进去
Android-Studio 用ShareSDK集成社会化分享,短信验证码,视频录制功能_第4张图片
当然要到对应的平台去申请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

配置:libs 下放jar包,jnilib放so文件
Android-Studio 用ShareSDK集成社会化分享,短信验证码,视频录制功能_第5张图片

我遇到的问题:视频黑屏有声音,我建议这么排查(前提是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之类不会录制

你可能感兴趣的:(Android)