用的各平台原生的分享SDK,未采用第三方集成的SDK(例如ShareSDK、友盟U-Share等)。
原因有三:
- 不想暴露自己的AppKey、AppID等信息给第三方;
- 第三方集成的原生SDK可能不是最新的,或者是排版不对;
- 遇到奇怪问题的时候,于第三方客服沟通,有时会解决不了;
注意事项:
- 最好是先注册好账号,申请相应的AppKey或AppID;
- ANDROID的坑贼多,做好心理准备;
1. SDK文件相关配置
- 下载相关SDK,将SDK文件放到对应的lib文件夹(按自己项目的lib文件夹来)下,如下图:
微信:libammsdk.jar
新浪微博:libweibosdkcore.so
,weiboSDKCore_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
工具:点我跳转
用这个工具查看了下《阴阳师》里面分享的代码,豁然开朗。