版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ShenQiXiaYang/article/details/83413153
友盟官方文档
我采用的是手动集成友盟的官方文档。下载SDK进行集成。
解压缩,选择自己需要的文件进行加入到Android Studio中。
由于这里我只需要QQ,那就把QQ文件夹中的所有文件拷贝一份到AndroidStudio中。然后再把一些共有的jar也拷贝到AndroidStudio中。下图就是我所需要的所有的libs。
腾讯开放平台
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对个人信息进行数据加密。