一。 首先是AndroidManifest
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.MANAGE_ACCOUNTS"/>
<uses-permission android:name="android.permission.GET_ACCOUNTS"/>
<!-- 分享 -->
<activity
android:name="cn.sharesdk.framework.ShareSDKUIShell"
android:configChanges="keyboardHidden|orientation|screenSize"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:windowSoftInputMode="stateHidden|adjustResize" >
<intent-filter>
<data android:scheme="tencent100371282" />
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<!-- 微信分享回调 -->
<activity
android:name="cn.sharesdk.demo.wxapi.WXEntryActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:exported="true"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.Translucent.NoTitleBar" />
二 。 shareSDK 配置文件和资源文件
三. 主要代码实现
private static String testImage;
private static final String FILE_NAME = "/lifebao.jpg";
public static void initImagePath(final Context mContext) {
try {
String cachePath = cn.sharesdk.framework.utils.R.getCachePath(mContext, null);
testImage = cachePath + FILE_NAME;
File file = new File(testImage);
if (!file.exists()) {
file.createNewFile();
Bitmap pic = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.ic_launcher);
FileOutputStream fos = new FileOutputStream(file);
pic.compress(CompressFormat.JPEG, 100, fos);
fos.flush();
fos.close();
}
} catch (Throwable t) {
t.printStackTrace();
testImage = null;
}
}
public static void initOnekeyShare(final Context mContext, final String url, final String code) {
OnekeyShare oks = new OnekeyShare();
oks.setAddress("12345678901");
oks.setTitle(mContext.getString(R.string.share));
oks.setTitleUrl(url);
oks.setText("注册会员即送5元新人现金红包,注册时输入邀请码:" + code + "领取。首次充值再送10元现金红包,更多好礼请关注海控life宝公众号。 " + url);
oks.setImagePath(testImage);
oks.setImageUrl("http://img.appgo.cn/imgs/sharesdk/content/2013/07/25/1374723172663.jpg");
oks.setUrl(url);
oks.setFilePath(testImage);
oks.setComment(mContext.getString(R.string.share));
oks.setSite(mContext.getString(R.string.app_name));
oks.setVenueName("ShareSDK");
oks.setVenueDescription("This is a beautiful place!");
oks.setLatitude(23.056081f);
oks.setLongitude(113.385708f);
oks.disableSSOWhenAuthorize();
oks.setShareContentCustomizeCallback(new ShareContentCustomizeCallback() {
@Override
public void onShare(final Platform platform, final ShareParams paramsToShare) {
// 改写twitter分享内容中的text字段,否则会超长,
// 因为twitter会将图片地址当作文本的一部分去计算长度
// if ("Twitter".equals(platform.getName())) {
// paramsToShare.setText(platform.getContext().getString(R.string.share_content_short));
// }
}
});
oks.show(mContext);
final Handler mmhandler = new Handler() {
@Override
public void handleMessage(final android.os.Message msg) {
switch (msg.what) {
case 1:
Toast.makeText(mContext, "尚未安装,请安装微信客户端", 0).show();
break;
default:
break;
}
};
};
oks.setCallback(new PlatformActionListener() {
@Override
public void onCancel(final Platform arg0, final int arg1) {
Log.i("---------------------", "onCancel");
}
@Override
public void onComplete(final Platform arg0, final int arg1, final HashMap<String, Object> arg2) {
Log.i("---------------------", "onComplete");
}
@Override
public void onError(final Platform arg0, final int arg1, final Throwable arg2) {
Log.i("---------------------", "onError");
if (arg2.toString().equals("cn.sharesdk.wechat.utils.WechatClientNotExistException")) {
new Thread() {
@Override
public void run() {
try {
mmhandler.sendEmptyMessage(1);
} catch (Exception e) {
e.printStackTrace();
}
};
}.start();
}
}
});
}
四。 调试过程遇到的问题
1. 遇到 “分享正在后台操作提示语”,搜索 “ sharing”,去掉提示方法即可
2 . 发现用sharesdk,做其他平台分享很快;如新浪微博、腾讯微博、有道云笔记、开心网、Google+等等,几句代码就搞定; 但是微信有点麻烦,下面我把如何解决问题说一下,方便其他开发者参考。
微信测试时,需要打包,签名是在微信开发平台注册应用时填写“应用签名”的keystore。
进过反复测试,发现微信现在的机制是:
没有审核通过的,只能调用一次;
如果要测试,需要清除微信的缓存;
或者注册多个应用账号,然后在assets文件夹中替换微信的配置id;
审核过了,就可以很方便测试。
集成sharesdk,做微信分享时,要先确定几个流程是否有问题。
1、现在微信开发平台注册应用,然后在assets/ShareSDKDevInfor,修改微信的配置信息
2、添加微信的回调activity,然后再manifest中注册
3、分享的参数可以参考Sample项目中,WechatPage这个类;
由于不同的分享类型,对参数要求不一样,一定要严格对比;否则调用不了微信客户端
如,SHARE_TEXT,要求要title和text
SHARE_WEBPAGE,要求要title、text、url、thumbPath
等等很多分享类型,基本title和text是必须的
4、测试时,要打包,用在微信平台注册时的签名(keystore)去打包
此时会弹出一个导出签名apk的窗口,输入您应用正式签名和密码以后,会在导出页面中,显示您签名的MD5值。将其复制出来,调整为小写,并去除多余的分隔符。
5、测试是否可以打开微信客户端,可以的话,说明代码基本没有问题;
如果要多次测试微信分享,可以清除微信客户端的缓存,不然只能调用一次