使用友盟快速整合QQ分享與QQ授權登入
阿新 • • 發佈:2018-12-17
我採用的是手動整合友盟的官方文件。下載SDK進行整合。 App並沒有上線,只是測試整合QQ分享與QQ授權登入。通過上圖也可以看到(未提交稽核)紅色標底的五個大字。
友盟和騰訊開放平臺都註冊成功後,現在開始我們的Demo。
開始我們的AndroidManifest.xml檔案中配置項
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.maigu.yang.umengdemo">
< uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<application
android:name=".App"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- 友盟分享 -->
<!-- QQ分享 -->
<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="tencent1107929472" />
</intent-filter>
</activity>
<activity
android:name="com.tencent.connect.common.AssistActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:theme="@android:style/Theme.Translucent.NoTitleBar" />
</application>
</manifest>
App.java檔案
import android.app.Application;
import com.umeng.commonsdk.UMConfigure;
import com.umeng.socialize.PlatformConfig;
import com.umeng.socialize.UMShareAPI;
public class App extends Application {
{
PlatformConfig.setQQZone("1107929472", "M673KwYa1vGU1lzt");
}
@Override
public void onCreate() {
super.onCreate();
/*
* 初始化common庫
* 引數1:上下文,不能為空
* 引數2:【友盟+】 AppKey
* 引數3:【友盟+】 Channel
* 引數4:裝置型別,UMConfigure.DEVICE_TYPE_PHONE為手機、UMConfigure.DEVICE_TYPE_BOX為盒子,預設為手機
* 引數5:Push推送業務的secret
*/
UMConfigure.init(this, "5bd27e33f1f55647610002b0",
"umeng", UMConfigure.DEVICE_TYPE_PHONE, "");
/*
注意:
引數1:上下文,必須的引數,不能為空。
引數2:【友盟+】 AppKey,非必須引數,如果Manifest檔案中已配置AppKey,該引數可以傳空,則使用Manifest中配置的AppKey,否則該引數必須傳入。
引數3:【友盟+】 Channel,非必須引數,如果Manifest檔案中已配置Channel,該引數可以傳空,則使用Manifest中配置的Channel,否則該引數必須傳入,Channel命名請詳見Channel渠道命名規範。
引數4:裝置型別,必須引數,傳引數為UMConfigure.DEVICE_TYPE_PHONE則表示手機;傳引數為UMConfigure.DEVICE_TYPE_BOX則表示盒子;預設為手機。
引數5:Push推送業務的secret,需要整合Push功能時必須傳入Push的secret,否則傳空。
*/
UMShareAPI.get(this);//友盟
}
}
然後是工具類MD5Util .java
import java.security.MessageDigest;
/*
* MD5Util 演算法
*/
public class MD5Util {
/**
* 預設構造方法
*/
private MD5Util() {
}
/**
* MD5加密
*
* @param message 要進行MD5加密的字串
* @return 加密結果為32位字串
*/
public static String getMD5(String message) {
MessageDigest messageDigest = null;
StringBuffer md5StrBuff = new StringBuffer();
try {
messageDigest = MessageDigest.getInstance("MD5");
messageDigest.reset();
messageDigest.update(message.getBytes("UTF-8"));
byte[] byteArray = messageDigest.digest();
for (int i = 0; i < byteArray.length; i++) {
if (Integer.toHexString(0xFF & byteArray[i]).length() == 1) {
md5StrBuff.append("0").append(Integer.toHexString(0xFF & byteArray[i]));
} else {
md5StrBuff.append(Integer.toHexString(0xFF & byteArray[i]));
}
}
} catch (Exception e) {
throw new RuntimeException();
}
// return md5StrBuff.toString().toUpperCase();//字母大寫
return md5StrBuff.toString();//字母小寫
}
}
activity_main.xml檔案
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical"
tools:context=".MainActivity">
<Button
android:id="@+id/btn_share"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="QQ分享"
android:textAllCaps="false"
tools:ignore="HardcodedText" />
<Button
android:id="@+id/btn_login"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="QQ授權登入"
android:textAllCaps="false"
tools:ignore="HardcodedText" />
</LinearLayout>
MainActivity.java檔案
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import com.umeng.socialize.ShareAction;
import com.umeng.socialize.UMAuthListener;
import com.umeng.socialize.UMShareAPI;
import com.umeng.socialize.UMShareListener;
import com.umeng.socialize.bean.SHARE_MEDIA;
import com.umeng.socialize.media.UMImage;
import com.umeng.socialize.media.UMWeb;
import java.util.Map;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button btn_share;
private Button btn_login;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView() {
btn_share = (Button) findViewById(R.id.btn_share);
btn_login = (Button) findViewById(R.id.btn_login);
btn_share.setOnClickListener(this);
btn_login.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_share:
UMWeb web = new UMWeb("https://blog.csdn.net/ShenQiXiaYang");
web.setTitle("暖暖的雲陽的部落格");//標題
UMImage image1 = new UMImage(this, "https://avatar.csdn.net/F/E/5/1_shenqixiayang.jpg?1540524717");
web.setDescription("關於移動裝置Android開發");//描述
web.setThumb(image1);
new ShareAction(this).withMedia(web)
.setDisplayList(SHARE_MEDIA.QQ, SHARE_MEDIA.QZONE)
.setCallback(shareListener).open();
break;
case R.id.btn_login:
UMShareAPI.get(this).getPlatformInfo(MainActivity.this, SHARE_MEDIA.QQ, authListener);
break;
default:
break;
}
}
private UMAuthListener authListener = new UMAuthListener() {
/**
* @desc 授權開始的回撥
* @param platform 平臺名稱
*/
@Override
public void onStart(SHARE_MEDIA platform) {
}
/**
* @desc 授權成功的回撥
* @param platform 平臺名稱
* @param action 行為序號,開發者用不上
* @param data 使用者資料返回
*/
@Override
public void onComplete(SHARE_MEDIA platform, int action, Map<String, String> data) {
// 登入成功後,第三方平臺會將使用者資料傳回, 全部會在Map data中返回
for (String key :
data.keySet()) {
Log.e("暖暖的雲陽", "key = " + key + " value = " + MD5Util.getMD5(data.get(key)) + "\n");
}
Toast.makeText(MainActivity.this, "成功了", Toast.LENGTH_LONG).show();
}
/**
* @desc 授權失敗的回撥
* @param platform 平臺名稱
* @param action 行為序號,開發者用不上
* @param t 錯誤原因
*/
@Override
public void onError(SHARE_MEDIA platform, int action, Throwable t) {
Toast.makeText(MainActivity.this, "失敗:" + t.getMessage(), Toast.LENGTH_LONG).show();
}
/**
* @desc 授權取消的回撥
* @param platform 平臺名稱
* @param action 行為序號,開發者用不上
*/
@Override
public void onCancel(SHARE_MEDIA platform, int action) {
Toast.makeText(MainActivity.this, "取消了", Toast.LENGTH_LONG).show();
}
};
private UMShareListener shareListener = new UMShareListener() {
/**
* @descrption 分享開始的回撥
* @param platform 平臺型別
*/
@Override
public void onStart(SHARE_MEDIA platform) {
}
/**
* @descrption 分享成功的回撥
* @param platform 平臺型別
*/
@Override
public void onResult(SHARE_MEDIA platform) {
Toast.makeText(MainActivity.this, "成功了", Toast.LENGTH_LONG).show();
}
/**
* @descrption 分享失敗的回撥
* @param platform 平臺型別
* @param t 錯誤原因
*/
@Override
public void onError(SHARE_MEDIA platform, Throwable t) {
Toast.makeText(MainActivity.this, "失敗" + t.getMessage(), Toast.LENGTH_LONG).show();
}
/**
* @descrption 分享取消的回撥
* @param platform 平臺型別
*/
@Override
public void onCancel(SHARE_MEDIA platform) {
Toast.makeText(MainActivity.this, "取消了", Toast.LENGTH_LONG).show();
}
};
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
//
UMShareAPI.get(this).onActivityResult(requestCode, resultCode, data);
}
/**
* 記憶體洩漏解決方案
*/
@Override
protected void onDestroy() {
super.onDestroy();
UMShareAPI.get(this).release();
}
}
執行效果圖: 然後分享到QQ中: 可以看到標題,描述,以及點選效果彈出網頁都是我們在程式碼中定義好的。OK,看下點選效果:
接下來就是QQ授權登入——確認頁面 以及在授權成功的回撥中拿到的所有的使用者資訊資料。
/**
* @desc 授權成功的回撥
* @param platform 平臺名稱
* @param action 行為序號,開發者用不上
* @param data 使用者資料返回
*/
@Override
public void onComplete(SHARE_MEDIA platform, int action, Map<String, String> data) {
// 登入成功後,第三方平臺會將使用者資料傳回, 全部會在Map data中返回
for (String key :
data.keySet()) {
Log.e("暖暖的雲陽", "key = " + key + " value = " + MD5Util.getMD5(data.get(key)) + "\n");
}
Toast.makeText(MainActivity.this, "成功了", Toast.LENGTH_LONG).show();
}
防止自己的QQ資訊洩露,我使用的MD5對個人資訊進行資料加密。