Android- 友盟社会化分享【5.0版本集成文档】

来源:互联网 发布:网络写手怎么赚钱 编辑:程序博客网 时间:2024/05/29 00:30

前言:
之前有写过一篇友盟社会化分享的文章,是基于4.3版本SDK的。昨天在APP里面加入友盟的社会化分享功能, 去友盟官网查了一下, 发现最新版本的SDK已经更新到5.0,而且相对于之前4.3版本有了很大的改变,所以就想简单的做个总结。

友盟官方文档:http://dev.umeng.com/social/android/android-update

1. 产品概述【简单阐述一下新版本的特性】

关于分享和授权的sdk接口,我们在v5.0做出了巨大的改变,精简了接口调用的代码。并将分享授权,与评论等功能做出了隔离,使结构更加清晰。所以本版本的功能也只有分享与授权并无其他功能,请开发者注意。

注意:本文示例代码只有分享与授权功能,并对接口进行了调整,如需要原功能的开发者,请继续使用v4.3.0版本。

2. 获取友盟Appkey
如果你之前已经在友盟注册了应用,并获取到了Appkey,可以继续使用它.

如果你尚未在友盟注册开发者账号,需要先注册,注册之后登录你的账号,点击添加新应用,填写完应用基本信息后,将进入”下载SDK并添加代码”页面,此页面即可得到Appkey。

3. 下载并安装SDK
下载SDK最新版
添加代码和资源引用,我们提供了添加资源文件和jar文件的两种方式,可以根据需求选择
解压SDK压缩包,将文件夹中的’main/libs’和’main/res’文件夹复制到你的项目工程根目录下(如使用’ADT 17’以下用户需要手动添加’libs’下的jar文件到工程Path中)

解压SDK压缩包,将文件夹中的social_sdk_library_project文件夹导入Eclipse,并在您的工程中添加对此项目的引用即可。

这里写图片描述

(1)AndroidManifest配置

<activity           android:name="com.umeng.socialize.editorpage.ShareActivity"android:theme="@style/Theme.UMDefault"android:excludeFromRecents="true"/>

(2)设置友盟App_id

<meta-dataandroid:name="UMENG_APPKEY"android:value="4eaee02c527015373b000003" ></meta-data>

(3)增加相对应权限

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /><uses-permission android:name="android.permission.READ_PHONE_STATE" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.READ_LOGS" /><uses-permission android:name="android.permission.CALL_PHONE" /><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /><uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /><uses-permission android:name="android.permission.GET_TASKS" /><uses-permission android:name="android.permission.SET_DEBUG_APP" /><uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /><uses-permission android:name="android.permission.GET_ACCOUNTS" /><uses-permission android:name="android.permission.USE_CREDENTIALS" /><uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />

(4)针对不同平台的添加相对于的配置信息
微信平台

<activity            android:name="com.umeng.soexample.wxapi.WXEntryActivity"            android:configChanges="keyboardHidden|orientation|screenSize"            android:exported="true"            android:screenOrientation="portrait"            android:theme="@android:style/Theme.Translucent.NoTitleBar" />

新浪微博

<activity            android:name=".WBShareActivity"            android:configChanges="keyboardHidden|orientation"            android:screenOrientation="portrait" >            <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.sina.weibo.sdk.component.WeiboSdkBrowser"            android:configChanges="keyboardHidden|orientation"            android:windowSoftInputMode="adjustResize"            android:exported="false" >        </activity>        <service             android:name="com.sina.weibo.sdk.net.DownloadService"            android:exported="false">        </service>

QQ、Qzone

<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="tencent100424468" /></intent-filter></activity><activity              android:name="com.tencent.connect.common.AssistActivity"    android:screenOrientation="portrait"    android:theme="@android:style/Theme.Translucent.NoTitleBar" />

注:我目前只是集成了主流的平台,根据个人项目需求添加其他平台的配置。

4. 初始化配置
各个平台的配置,建议放在全局Application或者程序入口

PlatformConfig.setWeixin("wx967daebe835fbeac", "5bb696d9ccd75a38c8a0bfe0675559b3");       //微信 appid appsecretPlatformConfig.setSinaWeibo("3921700954","04b48b094faeb16683c32669824ebdad");       //新浪微博 appkey appsecretPlatformConfig.setQQZone("100424468", "c7394704798a158208a74ab60104f0ba");         // QQ和Qzone appid appkey     PlatformConfig.setAlipay("2015111700822536");        //支付宝 appidPlatformConfig.setYixin("yxc0614e80c9304c11b0391514d09f13bf");        //易信 appkey      PlatformConfig.setRenren("201874","28401c0964f04a72a14c812d6132fcef","3bf66e42db1e4fa9829b955cc300b737");        //人人 appid appkey appsecretPlatformConfig.setTwitter("3aIN7fuF685MuZ7jtXkQxalyi", "MK6FEYG63eWcpDFgRYw4w9puJhzDl0tyuqWjZ3M7XJuuG7mMbO");        //Twitter appid appkeyPlatformConfig.setPinterest("1439206");        //Pinterest appid PlatformConfig.setLaiwang("laiwangd497e70d4", "d497e70d4c3e4efeab1381476bac4c5e");        //来往 appid appkey

说明:有些平台的分享时通过调起本地客户端的形式完成的,因此,并不需要appid,但是诸如需要使用第三方公司api的平台,新浪,腾讯等,是需要去申请appkey的。其实新浪微博,人人网可以把appid等配置在代码中,也可在友盟后台中设置,豆瓣只能在友盟后台设置。其它需要配置appid的平台,如qq,微信,易信,twitter等都需要在代码中设置。还有一部分平台需要在mainfest中配置,前面已经提到过。

5.第三方登录
目前友盟社会化组件支持的第三方登录平台为:新浪微博、腾讯微博、QQ、QQ空间、微信、人人网、豆瓣、Facebook、Twitter。
(1) 授权
首先获取UMShareAPI

mShareAPI = UMShareAPI.get(this);

选取需要授权的平台,并进行授权,其中umAuthLisrener是回调监听器,需要开发者根据需求重新定义

SHARE_MEDIA platform = SHARE_MEDIA.SINA; mShareAPI.doOauthVerify(this, platform, umAuthListener)private UMAuthListener umAuthListener = new UMAuthListener() {        @Override        public void onComplete(SHARE_MEDIA platform, int action, Map<String, String> data) {            Toast.makeText( getApplicationContext(), "Authorize succeed", Toast.LENGTH_SHORT).show();        }        @Override        public void onError(SHARE_MEDIA platform, int action, Throwable t) {            Toast.makeText( getApplicationContext(), "Authorize fail", Toast.LENGTH_SHORT).show();        }        @Override        public void onCancel(SHARE_MEDIA platform, int action) {            Toast.makeText( getApplicationContext(), "Authorize cancel", Toast.LENGTH_SHORT).show();        }    };

对于删除授权使用的接口是

mShareAPI.deleteOauth(AuthActivity.this, platform, umdelAuthListener);

不难看出与授权的参数是一样的。

注意要重写

onActivityResult()     @Override    protected void onActivityResult(int requestCode, int resultCode, Intent data) {        super.onActivityResult(requestCode, resultCode, data);        mShareAPI.onActivityResult(requestCode, resultCode, data);    } 

获取客户端安装信息:

mShareAPI.isInstall(this, SHARE_MEDIA.WEIXIN)

(2)微信登录

<1>签名设置
注意打包后的apk文件签名必须与微信平台设置一致,微信平台签名设置位置如下图
这里写图片描述

apk签名可以直接安装微信签名工具,获取签名后与上图所示位置比对,如果不一致,则无法进入微信授权确认页面.

<2>回调类的实现
在AndroidManifest.xml中下注册下面的回调Activity。

<activity   android:name=".wxapi.WXEntryActivity"   android:theme="@android:style/Theme.Translucent.NoTitleBar"   android:configChanges="keyboardHidden|orientation|screenSize"   android:exported="true"   android:screenOrientation="portrait" />

然后将SDK包中platforms/weixin目录下的wxapi文件夹拷贝到您AndroidMainFest.xml文件application标签里配置的包目录下,然后修改WXEntryActivity的完整路径即可
[注意WXEntryActivity.java的完整路径必须正确,否则微信登录会无法返回相关用户数据,也无法正常执行回调]

<3>QQ及Qzone登录
实现方法同样如上,注意下面几点:

QQ及Qzone登录都必须安装QQ客户端,并且只能跳转QQ客户端实现登录,无法跳转到Qzone客户端
QQ及Qzone登录需要确保在腾讯平台通过审核或添加测试账号,否则会报错110406
QQ及Qzone登录必须确保apk签名与腾讯平台上传的apk签名匹配,否则会报错100044,出现此错误请联系腾讯平台人员(QQ:800013811 )修改apk签名
注意将Android manifest xml里的 腾讯平台APPID替换为自己申请的APPID,注意tencent前缀不要修改,否则无法正常实现QQ及Qzone登录

平台授权,是需要安装对应的客户端的。新浪微博,豆瓣网,人人网除外,新浪和人人如果本地安装了对应平台是走本地授权,如果没有安装,需要走网络授权

4,分享
分享分为两种样式,使用默认分享面板选择页面和自定义分享样式
(1)默认shareboard:

final SHARE_MEDIA[] displaylist = new SHARE_MEDIA[]                        {                            SHARE_MEDIA.WEIXIN, SHARE_MEDIA.WEIXIN_CIRCLE,SHARE_MEDIA.SINA,                            SHARE_MEDIA.QQ, SHARE_MEDIA.QZONE,SHARE_MEDIA.DOUBAN                        };                new ShareAction(this).setDisplayList( displaylist )                        .withText( "呵呵" )                        .withTitle("title")                        .withTargetUrl("http://www.baidu.com")                        .withMedia( image )                        .setListenerList(umShareListener,umShareListener)                        .setShareboardclickCallback(shareBoardlistener)                        .open();

【title参数对新浪、人人、豆瓣不生效】

修改默认shareboard中的分享平台,只需要传入自己需要的平台参数,放入shareaction中,并执行open方法即可。 shareboard点击响应回调方法如下:

private ShareBoardlistener shareBoardlistener = new ShareBoardlistener() {        @Override        public void onclick(SHARE_MEDIA share_media) {        }    };

(2)自定义分享样式
对于需要自己定义分享UI样式的开发者,可以自行绘制分享模块的整个UI,在对应的分享按钮中实现下面的方法

new ShareAction(this).setPlatform(SHARE_MEDIA.SINA).setCallback(umShareListener).withText("hello umeng video").withTargetUrl("http://www.baidu.com").withMedia(image).share();

选取分享的平台,设定分享回调接口和内容,并执行share方法。 回调接口如下:

new UMShareListener() {        @Override        public void onResult(SHARE_MEDIA platform) {            Toast.makeText(ShareActivity.this,platform + " 分享成功啦", Toast.LENGTH_SHORT).show();        }        @Override        public void onError(SHARE_MEDIA platform, Throwable t) {            Toast.makeText(ShareActivity.this,platform + " 分享失败啦", Toast.LENGTH_SHORT).show();        }        @Override        public void onCancel(SHARE_MEDIA platform) {            Toast.makeText(ShareActivity.this,platform + " 分享取消了", Toast.LENGTH_SHORT).show();        }    };

值得注意的是,分享也应该重写

onActivityResult()        @Override    protected void onActivityResult(int requestCode, int resultCode, Intent data) {        super.onActivityResult(requestCode, resultCode, data);        UMShareAPI.get( this ).onActivityResult( requestCode, resultCode, data);    }

(3)设置分享内容
目前支持文本、图片(本地及URL)、音频及视频URL的分享

图片(url)

UMImage image = new UMImage(ShareActivity.this, "http://www.umeng.com/images/pic/social/integrated_3.png");

图片(本地资源引用)

UMImage image = new UMImage(ShareActivity.this,                BitmapFactory.decodeResource(getResources(), R.drawable.image));

图片(本地绝对路径)

UMImage image = new UMImage(ShareActivity.this,                             BitmapFactory.decodeFile("/mnt/sdcard/icon.png")));

URL音频及图片

UMusic music = new UMusic("http://music.huoxing.com/upload/20130330/1364651263157_1085.mp3");music.setTitle("sdasdasd");music.setThumb(new UMImage(ShareActivity.this,"http://www.umeng.com/images/pic/social/chart_1.png"));

url视频

UMVideo video = new UMVideo("http://video.sina.com.cn/p/sports/cba/v/2013-10-22/144463050817.html");

6.高级功能

对于以上介绍的基本功能已经可以实现一般用户的需求,对于特殊要求,我们进行了特别处理: 针对分享面板,我们进行了如下的处理:

1 . 针对不同平台使用不同监听器,以及分享不同内容
根据前面的介绍可以知道,使用ShareAction(this).setDisplayList( displaylist)

可以进行分享面板的平台设置。同时使用setContentList(),

可以进行不同分享内容的处理,使用setListenerList()

进行不同回调的处理。

参考下面的代码:

 new ShareAction(this).setDisplayList(SHARE_MEDIA.SINA,SHARE_MEDIA.QQ,SHARE_MEDIA.QZONE)                       .setContentList(new ShareContent(),new ShareContent())                       .withMedia(image)                       .setListenerList(umShareListener,umShareListener)                       .open();
  1. 分享面板点击回调
    使用setShareboardclickCallback() 可以进行分享面板不同按钮的点击回调,方便开发者进行特殊处理。

3 . 分享面板增加自定义按钮

如果需要对分享面板增加自定义的按钮,可以通过 ShareAction(this).addButton(String showword,String Keyword,String icon,String Grayicon,int index) 进行设置其中第一个参数是显示的名字,第二个参数是平台名称, 注意着两个参数需要先声明 ,第三个参数是按钮图标的图片名字,第四个按钮是置灰情况下按钮图标的图片名字, 注意图片直接写路径即可,不要.png等后缀 最后一个变量是数标(功能保留)。 对于自定义平台的监听需要使用上面提到的分享面板点击回调,如下:

private ShareBoardlistener shareBoardlistener = new  ShareBoardlistener() {        @Override        public void onclick(SnsPlatform snsPlatform,SHARE_MEDIA share_media) {            if (share_media==null){                if (snsPlatform.mKeyword.equals("11")){                    Toast.makeText(ShareActivity.this,"add button success",Toast.LENGTH_LONG).show();                }            }            else {                new ShareAction(ShareActivity.this).setPlatform(share_media).setCallback(umShareListener)                        .withText("多平台分享")                        .share();            }        }    };

是新增按钮的回调监听是通过判断当获取平台为空时,keyword的值来进行确定的,并在对应的条件中进行处理即可。

7. QQ、Qzone分享集成说明

注意将Android manifest xml里的 腾讯平台APPID替换为自己申请的APPID,注意tencent前缀不要修改,否则会在分享后提示40000或分享取消。

8. 微信集成相关说明

1 微信和微信朋友圈的回调
如果在您的项目中集成了微信或者微信朋友圈,并且您需要准确的分享回调,则需要在AndroidManifest.xml中下注册下面的回调Activity。

<activity   android:name=".wxapi.WXEntryActivity"   android:theme="@android:style/Theme.Translucent.NoTitleBar"   android:configChanges="keyboardHidden|orientation|screenSize"   android:exported="true"   android:screenOrientation="portrait" />

注意这里不需要修改,否则可能引起微信回调执行不正确,影响微信登录及分享功能

然后将SDK包中platforms/weixin目录下的wxapi文件夹拷贝到您AndroidMainFest.xml文件application标签里配置的包目录下,然后修改WXEntryActivity的完整路径即可

以我们的Demo工程为例
social_sdk_example的包名为com.umeng.soexample,因此将wxapi文件夹拷贝到com.umeng.soexample下,最终WXEntryActivity的完整路径为com.umeng.soexample.wxapi.WXEntryActivity

注意WXEntryActivity.java的完整路径必须正确,否则微信分享回调无法正常执行,微信登录功能也无法正常实现

其中分享的回调接口SnsPostListener的onComplete方法的第二个参数代表分享的状态码,当值为200时表示分享成功;其余的值则为分享失败。

  1. 新浪集成的说明重点内容
    1 添加配置文件
    在Android manifest xml中添加相关配置, 参考文档

在你的工程应用包名的相应目录下新增一个WBShareActivity类,该类继承自Activity,预留空类即可

以我们的Demo工程为例
social_sdk_example的包名为com.umeng.soexample,最终WBShareActivity的完整路径为com.umeng.soexample.WBShareActivity

WBShareActivity内部实现如下

package com.umeng.soexample;import com.umeng.socialize.media.WBShareCallBackActivity;/** * Created by wangfei on 15/12/3. */public class WBShareActivity extends WBShareCallBackActivity{}
 <service             android:name="com.sina.weibo.sdk.net.DownloadService"            android:exported="false">        </service>

9.不同平台的分享内容要求
这里写图片描述

10. 混淆
为了保证引用友盟Social SDK jar文件以及腾讯jar文件被混淆,请在proguard.cfg文件中添加以下代码避免被混淆.

-dontshrink-dontoptimize-dontwarn com.google.android.maps.**-dontwarn android.webkit.WebView-dontwarn com.umeng.**-dontwarn com.tencent.weibo.sdk.**-dontwarn com.facebook.**-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 public class javax.**-keep public class android.webkit.**-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.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{*;}-dontwarn twitter4j.**-keep class twitter4j.** { *; }-keep class com.tencent.** {*;}-dontwarn com.tencent.**-keep public class com.umeng.soexample.R$*{    public static final int *;}-keep public class com.umeng.soexample.R$*{    public static final int *;}-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.sina.** {*;}-dontwarn com.sina.**-keep class  com.alipay.share.sdk.** {   *;}-keepnames class * implements android.os.Parcelable {    public static final ** CREATOR;}-keep class com.linkedin.** { *; }-keepattributes Signature
0 0