第三方登录跟分享

分享在每个App应用中是很常见的,今天就来实现一下接入QQ提供的第三方分享。
1.使用QQ分享时记得先到我们的腾讯开放平台注册账号然后获取开发者资格地址:http://open.qq.com/ 创建应用获取AppId和AppKey,具体请看我的这篇博客:http://blog.csdn.net/sandyran/article/details/53319846
然后下载SDKJar地址:http://wiki.open.qq.com/wiki/mobile/SDK%E4%B8%8B%E8%BD%BD
2.接下来打开我们的AndroidStudio新建一个项目把刚才下载的SDK放入到libs中然后添加依赖
结构如下:

第三方登录跟分享

要添加两个依赖,一个glide的依赖还有一个circleimageView的依赖
compile 'com.github.bumptech.glide:glide:3.8.0'
compile 'de.hdodenhof:circleimageview:2.0.0'

如果没有添加这两个以来会报很多乱七八糟的异常。会有很多坑

3.开启我们的集成之路吧打开AndroidManifest在里面添加权限和注册SDKActivity

添加权限的话,登录跟分享用同样的两个权限。

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

注册SDK的话,分享的最后一行是

android:configChanges="orientation|keyboardHidden|screenSize"
而登录的最后一行是

android:screenOrientation="portrait"
同时实现登录跟分享的注册方式

<!-- 注册SDKActivity -->
<activity
    android:name="com.tencent.tauth.AuthActivity"
    android:launchMode="singleTask"
    android:noHistory="true" >
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data android:scheme="tencent1106163416" /> <!-- 开放平台获取的APPID -->
    </intent-filter>
</activity>
<activity android:name="com.tencent.connect.common.AssistActivity"
    android:theme="@android:style/Theme.Translucent.NoTitleBar"
    android:screenOrientation="portrait"
    android:configChanges="orientation|keyboardHidden|screenSize"
    />
4、布局控件,自己随便写的。能表达技术意思就行

获取登录QQ的头像跟网名并且保存下来。保存头像的时候自动裁剪成圆形的头像,

第三方登录跟分享

<Button
    android:id="@+id/button_login"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="登录"
    />
<LinearLayout
    android:layout_marginTop="50dp"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    >
    <de.hdodenhof.circleimageview.CircleImageView
        android:id="@+id/image_p"
        android:layout_width="50dp"
        android:layout_height="50dp"
        />
    <TextView
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="20sp"
        />

</LinearLayout>
<LinearLayout
    android:layout_marginTop="150dp"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    >
    <Button
        android:id="@+id/q_fenxiang"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="QQ分享"
        android:layout_weight="1"
        />
    <Button
        android:id="@+id/qzone_fenxiang"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="QQ空间分享"
        android:layout_weight="1"
        />
    <Button
        android:id="@+id/music_fenxiang"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="分享音乐"
        android:layout_weight="1"
        />
5、具体的代码

private Button button;
    private TextView textView;
    private static final String TAG = "MainActivity";
    private static final String APP_ID = "1106163416";//官方获取的APPID
    private Tencent mTencent;
    private BaseUiListener mIUiListener;
    private UserInfo mUserInfo;
    private CircleImageView imageView;
    private ShareUiListener mIUiListener1;
    private Button q_fenxiang;
    private Button qzone_fenxiang;
    private Button music_fenxiang;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mTencent = Tencent.createInstance(APP_ID,MainActivity.this.getApplicationContext());

        button = (Button) findViewById(R.id.button_login);
        imageView = (CircleImageView) findViewById(R.id.image_p);
        textView = (TextView) findViewById(R.id.text);

        q_fenxiang = (Button) findViewById(R.id.q_fenxiang);
        qzone_fenxiang = (Button) findViewById(R.id.qzone_fenxiang);
        music_fenxiang = (Button) findViewById(R.id.music_fenxiang);



        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mIUiListener = new BaseUiListener();
                //all表示获取所有权限
                mTencent.login(MainActivity.this,"all", mIUiListener);
            }
        });
        //QQ分享
        q_fenxiang.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                final Bundle params = new Bundle();
                params.putInt(QQShare.SHARE_TO_QQ_KEY_TYPE, QQShare.SHARE_TO_QQ_TYPE_DEFAULT);//分享的类型
                params.putString(QQShare.SHARE_TO_QQ_TITLE, "然了个然CSDN博客");//分享标题
                params.putString(QQShare.SHARE_TO_QQ_SUMMARY,"不管是怎样的过程,最终目的还是那个理想的结果。");//要分享的内容摘要
                params.putString(QQShare.SHARE_TO_QQ_TARGET_URL,"http://blog.csdn.net/sandyran");//内容地址
                params.putString(QQShare.SHARE_TO_QQ_IMAGE_URL,"http://avatar.csdn.net/B/3/F/1_sandyran.jpg");//分享的图片URL
                params.putString(QQShare.SHARE_TO_QQ_APP_NAME, "测试");//应用名称
                mTencent.shareToQQ(MainActivity.this, params, new ShareUiListener());
            }
        });
        //QQ空间分享
        qzone_fenxiang.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int QzoneType = QzoneShare.SHARE_TO_QZONE_TYPE_NO_TYPE;
                Bundle params = new Bundle();
                params.putInt(QzoneShare.SHARE_TO_QZONE_KEY_TYPE, QzoneType);
                params.putString(QzoneShare.SHARE_TO_QQ_TITLE, "然了个然CSDN博客");//分享标题
                params.putString(QzoneShare.SHARE_TO_QQ_SUMMARY, "不管是怎样的过程,最终目的还是那个理想的结果。");//分享的内容摘要
                params.putString(QzoneShare.SHARE_TO_QQ_TARGET_URL, "http://blog.csdn.net/sandyran/article/details/53204529");//分享的链接
                //分享的图片, ArrayList<String>的类型传入,以便支持多张图片(注:图片最多支持9张图片,多余的图片会被丢弃)
                ArrayList<String> imageUrls = new ArrayList<String>();
                imageUrls.add("http://avatar.csdn.net/B/3/F/1_sandyran.jpg");//添加一个图片地址
                params.putStringArrayList(QzoneShare.SHARE_TO_QQ_IMAGE_URL, imageUrls);//分享的图片URL
                mTencent.shareToQzone(MainActivity.this, params, new ShareUiListener());
            }
        });
        //音乐分享
        music_fenxiang.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                final Bundle params = new Bundle();
                params.putInt(QQShare.SHARE_TO_QQ_KEY_TYPE, QQShare.SHARE_TO_QQ_TYPE_DEFAULT);//分享的类型
                params.putString(QQShare.SHARE_TO_QQ_TITLE, "歌曲名:说穿");//分享的标题
                params.putString(QQShare.SHARE_TO_QQ_TARGET_URL, "专辑名:最好的我们,歌手:谢楠");//分享的内容摘要
                params.putString(QQShare.SHARE_TO_QQ_TARGET_URL, "https://y.qq.com/n/yqq/song/004Dle9I3TaSai.html");//分享的链接
                params.putString(QQShare.SHARE_TO_QQ_IMAGE_URL, "https://y.gtimg.cn/music/photo_new/T002R300x300M000000kbocv24CRbE.jpg?max_age=2592000");//分享的图片URL
                params.putString(QQShare.SHARE_TO_QQ_APP_NAME, "测试");//应用名称
                params.putString(QQShare.SHARE_TO_QQ_EXT_INT, String.valueOf(QQShare.SHARE_TO_QQ_FLAG_QZONE_AUTO_OPEN));//分享时自动打开分享到QZone的对话框
                mTencent.shareToQQ(MainActivity.this, params, new ShareUiListener());
            }
        });


    }



    private class BaseUiListener implements IUiListener {

        @Override
        public void onComplete(Object response) {
            Toast.makeText(MainActivity.this, "授权成功", Toast.LENGTH_SHORT).show();
            Log.e(TAG, "response:" + response);
            JSONObject obj = (JSONObject) response;
            try {
                String openID = obj.getString("openid");
                String accessToken = obj.getString("access_token");
                String expires = obj.getString("expires_in");
                mTencent.setOpenId(openID);
                mTencent.setAccessToken(accessToken,expires);
                QQToken qqToken = mTencent.getQQToken();
                mUserInfo = new UserInfo(getApplicationContext(),qqToken);
                mUserInfo.getUserInfo(new IUiListener() {
                    @Override
                    public void onComplete(Object response) {
                        Log.e(TAG,"登录成功"+response.toString());

                        JSONObject res = (JSONObject) response;

                        String nickname = res.optString("nickname");

                        String figureurl_qq_1 = res.optString("figureurl_qq_1");

                        Log.e(TAG, nickname + "      " + figureurl_qq_1);
                        //加载名字
                        textView.setText(nickname);
                        //加载头像
                        Glide.with(MainActivity.this).load(figureurl_qq_1).into(imageView);
                    }

                    @Override
                    public void onError(UiError uiError) {
                        Log.e(TAG,"登录失败"+uiError.toString());
                    }

                    @Override
                    public void onCancel() {
                        Log.e(TAG,"登录取消");

                    }
                });
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onError(UiError uiError) {
            Toast.makeText(MainActivity.this, "授权失败", Toast.LENGTH_SHORT).show();

        }

        @Override
        public void onCancel() {
            Toast.makeText(MainActivity.this, "授权取消", Toast.LENGTH_SHORT).show();

        }

    }

    /**
     * 在调用LoginActivity或者Fragment中重写onActivityResult方法
     * @param requestCode
     * @param resultCode
     * @param data
     */
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if(requestCode == Constants.REQUEST_LOGIN){
            Tencent.onActivityResultData(requestCode,resultCode,data,mIUiListener);
        }
        super.onActivityResult(requestCode, resultCode, data);
    }
    /**
     * 自定义监听器实现IUiListener,需要3个方法
     * onComplete完成 onError错误 onCancel取消
     */
    private class ShareUiListener implements IUiListener {

        @Override
        public void onComplete(Object response) {
            //分享成功

        }

        @Override
        public void onError(UiError uiError) {
            //分享失败

        }

        @Override
        public void onCancel() {
            //分享取消

        }
    }



}