Android 使用第三方SDK—友盟实现分享功能

今天给大家写一下友盟的分享,这段时间在项目有用到,这里简单给大家介绍一下。

友盟的官网链接点击打开链接

首先,到微信,QQ,微博开放平台添加应用,获取key,下面列出链接:

QQ开放平台 微信开放平台  微博开放平台

到友盟官网注册,添加应用获取唯一的key, 下载友盟分享的SDK,需要引入到自己项目当中。我这只用到了微信,QQ,微博,就只选了一部分功能。



添加相应的res资源文件到你的项目中,到这里,准备工作就完成了。

接下来,开始实现分享功能。友盟分享有它自己给的分享界面,可以直接使用,代码在SDK集成文档中有,这里重点讲一下只使用分享提供的API,自己项目绘制分享界面。

效果图:


点击分享按钮,屏幕底部出现分享dialog。

布局很简单,就不贴代码了,写一个ShareDIalog类继承Dialog,引入布局文件,背景设置透明,添加一个出现与消失的动画

[java]  view plain  copy
 print ?
  1. public class ShareDialog extends Dialog {  
  2.     private onClickback callback;  
  3.   
  4.     public ShareDialog(Context context, onClickback callback) {  
  5.         this(context, R.layout.share_dialog, R.style.my_dialog_style,  
  6.                 LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);  
  7.         this.callback = callback;  
  8.     }  
  9.   
  10.     public ShareDialog(final Context context, int layout, int style, int width,  
  11.             int height) {  
  12.         super(context, style);  
  13.         setContentView(layout);  
  14.         setCanceledOnTouchOutside(true);  
  15.         // 设置属性值  
  16.         WindowManager.LayoutParams lp = getWindow().getAttributes();  
  17.         lp.width = width;  
  18.         lp.height = height;  
  19.         getWindow().setAttributes(lp);  
  20.           
  21.         setListener();  
  22.     }  
  23.   
  24.     // 设置点击事件  
  25.     private void setListener() {  
  26.         findViewById(R.id.tv_wx).setOnClickListener(  
  27.                 new android.view.View.OnClickListener() {  
  28.   
  29.                     @Override  
  30.                     public void onClick(View v) {  
  31.                         callback.onShare(1);  
  32.                         dismiss();  
  33.                     }  
  34.                 });  
  35.         findViewById(R.id.tv_wxp).setOnClickListener(  
  36.                 new android.view.View.OnClickListener() {  
  37.   
  38.                     @Override  
  39.                     public void onClick(View v) {  
  40.                         callback.onShare(2);  
  41.                         dismiss();  
  42.                     }  
  43.                 });  
  44.         findViewById(R.id.tv_wb).setOnClickListener(  
  45.                 new android.view.View.OnClickListener() {  
  46.   
  47.                     @Override  
  48.                     public void onClick(View v) {  
  49.                         callback.onShare(3);  
  50.                         dismiss();  
  51.                     }  
  52.                 });  
  53.         findViewById(R.id.tv_qq).setOnClickListener(  
  54.                 new android.view.View.OnClickListener() {  
  55.   
  56.                     @Override  
  57.                     public void onClick(View v) {  
  58.                         callback.onShare(4);  
  59.                         dismiss();  
  60.                     }  
  61.                 });  
  62.         findViewById(R.id.tv_qqz).setOnClickListener(  
  63.                 new android.view.View.OnClickListener() {  
  64.   
  65.                     @Override  
  66.                     public void onClick(View v) {  
  67.                         callback.onShare(5);  
  68.                         dismiss();  
  69.                     }  
  70.                 });  
  71.         findViewById(R.id.tv_cancal).setOnClickListener(  
  72.                 new android.view.View.OnClickListener() {  
  73.   
  74.                     @Override  
  75.                     public void onClick(View v) {  
  76.   
  77.                         dismiss();  
  78.                     }  
  79.                 });  
  80.     }  
  81.   
  82.     @Override  
  83.     public void show() {  
  84.         super.show();  
  85.         / 设置dialog显示动画  
  86.         getWindow().setWindowAnimations(R.style.dialogWindowAnim);  
  87.         // 设置显示位置为底部  
  88.         getWindow().setGravity(Gravity.BOTTOM);  
  89.     }  
  90.   
  91.     public interface onClickback {  
  92.   
  93.         abstract void onShare(int id);  
  94.     }  
  95. }  


anim 动画文件可以直接用友盟的:

styles:

[html]  view plain  copy
 print ?
  1. <resources>  
  2.     <style name="dialogWindowAnim" parent="android:Animation" mce_bogus="1">    
  3.         <item name="android:windowEnterAnimation">@anim/umeng_socialize_slide_in_from_bottom</item>    
  4.         <item name="android:windowExitAnimation">@anim/umeng_socialize_slide_out_from_bottom</item>    
  5.     </style>      
  6. </resources>  
窗口进入动画 umeng_socialize_slide_in_from_bottom.xml

[html]  view plain  copy
 print ?
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <translate xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:duration="300"  
  4.     android:fromXDelta="0.0%"  
  5.     android:fromYDelta="100.0%"  
  6.     android:toXDelta="0.0%"  
  7.     android:toYDelta="0.0%" />  

窗口消失动画 umeng_socialize_slide_out_from_bottom.xml

[html]  view plain  copy
 print ?
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <translate xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:duration="300"  
  4.     android:fromXDelta="0.0%"  
  5.     android:fromYDelta="0.0%"  
  6.     android:toXDelta="0.0%"  
  7.     android:toYDelta="100.0%" />  


分享按钮的点击在MainActivity中实现:

[java]  view plain  copy
 print ?
  1. public class MainActivity extends Activity {  
  2.   
  3.     private Button btn_share;  
  4.     final UMSocialService mController = UMServiceFactory  
  5.             .getUMSocialService("com.umeng.share");  
  6.   
  7.     private String title = "分享", content = "分享内容是。。。。",  
  8.             url = "http://www.baidu.com";  
  9.     SnsPostListener mSnsPostListener = null;  
  10.   
  11.     @Override  
  12.     protected void onCreate(Bundle savedInstanceState) {  
  13.         super.onCreate(savedInstanceState);  
  14.         setContentView(R.layout.activity_main);  
  15.         btn_share = (Button) findViewById(R.id.btn_share);  
  16.         //  
  17.         btn_share.setOnClickListener(new OnClickListener() {  
  18.   
  19.             @Override  
  20.             public void onClick(View v) {  
  21.                 //打开分享面板(自己定制界面,不使用友盟默认)  
  22.                 openShareDialog();  
  23.             }  
  24.   
  25.         });  
  26.         mSnsPostListener = new SnsPostListener() {  
  27.             @Override  
  28.             public void onStart() {  
  29.             }  
  30.   
  31.             @Override  
  32.             public void onComplete(SHARE_MEDIA platform, int eCode,  
  33.                     SocializeEntity entity) {  
  34.                 if (eCode == 200) {  
  35.                     Toast.makeText(MainActivity.this"分享成功",  
  36.                             Toast.LENGTH_SHORT).show();  
  37.                 }  
  38.             }  
  39.         };  
  40.         mController.registerListener(mSnsPostListener);  
  41.         // 初始化分享平台  
  42.         init();  
  43.         // 初始化分享平台内容  
  44.         initShare();  
  45.     }  
  46.   
  47.     private void openShareDialog() {  
  48.         new ShareDialog(MainActivity.thisnew onClickback() {  
  49.   
  50.             @Override  
  51.             public void onShare(int id) {  
  52.                 switch (id) {  
  53.                 case 1// 微信  
  54.                     shareToMedia(SHARE_MEDIA.WEIXIN);  
  55.                     break;  
  56.                 case 2// 朋友圈  
  57.                     shareToMedia(SHARE_MEDIA.WEIXIN_CIRCLE);  
  58.                     break;  
  59.                 case 3// 微博  
  60.                     shareToMedia(SHARE_MEDIA.SINA);  
  61.                     break;  
  62.                 case 4// qq  
  63.                     shareToMedia(SHARE_MEDIA.QQ);  
  64.                     break;  
  65.                 case 5// qq空间  
  66.                     shareToMedia(SHARE_MEDIA.QZONE);  
  67.                     break;  
  68.                 }  
  69.             }  
  70.         }).show();  
  71.     }  
  72.   
  73.     private void shareToMedia(SHARE_MEDIA share_MEDIA) {  
  74.         mController.postShare(MainActivity.this, share_MEDIA, snsPostListener());  
  75.   
  76.     }  
  77.   
  78.     private SnsPostListener snsPostListener() {  
  79.         return mSnsPostListener;  
  80.     }  
  81.   
  82.     /** 
  83.      * 初始化分享平台 
  84.      */  
  85.     private void init() {  
  86.         mController.setShareContent(title);  
  87.         mController.setShareMedia(new UMImage(MainActivity.this,  
  88.                 R.drawable.ic_launcher));  
  89.         mController.getConfig().closeToast();  
  90.         String appID = "微信应用id";  
  91.         String appSecret = "########################";  
  92.         // 添加微信平台  
  93.         UMWXHandler wxHandler = new UMWXHandler(MainActivity.this, appID,  
  94.                 appSecret);  
  95.         wxHandler.setTitle(title);  
  96.         wxHandler.addToSocialSDK();  
  97.         wxHandler.showCompressToast(false);  
  98.         // 添加微信朋友圈  
  99.         UMWXHandler wxCircleHandler = new UMWXHandler(MainActivity.this, appID,  
  100.                 appSecret);  
  101.         wxCircleHandler.setTitle(title);  
  102.         wxCircleHandler.setToCircle(true);  
  103.         wxCircleHandler.addToSocialSDK();  
  104.         wxCircleHandler.showCompressToast(false);  
  105.         String qqID = "QQ应用id";  
  106.         String qqSecret = "##############";  
  107.         UMQQSsoHandler qqSsoHandler = new UMQQSsoHandler(MainActivity.this,  
  108.                 qqID, qqSecret);  
  109.         qqSsoHandler.addToSocialSDK();  
  110.         qqSsoHandler.setTitle(title);  
  111.         QZoneSsoHandler qZoneSsoHandler = new QZoneSsoHandler(  
  112.                 MainActivity.this, qqID, qqSecret);  
  113.         qZoneSsoHandler.addToSocialSDK();  
  114.         SinaSsoHandler sinaSsoHandler = new SinaSsoHandler();  
  115.         sinaSsoHandler.setShareAfterAuthorize(true);  
  116.         sinaSsoHandler.addToSocialSDK();  
  117.   
  118.     }  
  119.   
  120.     /** 
  121.      * 初始化分享平台内容 
  122.      */  
  123.     private void initShare() {  
  124.         // 设置微信好友分享内容  
  125.         WeiXinShareContent weixinContent = new WeiXinShareContent();  
  126.         weixinContent.setShareContent(content);  
  127.         weixinContent.setTitle(title);  
  128.         weixinContent.setTargetUrl(url);  
  129.   
  130.         weixinContent.setShareImage(new UMImage(MainActivity.this,  
  131.                 R.drawable.ic_launcher));  
  132.         mController.setShareMedia(weixinContent);  
  133.         // 设置微信朋友圈分享内容  
  134.         CircleShareContent circleMedia = new CircleShareContent();  
  135.         circleMedia.setShareContent(content);  
  136.         circleMedia.setTitle(title);  
  137.         circleMedia.setShareImage(new UMImage(MainActivity.this,  
  138.                 R.drawable.ic_launcher));  
  139.         circleMedia.setTargetUrl(url);  
  140.         mController.setShareMedia(circleMedia);  
  141.         // 设置QQ分享内容  
  142.         QQShareContent qqShareContent = new QQShareContent();  
  143.         qqShareContent.setShareContent(content);  
  144.         qqShareContent.setTitle(title);  
  145.         qqShareContent.setShareImage(new UMImage(MainActivity.this,  
  146.                 R.drawable.ic_launcher));  
  147.         qqShareContent.setTargetUrl(url);  
  148.         mController.setShareMedia(qqShareContent);  
  149.         // 设置QQ空间分享内容  
  150.         QZoneShareContent qzone = new QZoneShareContent();  
  151.         qzone.setShareContent(content);  
  152.         qzone.setTargetUrl(url);  
  153.         qzone.setTitle(title);  
  154.         qzone.setShareImage(new UMImage(MainActivity.this,  
  155.                 R.drawable.ic_launcher));  
  156.         mController.setShareMedia(qzone);  
  157.         // 设置新浪微博分享内容  
  158.         SinaShareContent sinaShareContent = new SinaShareContent();  
  159.         sinaShareContent.setShareContent(content);  
  160.         sinaShareContent.setTargetUrl(url);  
  161.         sinaShareContent.setTitle(title);  
  162.         sinaShareContent.setShareImage(new UMImage(MainActivity.this,  
  163.                 R.drawable.ic_launcher));  
  164.         mController.setShareMedia(sinaShareContent);  
  165.     }  
  166.   
  167.     @Override  
  168.     protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
  169.         super.onActivityResult(requestCode, resultCode, data);  
  170.         /** 使用SSO授权必须添加如下代码 */  
  171.         UMSsoHandler ssoHandler = mController.getConfig().getSsoHandler(  
  172.                 requestCode);  
  173.         if (ssoHandler != null) {  
  174.             ssoHandler.authorizeCallBack(requestCode, resultCode, data);  
  175.         }  
  176.     }  
  177.   
  178.     @Override  
  179.     protected void onDestroy() {  
  180.         super.onDestroy();  
  181.         // 关闭监听器  
  182.         if (mController != null) {  
  183.             mController.getConfig().cleanListeners();  
  184.         }  
  185.     }  
  186. }  
点击分享按钮,就打开分享Dialog。 SnsPostListener是一个分享回调接口,

@Override
public void onComplete(SHARE_MEDIA platform, int eCode,
SocializeEntity entity) {
if (eCode == 200) {
Toast.makeText(MainActivity.this, "分享成功",Toast.LENGTH_SHORT).show();
}
}

onComplete第一个参数SHARE_MEDIA platform就是分享到的某个平台第二个参数int eCode是返回的状态码,200是成功

具体分享的时候,传入是哪一个平台就行了,比如微信:SHARE_MEDIA.WEIXIN

[java]  view plain  copy
 print ?
  1. case 1// 微信  
  2.     shareToMedia(SHARE_MEDIA.WEIXIN);  
  3.     break;  
  4.   
  5.   
  6. private void shareToMedia(SHARE_MEDIA share_MEDIA) {  
  7.     mController.postShare(MainActivity.this, share_MEDIA, snsPostListener());  
  8. }  

在分享界面关闭的时候在 onDestroy方法中一定记得同时关闭监听
[java]  view plain  copy
 print ?
  1. @Override  
  2.     protected void onDestroy() {  
  3.         super.onDestroy();  
  4.         // 关闭监听器  
  5.         if (mController != null) {  
  6.             mController.getConfig().cleanListeners();  
  7.         }  
  8. }  

注释写的比较详细,就不细说了。

更多详细的到友盟的官网链接点击打开链接


PS:

如果在您的项目中集成了微信或者微信朋友圈,并且您需要准确的分享回调,则需要在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的完整路径必须正确,否则微信分享回调无法正常执行,微信登录功能也无法正常实现。

WXEntryActivity.java类的内容可以为空,集成WXCallbackActivity类:

[java]  view plain  copy
 print ?
  1. import com.umeng.socialize.weixin.view.WXCallbackActivity;  
  2. public class WXEntryActivity extends WXCallbackActivity {  
  3.   
  4. }  

部分AndroidManifest.xml代码:

[html]  view plain  copy
 print ?
  1. <uses-sdk  
  2.         android:minSdkVersion="10"  
  3.         android:targetSdkVersion="19" />  
  4.   
  5.     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />  
  6.     <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />  
  7.     <uses-permission android:name="android.permission.READ_PHONE_STATE" />  
  8.     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />  
  9.     <uses-permission android:name="android.permission.INTERNET" />  
  10.     <uses-permission android:name="android.permission.READ_LOGS" />  
  11.     <uses-permission android:name="android.permission.CALL_PHONE" />  
  12.     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />  
  13.     <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />  
  14.     <uses-permission android:name="android.permission.GET_TASKS" />  
  15.     <uses-permission android:name="android.permission.SET_DEBUG_APP" />  
  16.     <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />  
  17.     <uses-permission android:name="android.permission.GET_ACCOUNTS" />  
  18.     <uses-permission android:name="android.permission.USE_CREDENTIALS" />  
  19.     <uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />  
  20.   
  21.     <application  
  22.         android:allowBackup="true"  
  23.         android:icon="@drawable/ic_launcher"  
  24.         android:label="@string/app_name"  
  25.         android:theme="@style/AppTheme" >  
  26.   
  27.         <activity  
  28.             android:name="com.huodao.hdphone.MainActivity"  
  29.             android:configChanges="orientation|keyboard"  
  30.             android:label="@string/app_name" >  
  31.             <intent-filter>  
  32.                 <action android:name="android.intent.action.MAIN" />  
  33.   
  34.                 <category android:name="android.intent.category.LAUNCHER" />  
  35.             </intent-filter>  
  36.         </activity>  
  37.   
  38.         <!-- 分享编辑页 -->  
  39.         <activity  
  40.             android:name="com.umeng.socialize.view.ShareActivity"  
  41.             android:configChanges="orientation|keyboard"  
  42.             android:launchMode="singleTask"  
  43.             android:noHistory="true"  
  44.             android:theme="@style/Theme.UMDialog"  
  45.             android:windowSoftInputMode="stateVisible|adjustResize" >  
  46.         </activity>  
  47.   
  48.         <!-- ############ QQ空间和QQ SSO授权的Activity注册 ############ -->  
  49.         <activity  
  50.             android:name="com.tencent.tauth.AuthActivity"  
  51.             android:launchMode="singleTask"  
  52.             android:noHistory="true" >  
  53.             <intent-filter>  
  54.                 <action android:name="android.intent.action.VIEW" />  
  55.   
  56.                 <category android:name="android.intent.category.DEFAULT" />  
  57.                 <category android:name="android.intent.category.BROWSABLE" />  
  58.   
  59.                 <data android:scheme="tencentQQ应用ID" />  
  60.             </intent-filter>  
  61.         </activity>  
  62.         <activity  
  63.             android:name="com.tencent.connect.common.AssistActivity"  
  64.             android:screenOrientation="portrait"  
  65.             android:theme="@android:style/Theme.Translucent.NoTitleBar" >  
  66.         </activity>  
  67.         <activity  
  68.             android:name=".wxapi.WXEntryActivity"  
  69.             android:configChanges="keyboardHidden|orientation|screenSize"  
  70.             android:exported="true"  
  71.             android:screenOrientation="portrait"  
  72.             android:theme="@android:style/Theme.Translucent.NoTitleBar" />  
  73.         <!-- ###################添加UmengAppkey###################### -->  
  74.   
  75.   
  76.         <!-- 友盟分享 -->  
  77.         <meta-data  
  78.             android:name="UMENG_APPKEY"  
  79.             android:value="友盟申请应用的key" >  
  80.         </meta-data>  
  81.     </application>  

集成友盟分享的时候一定要注意在各个开放平台申请应用id和KEY值,包名应用正式发布的签名一定不能出错,否则分享不成功。

分享效果图:

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值