版权声明:本文为HaiyuKing原创文章,转载请注明出处!
前言
这里简单记录下友盟分享SDK集成的步骤。
如果想要使用自定义分享对话框实现,请参考《ShareDialogDemo【分享对话框】》,这个demo中就不集成分享对话框了,只是简单记录下和自定义对话框搭配的相关代码!
另外,因为可能用到存储权限,所以还需要搭配运行时权限申请功能。
还有就是QQ、微信、新浪等appkey值,需要在各自的平台上申请,这里就不一一介绍了。
使用步骤
一、项目组织结构图
注意事项:
1、 导入类文件后需要change包名以及重新import R文件路径
2、 Values目录下的文件(strings.xml、dimens.xml、colors.xml等),如果项目中存在,则复制里面的内容,不要整个覆盖
二、导入步骤
1、在友盟官网上创建应用,获取Appkey
2、导入SDK
具体请阅读官网:https://developer.umeng.com/docs/66632/detail/66639
方法一:下载SDK,将解压出来的jar包和res文件复制到工程libs/目录下。
下载地址:https://developer.umeng.com/
文件夹里面的jar文件、res文件都用得到。
(1)首先,新建thirdlib这个module,用来统一管理第三方平台的SDK;并且在app的bundle.gradle文件中引入thirdlib
//thirdlib
implementation project(':thirdlib')
(2)然后,将下载的友盟分享SDK中的jar文件复制到thirdlib这个module的libs目录下,并且在thirdlib的bundle.gradle文件中引用这些jar文件;以及res文件也要复制
还需要在app的bundle.gradle中添加以下代码
apply plugin: 'com.android.application'
android {
compileSdkVersion 28
defaultConfig {
applicationId "com.why.project.umengsharedemo"
minSdkVersion 16
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
//集成友盟分享sdk
repositories {
flatDir {
dirs 'libs'
dirs project(':thirdlib').file('libs')
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
//thirdlib
implementation project(':thirdlib')
}
回到thirdlib中,添加回调Activity
微信
在包名目录下创建wxapi文件夹,新建一个名为WXEntryActivity的activity继承WXCallbackActivity。
支付宝
与微信相似,支付宝需要在包名目录下创建apshare文件夹,然后建立一个ShareEntryActivity的类,继承ShareCallbackActivity。
钉钉
与微信相似,钉钉需要在包名目录下创建ddshare文件夹,然后建立一个DDShareActivity的类,DingCallBack。
QQ与新浪
QQ与新浪不需要添加Activity,但需要在使用QQ分享或者授权的Activity中,添加:
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); UMShareAPI.get(this).onActivityResult(requestCode, resultCode, data); }
注意onActivityResult不可在fragment中实现,如果在fragment中调用登录或分享,需要在fragment依赖的Activity中实现。
(3)然后,在app的AndroidManifest.xml中添加权限、配置Appkey【注意,紫色标记的代码】
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.why.project.umengsharedemo"> <!-- ======================友盟分享========================== --> <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=".MyApplication" 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> <!-- ======================友盟分享========================== --> <!--value的值填写你在友盟后台申请的应用Appkey--> <meta-data android:value="y483298439438209dewdewdew8989328" android:name="UMENG_APPKEY"/> <!--value的值填写渠道名称,例如yingyongbao。这里设置动态渠道变量【如果配合友盟统计一起使用的话,这里换成友盟统计的写法】--> <meta-data android:value="umengshare" android:name="UMENG_CHANNEL"/> <!-- 新浪 --> <activity android:name="com.umeng.socialize.media.WBShareCallBackActivity" android:configChanges="keyboardHidden|orientation" android:theme="@android:style/Theme.Translucent.NoTitleBar" android:exported="false" > </activity> <activity android:name="com.sina.weibo.sdk.web.WeiboSdkWebActivity" android:configChanges="keyboardHidden|orientation" android:exported="false" android:windowSoftInputMode="adjustResize" > </activity> <activity android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen" android:launchMode="singleTask" android:name="com.sina.weibo.sdk.share.WbShareTransActivity"> <intent-filter> <action android:name="com.sina.weibo.sdk.action.ACTION_SDK_REQ_ACTIVITY" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> <!-- 微信 --> <activity android:name="com.why.project.thirdlib.wxapi.WXEntryActivity" android:configChanges="keyboardHidden|orientation|screenSize" android:exported="true" android:theme="@android:style/Theme.Translucent.NoTitleBar" /> <!-- QQ 请注意将qq appkey替换成您自己的qq appkey --> <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="tencent74743893832980203290" /> </intent-filter> </activity> <activity android:name="com.tencent.connect.common.AssistActivity" android:theme="@android:style/Theme.Translucent.NoTitleBar" android:configChanges="orientation|keyboardHidden|screenSize"/> </application> </manifest>
因为可能用到存储权限,所以还需要搭配运行时权限申请功能。
(4)然后,在app中新建MyApplication.java文件,并添加友盟分享初始化方法
package com.why.project.umengsharedemo; import android.app.Application; import com.umeng.commonsdk.UMConfigure; import com.umeng.socialize.PlatformConfig; /** * Created by HaiyuKing * Used */ public class MyApplication extends Application { @Override public void onCreate() { super.onCreate(); /*=================友盟分享sdk=====================*/ initUmengShare(); } //友盟分享 private void initUmengShare(){ /** * 如果项目的Manifest文件中已经配置【友盟+】的AppKey和Channel,则使用该方法初始化,同时不必再次传入AppKey和Channel两个参数。 */ UMConfigure.init(this, UMConfigure.DEVICE_TYPE_PHONE,""); PlatformConfig.setWeixin("wx3232432432", "ferfefre5324432fref3rwf"); PlatformConfig.setSinaWeibo("34432423dfew", "gfgreerrerererwe","http://sns.whalecloud.com"); PlatformConfig.setQQZone("3223354321", "r234r432ferfrwewe"); } }
好了,友盟分享集成到项目中了。
三、使用方法
(1)在APP的module中的strings.xml文件中添加以下代码
<resources> <string name="app_name">UmengShareDemo</string> <string name="share_title">分享简书app</string> <string name="share_url">https://www.jianshu.com/</string> <string name="share_desc">人生海海,有趣的人相聚于此</string> <string name="share_open_error">手机中没有安装该应用</string> </resources>
(2)在APP的module的res中添加一个分享缩略图
(3)使用友盟自带的分享对话框界面或者自定义分享对话框界面区别如下【黄色是共用代码;橙色是自带分享对话框;绿色是自定义分享对话框】
package com.why.project.umengsharedemo; import android.content.Intent; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.widget.Toast; import com.umeng.socialize.ShareAction; 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; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //显示分享底部区域【显示自定义分享对话框的代码】 /*Bundle bundle = new Bundle(); ShareDialog shareDialog = ShareDialog.getInstance(mContext,bundle); shareDialog.setOnShareClickLitener(new ShareDialog.OnShareClickLitener() { @Override public void onShareToQQ() { openShare("QQ"); } @Override public void onShareToQZone() { openShare("QZone"); } @Override public void onShareToWX() { openShare("WX"); } @Override public void onShareToWXCircle() { openShare("WXCircle"); } @Override public void onShareToSina() { openShare("Sina"); } }); shareDialog.show(getSupportFragmentManager(), "Share");*/ } //友盟分享SDK--打开分享面板 private void openShare() { UMWeb web = new UMWeb(getResources().getString(R.string.share_url)); web.setTitle(getResources().getString(R.string.share_title));//标题 UMImage thumb = new UMImage(this, R.drawable.share_thumb);//缩略图不要超过18k thumb.compressStyle = UMImage.CompressStyle.SCALE;//大小压缩,默认为大小压缩,适合普通很大的图 web.setThumb(thumb); //缩略图 web.setDescription(getResources().getString(R.string.share_desc));//描述 new ShareAction(MainActivity.this) .withMedia(web) .setDisplayList(SHARE_MEDIA.SINA,SHARE_MEDIA.QQ,SHARE_MEDIA.QZONE,SHARE_MEDIA.WEIXIN,SHARE_MEDIA.WEIXIN_CIRCLE,SHARE_MEDIA.WEIXIN_FAVORITE) .setCallback(shareListener) .open(); } //友盟分享SDK--打开分享面板 private void openShare(String type){ UMWeb web = new UMWeb(getResources().getString(R.string.share_url)); web.setTitle(getResources().getString(R.string.share_title));//标题 UMImage thumb = new UMImage(this, R.drawable.share_thumb);//缩略图不要超过18k thumb.compressStyle = UMImage.CompressStyle.SCALE;//大小压缩,默认为大小压缩,适合普通很大的图 web.setThumb(thumb); //缩略图 web.setDescription(getResources().getString(R.string.share_desc));//描述 switch (type){ case "QQ": new ShareAction(MainActivity.this) .setPlatform(SHARE_MEDIA.QQ)//传入平台 .withMedia(web)//分享内容 .setCallback(shareListener)//回调监听器 .share(); break; case "QZone": new ShareAction(MainActivity.this) .setPlatform(SHARE_MEDIA.QZONE)//传入平台 .withMedia(web)//分享内容 .setCallback(shareListener)//回调监听器 .share(); break; case "WX": new ShareAction(MainActivity.this) .setPlatform(SHARE_MEDIA.WEIXIN)//传入平台 .withMedia(web)//分享内容 .setCallback(shareListener)//回调监听器 .share(); break; case "WXCircle": new ShareAction(MainActivity.this) .setPlatform(SHARE_MEDIA.WEIXIN_CIRCLE)//传入平台 .withMedia(web)//分享内容 .setCallback(shareListener)//回调监听器 .share(); break; case "Sina": new ShareAction(MainActivity.this) .setPlatform(SHARE_MEDIA.SINA)//传入平台 .withMedia(web)//分享内容 .setCallback(shareListener)//回调监听器 .share(); break; } } 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) { } /** * @descrption 分享失败的回调 * @param platform 平台类型 * @param t 错误原因 */ @Override public void onError(SHARE_MEDIA platform, Throwable t) { Log.e("why","t.getMessage()="+t.getMessage());//错误码:2008 错误信息:没有安装应用 if(t.getMessage().contains("2008")){ Toast.makeText(MainActivity.this,getResources().getString(R.string.share_open_error),Toast.LENGTH_SHORT).show(); } } /** * @descrption 分享取消的回调 * @param platform 平台类型 */ @Override public void onCancel(SHARE_MEDIA platform) { } }; //友盟分享SDK--QQ @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); UMShareAPI.get(this).onActivityResult(requestCode, resultCode, data);//友盟分享 } }
混淆配置
#=====================友盟分享sdk=====================
-dontshrink
-dontoptimize
-dontwarn com.google.android.maps.**
-dontwarn android.webkit.WebView
-dontwarn com.umeng.**
-dontwarn com.tencent.weibo.sdk.**
-dontwarn com.facebook.**
-keep public class javax.**
-keep public class android.webkit.**
-dontwarn android.support.v4.**
-keep enum com.facebook.**
-keepattributes Exceptions,InnerClasses,Signature
-keepattributes *Annotation*
-keepattributes SourceFile,LineNumberTable
-keep public interface com.facebook.**
-keep public interface com.tencent.**
-keep public interface com.umeng.socialize.**
-keep public interface com.umeng.socialize.sensor.**
-keep public interface com.umeng.scrshot.**
-keep public class com.umeng.socialize.* {*;}
-keep class com.facebook.**
-keep class com.facebook.** { *; }
-keep class com.umeng.scrshot.**
-keep public class com.tencent.** {*;}
-keep class com.umeng.socialize.sensor.**
-keep class com.umeng.socialize.handler.**
-keep class com.umeng.socialize.handler.*
-keep class com.umeng.weixin.handler.**
-keep class com.umeng.weixin.handler.*
-keep class com.umeng.qq.handler.**
-keep class com.umeng.qq.handler.*
-keep class UMMoreHandler{*;}
-keep class com.tencent.mm.sdk.modelmsg.WXMediaMessage {*;}
-keep class com.tencent.mm.sdk.modelmsg.** implements com.tencent.mm.sdk.modelmsg.WXMediaMessage$IMediaObject {*;}
-keep class im.yixin.sdk.api.YXMessage {*;}
-keep class im.yixin.sdk.api.** implements im.yixin.sdk.api.YXMessage$YXMessageData{*;}
-keep class com.tencent.mm.sdk.** {
*;
}
-keep class com.tencent.mm.opensdk.** {
*;
}
-keep class com.tencent.wxop.** {
*;
}
-keep class com.tencent.mm.sdk.** {
*;
}
-dontwarn twitter4j.**
-keep class twitter4j.** { *; }
-keep class com.tencent.** {*;}
-dontwarn com.tencent.**
-keep class com.kakao.** {*;}
-dontwarn com.kakao.**
-keep public class com.umeng.com.umeng.soexample.R$*{
public static final int *;
}
-keep public class com.linkedin.android.mobilesdk.R$*{
public static final int *;
}
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keep class com.tencent.open.TDialog$*
-keep class com.tencent.open.TDialog$* {*;}
-keep class com.tencent.open.PKDialog
-keep class com.tencent.open.PKDialog {*;}
-keep class com.tencent.open.PKDialog$*
-keep class com.tencent.open.PKDialog$* {*;}
-keep class com.umeng.socialize.impl.ImageImpl {*;}
-keep class com.sina.** {*;}
-dontwarn com.sina.**
-keep class com.alipay.share.sdk.** {
*;
}
-keepnames class * implements android.os.Parcelable {
public static final ** CREATOR;
}
-keep class com.linkedin.** { *; }
-keep class com.android.dingtalk.share.ddsharemodule.** { *; }
-keepattributes Signature
参考资料
暂时空缺
项目demo下载地址
链接:https://pan.baidu.com/s/1n3DScJYDZS4ztuJMEFqrPg 提取码:wekp