ANDROID新浪微博、微信分享

用的各平台原生的分享SDK,未采用第三方集成的SDK(例如ShareSDK、友盟U-Share等)。

原因有三:
  1. 不想暴露自己的AppKey、AppID等信息给第三方;
  2. 第三方集成的原生SDK可能不是最新的,或者是排版不对;
  3. 遇到奇怪问题的时候,于第三方客服沟通,有时会解决不了;
注意事项:
  1. 最好是先注册好账号,申请相应的AppKey或AppID;
  2. ANDROID的坑贼多,做好心理准备;

1. SDK文件相关配置

  • 下载相关SDK,将SDK文件放到对应的lib文件夹(按自己项目的lib文件夹来)下,如下图:

    微信:libammsdk.jar
    新浪微博:libweibosdkcore.soweiboSDKCore_3.1.4.jar
  • 添加新浪微博和微信分享的回调界面(Activity),如下图:

    注意:图中有两个WXEntryActivity(这个问题到后面再说)。
  • 配置AndroidManifest.xml
    <!--sina-->
         <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>
         <activity
             android:name="com.share.demo.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.share.demo.wxapi.WXEntryActivity"   
             android:exported="true" />
         
         <activity     
             android:name="com.share.demo.mt.wxapi.WXEntryActivity"   
             android:exported="true" />
    
    <!-- 配置权限  -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
    

2. 编写自己需要分享的代码

(1)微信

WXEntryActivity.java,主要功能:接收微信分享回调。<u>这个文件一定要放在包名的路径下,ApkPackageName.wxapi下,比如:com.share.demo.wxapi,文件的最后路径为com.share.demo.wxapi. WXEntryActivity</u>
<u>注意</u>:public class WXEntryActivity extends Activity implements IWXAPIEventHandler 一定要这么写

(2)新浪

WBShareActivity.java,主要功能:接收新浪分享回调。<u>这个文件一定要放在包名的路径下,ApkPackageName下,比如:com.share.demo,文件最后的路径为com.share.demo. WBShareActivity</u>
<u>注意</u>:

  • public class WBShareActivity extends Activity implements IWeiboHandler.Response, WeiboAuthListener 一定要这么写
  • 新浪微博有两种方式分享:1. Web分享;2. 微信分享
    所以要用sendMultiMessage方式分享
    private void sendMultiMessage(String filePath) {
       
       // 1. 初始化微博的分享消息
       WeiboMultiMessage weiboMessage = new WeiboMultiMessage();
       weiboMessage.textObject = getTextObj();
       weiboMessage.imageObject = getImageObj(filePath);
       
       // 2. 初始化从第三方到微博的消息请求
       SendMultiMessageToWeiboRequest request = new SendMultiMessageToWeiboRequest();
       // 用transaction唯一标识一个请求
       request.transaction = String.valueOf(System.currentTimeMillis());
       request.multiMessage = weiboMessage;
    
       //这里直接调用客户端,避免与Web分享时的token冲突
       if (mWeiboShareAPI.isWeiboAppInstalled()) {
           boolean isSuccess = mWeiboShareAPI.sendRequest(WBShareActivity.this, request);
           //Log.e("sinaweibo", "sinaweibo send share msg result is : " + isSuccess);
           return;
       }
       
       AuthInfo authInfo = new AuthInfo(this, GameShare.SinaWeiboAppKey, GameShare.SinaWeiboRedirectUrl, GameShare.SinaWeiboScope);
       Oauth2AccessToken accessToken = GameShare.getAccessToken();
       String token = "";
       if (accessToken != null) {
           token = accessToken.getToken();   //读取保存过的token
       }
       
       boolean isSuccess = mWeiboShareAPI.sendRequest(this, request, authInfo, token, this);
       //Log.e("sinaweibo", "sinaweibo send share msg result is : " + isSuccess);
    }
    
  • 新浪用Web方式分享时,记得要保存验证过的token,否则每次启动游戏都会要用户登录微博
    @Override
    public void onWeiboException( WeiboException arg0 ) {
       Log.e("sinaweibo", "WeiboAuthListener onWeiboException: ");
       arg0.printStackTrace();
       GameShare.deleteImage();
       finish();
    }
    
    @Override
    public void onComplete( Bundle bundle ) {
       // TODO Auto-generated method stub
       Oauth2AccessToken newToken = Oauth2AccessToken.parseAccessToken(bundle);
       GameShare.setAccessToken(newToken);
    }
    
    @Override
    public void onCancel() {
       Log.e("sinaweibo", "WeiboAuthListener oncancel");
       GameShare.deleteImage();
       finish();
    }
    
  • 新浪微博的分享方式:必须通过开启新的WBShareActivity进行分享。
    Intent intent = new Intent(getContext(), com.share.demo.WBShareActivity.class);
    intent.putExtra("FILE_PATH", curImagePath);
    getContext().startActivity(intent);
    

总结:

android的配置很容易,但是配置完后遇到的坑还是很多的。


可能遇到的坑

微信的坑:

  • 图片路径问题,分享的本地图片一定要放在SDCARD的路径里面,如果截图后保存在/data/data/com.share.demo/files/文件夹下,必须把图片复制到SDCARD
  • 截图后的缩略图一定要保证大小<=32KB(32*1024)
    //保证thumbData.length <= 32*1024
    msg.thumbData = bmpToByteArray(thumbBmp, true);
    
  • AndroidManifest.xml里面配置的回调界面的包名前缀,一定要跟打出来的包名一样
  • 包名和签名一定要跟申请AppID时填写的一模一样

新浪微博的坑

  • 新浪微博的缩略图是自带的lib文件计算的,所以只要保证截图不是特别大就行
  • AndroidManifest.xml里面配置的回调界面的包名前缀,可以跟打出来的包名不要一样,但是如果不一样,回调回来时,不是退回应用,而是退到主界面(和Home键的效果一样)
  • AndroidManifest.xml里面配置的回调界面的包名前缀、包名和签名一定要存在申请AppKey时填写的信息中
  • 目前微博有几个已知BUG:
    • 用Web分享时,如果分享成功后,在等待关闭的3秒内,点左上角的关闭,那么只会收到取消分享的回调,而不是分享成功的回调
    • 用微博客户端分享时,如果是刚安装的微博(未登录),那么点击分享时,会要求用户登录微博,如果在此时关闭微博,那么退回应用时,会停留在开启的WBShareActivity界面(即没有收到任何回调)

游戏多渠道处理

查了好久资料,没有查到相关信息。所以只能用一些奇怪的办法。

  • 微博多渠道
    只要在申请AppKey的地方填写多个包名和签名,然后在AndroidManifest.xml里面配置一个回调界面。有个副作用就是,如果配置的包名前缀和当前包名不一样,那么回调回来后是退回到主界面,而不是应用。
  • 微信多渠道
    前面提到了配置多个WXEntryActivity,就是为了这个多渠道,在AndroidManifest.xml里面也要配置多个回调界面。然后通过包名向服务器取到正确的AppID后,再初始化微信Api。
如果大家有更好的多渠道方式,还请教教我,感谢感谢!~~~

--------------------------- 分割线 ---------------------------
更新时间:2016年12月16日14:23
工具:点我跳转
用这个工具查看了下《阴阳师》里面分享的代码,豁然开朗。


IOS新浪微博、微信分享:点我跳转

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容