之前做的微信分享活动,链接和内容是写死在客户端的,现在要改成能够从后台获取动态数据的版本。
活动页面如下:
点击立即邀请按钮,跳转到客户端的登录界面。
1.剪贴板的使用
点击复制按钮,讲文本框中的链接复制到系统的剪贴板中。方法很简单,在此贴出:
webview声明接口:
web.addJavascriptInterface(new JavaScriptToMobileInterface(),"JavaScriptToMobileInterface");
JavaScriptToMobileInterface接口的实现:
final class JavaScriptToMobileInterface {
JavaScriptToMobileInterface() {
}
@JavascriptInterface
public String getUserId() {
Log.d("powinandroid", "getUserId() method is invoked");
return Constant.userId;
}
@JavascriptInterface
public String getType(){
Log.d("powinandroid", "getType() method is invoked");
return Constant.INTERACTIVE_APPTYPE;
}
@JavascriptInterface
public void copy(String string){
Log.d("powinandroid", "copy() method is invoked");
ClipboardManager clipboard = (ClipboardManager)getSystemService(Context.CLIPBOARD_SERVICE);
ClipData clip = ClipData.newPlainText("shareURL",string);
clipboard.setPrimaryClip(clip);
tip("复制链接成功!");
}
}
然后再前端页面中,编写js方法判断有没有返回userId(即有没有登录)。若是没有登录(即userId为空),则执行confirm方法,跳转到登录界面:
@Override
public boolean onJsConfirm(WebView view, String url, String message,
final JsResult result) {
Intent loginIntent = new Intent(mContext, LoginActivity.class);
mContext.startActivity(loginIntent);
result.cancel();
return true;
}
登录之后会直接显示链接和复制按钮,复制的方法在上面的代码中能看到。
看下官方指南:http://developer.android.com/intl/zh-cn/guide/topics/text/copy-paste.html
中文版:http://www.cnblogs.com/mengdd/p/3572316.html
注意两点:
1.导包的时候
API 11之前: android.text.ClipboardManager
API 11之后: android.content.ClipboardManager
2.剪贴板每次仅会持有一个clip对象,当应用放另一个clip对象进来时,前一个就消失了。
其实这里我们用到的功能很简单,甚至一行代码就够用了:
clipboard.setText("String");
就可以了,但是setText这个方法已经不被官方推荐使用了,所以还是老老实实的用ClipData吧。
2.微信分享的完善
现在我们从接口获得微信分享的缩略图,链接,标题和描述,然后将这四个属性放在静态全局变量中,在点击下图按钮时,进行分享。
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch(v.getId()){
case R.id.sharetowx:
wxshare.SharedToWX(Constant.WXSHARE_TITLE, Constant.WXSHARE_DESCRIPTION, false, Constant.WXSHARE_WEBURL,Constant.WXSHARE_PICURL);
sharebody.dismiss();
break;
case R.id.sharetowz:
wxshare.SharedToWX(Constant.WXSHARE_TITLE, Constant.WXSHARE_DESCRIPTION, true, Constant.WXSHARE_WEBURL,Constant.WXSHARE_PICURL);
sharebody.dismiss();
break;
case R.id.sharecancel:
sharebody.dismiss();
break;
default:
break;
}
}
在官方给出的demo中,是没有图片url参数的,官方demo用的是本地图片,那么我们就进行改造,添加一个参数,放入图片url。
那么SharedToWX()这个方法也要进行相应的修改,在取得网络图片之后再进行分享。
由于在主线程中不能发起网络请求,所以我们要new一个。
/**
* 分享到微信好友/朋友圈
*/
public void SharedToWX(String title, String description, Boolean isShareZone, String weburl,String picUrl){
webpage = new WXWebpageObject();
webpage.webpageUrl = weburl;
msg = new WXMediaMessage(webpage);
msg.title = title;
msg.description = description;
this.isShareZone=isShareZone;
this.picUrl=picUrl;
getHttpBitmap();
}
public void getHttpBitmap() {
new Thread(){
@Override
public void run() {
try {
// 获得连接
HttpURLConnection conn = (HttpURLConnection) new URL(picUrl)
.openConnection();
// 设置超时时间为6000毫秒,conn.setConnectionTiem(0);表示没有时间限制
conn.setConnectTimeout(6000);
// 连接设置获得数据流
conn.setDoInput(true);
// 不使用缓存
conn.setUseCaches(false);
// 这句可有可无,没有影响
conn.connect();
// 得到数据流
InputStream is = conn.getInputStream();
// 解析得到图片
thumb = BitmapFactory.decodeStream(is);
// 关闭数据流
is.close();
handler.sendEmptyMessage(HandlerCASE.MSG_DONE);
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
}
Handler handler=new Handler(){
@Override
public void handleMessage(Message message) {
// TODO Auto-generated method stub
super.handleMessage(message);
switch (message.what) {
case HandlerCASE.MSG_DONE:
if (null==thumb) {
thumb = BitmapFactory.decodeResource(mcontext.getResources(), R.drawable.icon_share);
}
msg.thumbData = bmpToByteArray(thumb, true);
Log.d("getHttpBitmap", "msg.thumbData:"+msg.thumbData.length);
SendMessageToWX.Req req = new SendMessageToWX.Req();
req.transaction = buildTransaction("webpage");
req.message = msg;
req.scene = isShareZone ? SendMessageToWX.Req.WXSceneTimeline : SendMessageToWX.Req.WXSceneSession;
mapi.sendReq(req);
break;
default:
break;
}
}
};
显然能看到,步骤就是:获得数据流,转成Bitmap,bitmap再转成ByteArray,放到msg.thumbData中。如果没取到的话,那就还是用本地的图片。