主要通过集成友盟SDK+QQ/微信/新浪SDK实现分享和微信登录功能
- 1、build.gradle 配置
- 2、app 文件夹下build.gradle添加以下内容
- 3、androidManifest.xml 配置
- 4、包目录下创建 wxapi 目录 添加 WXEntryActivity.class 文件
- 5、app 里面的 AndroidManifest.xml
- 6、调用功能的对应Activity 配置
- 7、分享调用
- 8、微信、QQ登录
- 9、初始化
1、build.gradle 配置
在build.gradle中添加友盟 " maven { url ‘https://repo1.maven.org/maven2/’} "
// Top-level build file where you can add configuration options common to all sub-projects/modules.
apply from: "config.gradle"
buildscript {
repositories {
...
//友盟
maven { url 'https://repo1.maven.org/maven2/'}
}
dependencies {
classpath 'com.android.tools.build:gradle:3.5.0'
}
}
allprojects {
repositories {
...
//友盟
maven { url 'https://repo1.maven.org/maven2/'}
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
2、app 文件夹下build.gradle添加以下内容
...
android {
...
defaultConfig {
..
ndk {
//选择要添加的对应 cpu 类型的 .so 库。
abiFilters 'armeabi', 'armeabi-v7a', 'arm64-v8a', 'x86'
}
manifestPlaceholders = [
//极光
JPUSH_PKGNAME: applicationId,
JPUSH_APPKEY : "***********", //JPush 上注册的包名对应的 Appkey.
JPUSH_CHANNEL: "developer-default", //暂时填写默认值即可.
//QQ AppID
qqappid : "自己申请的",
]
}
buildTypes {
....
}
//aar
repositories {
flatDir {
dirs 'libs'
}
}
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src']
resources.srcDirs = ['src']
aidl.srcDirs = ['src']
renderscript.srcDirs = ['src']
res.srcDirs = ['res']
assets.srcDirs = ['assets']
jniLibs.srcDirs = ['libs']
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
//如果以下内容是放在module 中 implementation 改成api 就可以
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
//基础组件库
//必选
api 'com.umeng.umsdk:common:9.4.4'
//必选
api 'com.umeng.umsdk:asms:1.4.1'
//集成U-Link,可选,如要统计分享回流次数和分享新增用户指标则必选
//api 'com.umeng.umsdk:link:1.1.0'
//U-Share SDK
api 'com.umeng.umsdk:share-core:7.1.7'//分享核心库,必选
api 'com.umeng.umsdk:share-board:7.1.7'//分享面板功能,可选
api 'com.umeng.umsdk:share-wx:7.1.7' //微信完整版
api 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:6.7.9'//微信官方依赖库,必选
api 'com.umeng.umsdk:share-qq:7.1.7'//QQ完整版
api files('libs/open_sdk_3.5.7.4_r1bc9afe_lite.jar')//QQ官方依赖库,必选
api 'com.squareup.okhttp3:okhttp:3.14.9'//QQ SDK在3.53.0版本及以上时需要集成okhttp官方依赖库,必选
api 'com.umeng.umsdk:share-sina:7.1.7'//新浪微博完整版
api 'io.github.sinaweibosdk:core:11.11.1@aar'//新浪微博官方SDK依赖库,必选
// api files('libs/openDefault-10.10.0.aar')
}
3、androidManifest.xml 配置
以下内容不需要配置
<application>
<!-- QQ配置 start -->
<!-- <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="tencent+appid" />-->
<!-- </intent-filter>-->
<!-- </activity>-->
<!-- <!– 这个配置可以解决QQ分身的背景透明度 –>-->
<!-- <activity-->
<!-- android:name="com.tencent.connect.common.AssistActivity"-->
<!-- android:configChanges="orientation|keyboardHidden|screenSize"-->
<!-- tools:replace="android:configChanges"-->
<!-- android:theme="@android:style/Theme.Translucent.NoTitleBar" />-->
<!-- QQ配置 end -->
<!-- 友盟分享编辑页(只有新浪微博精简版,豆瓣人人腾讯微博需要): -->
<!-- <activity
android:name="com.umeng.socialize.editorpage.ShareActivity"
android:excludeFromRecents="true"
android:screenOrientation="portrait"
android:theme="@style/Theme.UMDefault" />
-->
</application>
不然会提示
Manifest merger failed : Attribute data@scheme at AndroidManifest.xml requires a placeholder substitution but no value for is provided.
主要原因是
QQ SDK中有配置,只需要在build.gradle中配置"qqappid"(详情见步奏2) manifestPlaceholders =[qqappid : “自己申请的”,]
另外友盟SDK最新版引用的QQ、微信SDK和官方的一至!!
4、包目录下创建 wxapi 目录 添加 WXEntryActivity.class 文件
package 你的包名.wxapi;
import com.umeng.socialize.weixin.view.WXCallbackActivity;
public class WXEntryActivity extends WXCallbackActivity {
}
5、res/xml/file_paths.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<paths>
....
<!-- QQ 官方分享SDK 共享路径 -->
<root-path name="opensdk_root" path=""/>
<external-files-path name="opensdk_external" path="Images/tmp"/>
<!-- 友盟微信分享SDK 共享路径-->
<external-files-path name="umeng_cache" path="umeng_cache/"/>
<!-- 新浪微博 官方分享SDK 10.10.0共享路径 -->
<external-files-path name="share_files" path="." />
</paths>
</resources>
5、app 里面的 AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="你的包名">
...
//Android11 在应用的AndroidManifest.xml添加如下<queries>标签
<queries>
<package android:name="com.tencent.mm" /> // 指定微信包名
<package android:name="com.tencent.mobileqq" /> //指定qq包名
<package android:name="com.sina.weibo" /> //指定微博包名
<package android:name="com.qzone" /> //指定QQ空间包名
</queries>
//或者
<!--查看应用是否已安装·Android 11 新增-->
<uses-permission
android:name="android.permission.QUERY_ALL_PACKAGES"
tools:ignore="QueryAllPackagesPermission" />
<application
>
...
<!--文件访问配置-->
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<!-- 元数据 -->
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
tools:replace="android:resource"
android:resource="@xml/file_paths" />
</provider>
...
</application>
</manifest>
6、调用功能的对应Activity 配置
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
//QQ 回调需要
UMShareAPI.get(this).onActivityResult(requestCode, resultCode, data);
}
@Override
public void onDestroy() {
super.onDestroy();
UMShareAPI.get(this).release();
}
7、分享调用
/**
* 面板分享
*/
public static void startShare(Activity activity, ShareBean shareBean, UMShareListener shareListener) {
new ShareAction(activity)
.setDisplayList(SHARE_MEDIA.WEIXIN_CIRCLE, SHARE_MEDIA.WEIXIN, SHARE_MEDIA.QZONE, SHARE_MEDIA.QQ)
.setCallback(shareListener)
.withMedia(shareBean.getUmWeb())
.open();
}
/**
* 直接分享
*/
public static void startShare(Activity activity, UMImage image, SHARE_MEDIA media,
UMShareListener shareListener) {
new ShareAction(activity).setPlatform(media)
.setCallback(shareListener)
.withMedia(image)
.share();
}
public UMShareListener umShareListener = new UMShareListener() {
@Override
public void onStart(SHARE_MEDIA share_media) {
}
@Override
public void onResult(SHARE_MEDIA share_media) {
ToastUtils.show(getString(R.string.str_share_success));
}
@Override
public void onError(SHARE_MEDIA share_media, Throwable throwable) {
SpDialog.dismiss();
if (throwable.getMessage().contains("2008")) {
if (share_media == SHARE_MEDIA.WEIXIN_CIRCLE || share_media == SHARE_MEDIA.WEIXIN) {
ToastUtils.show("您没有安装微信,请安装微信");
} else if (share_media == SHARE_MEDIA.QZONE || share_media == SHARE_MEDIA.QQ) {
ToastUtils.show("您没有安装QQ,请先安装QQ");
}
} else {
ToastUtils.show(getString(R.string.str_share_error));
}
}
@Override
public void onCancel(SHARE_MEDIA share_media) {
ToastUtils.show(getString(R.string.str_share_cancel));
}
};
8、微信、QQ登录
UMShareAPI.get(this).getPlatformInfo(this, platformType, authListener);
/**
* 友盟umAuthListener为授权回调
*/
UMAuthListener authListener = new UMAuthListener() {
/**
* @desc 授权开始的回调
* @param platform 平台名称
*/
@Override
public void onStart(SHARE_MEDIA platform) {
}
/**
* @desc 授权成功的回调
* @param data 用户资料返回
* 登录成功后,第三方平台会将用户资料传回,
* 全部会在Map data中返回 ,由于各个平台对于用户资料的标识不同,因此为了便于开发者使用,我们将一些常用的字段做了统一封装,开发者可以直接获取
* 字段说明
* UShare封装后字段名 QQ原始字段名 微信原始字段名 新浪原始字段名 字段含义 备注
* uid openid unionid id 用户唯一标识 uid能否实现Android与iOS平台打通,目前QQ只能实现同APPID下用户ID匹配
* name screen_name screen_name screen_name 用户昵称
* gender gender gender gender 用户性别 该字段会直接返回男女
* iconurl profile_image_url profile_image_url profile_image_url 用户头像
*/
@Override
public void onComplete(SHARE_MEDIA platform, int action, Map<String, String> data) {
LogUtils.d("第三方平台信息:" + data.toString());
}
/**
* 授权失败的回调
*/
@Override
public void onError(SHARE_MEDIA platform, int action, Throwable t) {
}
/**
授权取消的回调
*/
@Override
public void onCancel(SHARE_MEDIA platform, int action) {
}
};
9、初始化
Application 的onCreate()方法
/**
* 初始化友盟分享
*/
private void initUMeng() {
//设置LOG开关,默认为false
UMConfigure.setLogEnabled(true);
//友盟预初始化
UMConfigure.preInit(getApplicationContext(),"友盟ID","Umeng");
//判断是否同意隐私协议,uminit为1时为已经同意,直接初始化umsdk
if(MyUtils.getString((String) SPUtils.get(SpConstant.uminit,"")).equals("1")){
//友盟正式初始化
UmInitConfig umInitConfig=new UmInitConfig();
umInitConfig.UMinit(getApplicationContext());
}
}
UmInitConfig .class
1、Andriod 11必须要调用PlatformConfig.setWXFileProvider、PlatformConfig.setQQFileProvider等等,否则分享本地图片到微信、QQ、微博平台会失败
public class UmInitConfig {
public void UMinit(Context context){
//初始化组件化基础库, 统计SDK/推送SDK/分享SDK都必须调用此初始化接口
UMConfigure.init(context, "友盟ID", "Umeng", UMConfigure.DEVICE_TYPE_PHONE, "");
String FileProvider = "包名.fileprovider";
PlatformConfig.setWeixin("微信AppId", "appkey");
PlatformConfig.setWXFileProvider(FileProvider);
PlatformConfig.setSinaWeibo("微博AppId", "appkey", "返回");
PlatformConfig.setSinaFileProvider(FileProvider);
PlatformConfig.setQQZone("QQ AppId", "appkey");
PlatformConfig.setQQFileProvider(FileProvider);
}
}
2、分享v7.1.7 SDK中的QQ SDK版本是v3.5.7,暂时只支持离线引入jar包和官方依赖库,并且需要调用授权api才可以正常使用授权和分享功能
//QQ官方sdk授权
Tencent.setIsPermissionGranted(true);
否则会报错:java.lang.Throwable: 错误码:2003 错误信息:分享失败----用户未授权,暂时无法使用QQ登录及分享等功能,
判断是否安装指定app
public static boolean installApp(Context context, String package) {
if (packageName == null || packageName.isEmpty()) {
return false;
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
//Android 11
PackageInfo packageInfo;
try {
packageInfo = context.getPackageManager().getPackageInfo(packageName, 0);
} catch (PackageManager.NameNotFoundException e) {
packageInfo = null;
e.printStackTrace();
}
return packageInfo != null;
} else {
final PackageManager packageManager = context.getPackageManager();
List<PackageInfo> pInfo = packageManager.getInstalledPackages(0);
if (pInfo != null) {
for (int i = 0; i < pInfo.size(); i++) {
String pn = pInfo.get(i).packageName;
if (packageName.equals(pn)) {
return true;
}
}
}
return false;
}
}