第三方登录跟分享
分享在每个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中然后添加依赖
结构如下:
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(); } } /** * 在调用Login的Activity或者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() { //分享取消 } } }