Android微信SDK实现分享

用微信提供的SDK来实现分享

http://open.weixin.qq.com下载Android相关的jar包,将libammsdk.jar加入到项目中。

微信分享的核心类,部分代码如下:

WechatShareManager.java

package com.jackie.umeng.share;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.util.Log;
import android.widget.Toast;

import com.tencent.mm.sdk.modelmsg.SendMessageToWX;
import com.tencent.mm.sdk.modelmsg.WXImageObject;
import com.tencent.mm.sdk.modelmsg.WXMediaMessage;
import com.tencent.mm.sdk.modelmsg.WXTextObject;
import com.tencent.mm.sdk.modelmsg.WXVideoObject;
import com.tencent.mm.sdk.modelmsg.WXWebpageObject;
import com.tencent.mm.sdk.openapi.IWXAPI;
import com.tencent.mm.sdk.openapi.WXAPIFactory;
 
/**
 * 实现微信分享功能的核心类
 * @author chengcj1
 *
 */
public class WechatShareManager {
     
    private static final int THUMB_SIZE = 150;
    
    public static final int WECHAT_SHARE_WAY_TEXT = 1;   //文字
    public static final int WECHAT_SHARE_WAY_PICTURE = 2; //图片
    public static final int WECHAT_SHARE_WAY_WEBPAGE = 3;  //链接
    public static final int WECHAT_SHARE_WAY_VIDEO = 4; //视频
    public static final int WECHAT_SHARE_TYPE_TALK = SendMessageToWX.Req.WXSceneSession;  //会话
    public static final int WECHAT_SHARE_TYPE_FRENDS = SendMessageToWX.Req.WXSceneTimeline; //朋友圈
    
    private static WechatShareManager mInstance;
    private ShareContent mShareContentText, mShareContentPicture, mShareContentWebpag, mShareContentVideo;
    private IWXAPI mWXApi;
    private Context mContext;
     
    private WechatShareManager(Context context){
        this.mContext = context;
        //初始化数据
        //初始化微信分享代码
        initWechatShare(context);
    }
     
    /**
     * 获取WeixinShareManager实例
     * 非线程安全,请在UI线程中操作
     * @return
     */
    public static WechatShareManager getInstance(Context context){
        if(mInstance == null){
            mInstance = new WechatShareManager(context);
        }
        return mInstance;
    }
     
    private void initWechatShare(Context context){
    	if (mWXApi == null) {
    		mWXApi = WXAPIFactory.createWXAPI(context, WechatShareUtil.WECHAT_APP_ID, true);
    	}
        mWXApi.registerApp(WechatShareUtil.WECHAT_APP_ID);
    }
     
    /**
     * 通过微信分享
     * @param shareWay 分享的方式(文本、图片、链接)
     * @param shareType 分享的类型(朋友圈,会话)
     */
    public void shareByWebchat(ShareContent shareContent, int shareType){
        switch (shareContent.getShareWay()) {
        case WECHAT_SHARE_WAY_TEXT:
            shareText(shareContent, shareType);
            break;
        case WECHAT_SHARE_WAY_PICTURE:
            sharePicture(shareContent, shareType);
            break;
        case WECHAT_SHARE_WAY_WEBPAGE:
            shareWebPage(shareContent, shareType);
            break;
        case WECHAT_SHARE_WAY_VIDEO:
        	shareVideo(shareContent, shareType);
        	break;
        }
    }
     
    private abstract class ShareContent {
        protected abstract int getShareWay();
        protected abstract String getContent();
        protected abstract String getTitle();
        protected abstract String getURL();
        protected abstract int getPictureResource();
    }
     
    /**
     * 设置分享文字的内容
     * @author chengcj1
     *
     */
    public class ShareContentText extends ShareContent {
        private String content;
         
        /**
         * 构造分享文字类
         * @param text 分享的文字内容
         */
        public ShareContentText(String content){
            this.content = content;
        }
        
        @Override
        protected int getShareWay() {
            return WECHAT_SHARE_WAY_TEXT;
        }
 
        @Override
        protected String getContent() {
            return content;
        }
 
        @Override
        protected String getTitle() {
            return null;
        }
 
        @Override
        protected String getURL() {
            return null;
        }
 
        @Override
        protected int getPictureResource() {
            return -1;
        }
    }
    
    /*
     * 获取文本分享对象
     */
    public ShareContent getShareContentText(String content) {
    	if (mShareContentText == null) {
    		mShareContentText = new ShareContentText(content);
    	}
    	return (ShareContentText) mShareContentText;
    }
     
    /**
     * 设置分享图片的内容
     * @author chengcj1
     *
     */
    public class ShareContentPicture extends ShareContent {
        private int pictureResource;
        public ShareContentPicture(int pictureResource){
            this.pictureResource = pictureResource;
        }
        
        @Override
        protected int getShareWay() {
            return WECHAT_SHARE_WAY_PICTURE;
        }
        
        @Override
        protected int getPictureResource() {
            return pictureResource;
        }
         
        @Override
        protected String getContent() {
            return null;
        }
 
        @Override
        protected String getTitle() {
            return null;
        }
 
        @Override
        protected String getURL() {
            return null;
        }
    }
    
    /*
     * 获取图片分享对象
     */
    public ShareContent getShareContentPicture(int pictureResource) {
    	if (mShareContentPicture == null) {
    		mShareContentPicture = new ShareContentPicture(pictureResource);
    	}
    	return (ShareContentPicture) mShareContentPicture;
    }
     
    /**
     * 设置分享链接的内容
     * @author chengcj1
     *
     */
    public class ShareContentWebpage extends ShareContent {
        private String title;
        private String content;
        private String url;
        private int pictureResource;
        public ShareContentWebpage(String title, String content, String url, int pictureResource){
            this.title = title;
            this.content = content;
            this.url = url;
            this.pictureResource = pictureResource;
        }
        
        @Override
        protected int getShareWay() {
            return WECHAT_SHARE_WAY_WEBPAGE;
        }
 
        @Override
        protected String getContent() {
            return content;
        }
 
        @Override
        protected String getTitle() {
            return title;
        }
 
        @Override
        protected String getURL() {
            return url;
        }
 
        @Override
        protected int getPictureResource() {
            return pictureResource;
        }
    }
    
    /*
     * 获取网页分享对象
     */
    public ShareContent getShareContentWebpag(String title, String content, String url, int pictureResource) {
    	if (mShareContentWebpag == null) {
    		mShareContentWebpag = new ShareContentWebpage(title, content, url, pictureResource);
    	}
    	return (ShareContentWebpage) mShareContentWebpag;
    }
    
    /**
     * 设置分享视频的内容
     * @author chengcj1
     *
     */
    public class ShareContentVideo extends ShareContent {
    	private String url;
    	public ShareContentVideo(String url) {
    		this.url = url;
    	}

		@Override
		protected int getShareWay() {
			return WECHAT_SHARE_WAY_VIDEO;
		}

		@Override
		protected String getContent() {
			return null;
		}

		@Override
		protected String getTitle() {
			return null;
		}

		@Override
		protected String getURL() {
			return url;
		}

		@Override
		protected int getPictureResource() {
			return -1;
		}
    }
    
    /*
     * 获取视频分享内容
     */
    public ShareContent getShareContentVideo(String url) {
    	if (mShareContentVideo == null) {
    		mShareContentVideo = new ShareContentVideo(url);
    	}
    	return (ShareContentVideo) mShareContentVideo;
    } 
     
    /*
     * 分享文字
     */
    private void shareText(ShareContent shareContent, int shareType) {
        String text = shareContent.getContent();
        //初始化一个WXTextObject对象
        WXTextObject textObj = new WXTextObject();
        textObj.text = text;
        //用WXTextObject对象初始化一个WXMediaMessage对象
        WXMediaMessage msg = new WXMediaMessage();
        msg.mediaObject = textObj;
        msg.description = text;
        //构造一个Req
        SendMessageToWX.Req req = new SendMessageToWX.Req();
        //transaction字段用于唯一标识一个请求
        req.transaction = buildTransaction("textshare");
        req.message = msg;
        //发送的目标场景, 可以选择发送到会话 WXSceneSession 或者朋友圈 WXSceneTimeline。 默认发送到会话。
        req.scene = shareType;
        mWXApi.sendReq(req);
    }
 
    /*
     * 分享图片
     */
    private void sharePicture(ShareContent shareContent, int shareType) {
        Bitmap bitmap = BitmapFactory.decodeResource(mContext.getResources(), shareContent.getPictureResource());
        WXImageObject imgObj = new WXImageObject(bitmap);
         
        WXMediaMessage msg = new WXMediaMessage();
        msg.mediaObject = imgObj;
         
        Bitmap thumbBitmap =  Bitmap.createScaledBitmap(bitmap, THUMB_SIZE, THUMB_SIZE, true);
        bitmap.recycle();
        msg.thumbData = Util.bmpToByteArray(thumbBitmap, true);  //设置缩略图
         
        SendMessageToWX.Req req = new SendMessageToWX.Req();
        req.transaction = buildTransaction("imgshareappdata");
        req.message = msg;
        req.scene = shareType;
        mWXApi.sendReq(req);
    }
 
    /*
     * 分享链接
     */
    private void shareWebPage(ShareContent shareContent, int shareType) {
        WXWebpageObject webpage = new WXWebpageObject();
        webpage.webpageUrl = shareContent.getURL();
        WXMediaMessage msg = new WXMediaMessage(webpage);
        msg.title = shareContent.getTitle();
        msg.description = shareContent.getContent();
         
        Bitmap thumb = BitmapFactory.decodeResource(mContext.getResources(), shareContent.getPictureResource());
        if(thumb == null) {
            Toast.makeText(mContext, "图片不能为空", Toast.LENGTH_SHORT).show();
        } else {
            msg.thumbData = Util.bmpToByteArray(thumb, true);
        }
         
        SendMessageToWX.Req req = new SendMessageToWX.Req();
        req.transaction = buildTransaction("webpage");
        req.message = msg;
        req.scene = shareType;
        mWXApi.sendReq(req);
    }
    
    /*
     * 分享视频
     */
    private void shareVideo(ShareContent shareContent, int shareType) {
    	WXVideoObject video = new WXVideoObject();
		video.videoUrl = shareContent.getURL();

		WXMediaMessage msg = new WXMediaMessage(video);
		msg.title = shareContent.getTitle();
		msg.description = shareContent.getContent();
		Bitmap thumb = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.send_music_thumb);
//		BitmapFactory.decodeStream(new URL(video.videoUrl).openStream());
		/**
		 * 测试过程中会出现这种情况,会有个别手机会出现调不起微信客户端的情况。造成这种情况的原因是微信对缩略图的大小、title、description等参数的大小做了限制,所以有可能是大小超过了默认的范围。
		 * 一般情况下缩略图超出比较常见。Title、description都是文本,一般不会超过。
		 */
		Bitmap thumbBitmap =  Bitmap.createScaledBitmap(thumb, THUMB_SIZE, THUMB_SIZE, true);
		thumb.recycle();
      msg.thumbData = Util.bmpToByteArray(thumbBitmap, true);
        
		SendMessageToWX.Req req = new SendMessageToWX.Req();
		req.transaction = buildTransaction("video");
		req.message = msg;
		req.scene =  shareType;
		mWXApi.sendReq(req);
    }
     
    private String buildTransaction(final String type) {
        return (type == null) ? String.valueOf(System.currentTimeMillis()) : type + System.currentTimeMillis();
    }
}
MainActivity.java

package com.jackie.umeng.share;

import com.jackie.umeng.share.WechatShareManager.ShareContentPicture;
import com.jackie.umeng.share.WechatShareManager.ShareContentText;
import com.jackie.umeng.share.WechatShareManager.ShareContentVideo;

import android.app.Activity;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity implements OnClickListener {
	private Button mShareText, mSharePicture, mShareVideo;
	private WechatShareManager mShareManager; 
	
	private Context mContext;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		mShareText = (Button) findViewById(R.id.share_text);
		mSharePicture = (Button) findViewById(R.id.share_picture);
		mShareVideo = (Button) findViewById(R.id.share_video);
		mShareText.setOnClickListener(this);
		mSharePicture.setOnClickListener(this);
		mShareVideo.setOnClickListener(this);
		
		mContext = this;
		
		mShareManager = WechatShareManager.getInstance(mContext);
	}

	@Override
	public void onClick(View v) {
		if (!isWebchatAvaliable()) {
			Toast.makeText(mContext, "请先安装微信", Toast.LENGTH_LONG).show();
			return;
		}
		switch (v.getId()) {
		case R.id.share_text:
			ShareContentText mShareContentText = (ShareContentText) mShareManager.getShareContentText("微信文本分享");
			mShareManager.shareByWebchat(mShareContentText, WechatShareManager.WECHAT_SHARE_TYPE_FRENDS);
			break;
		case R.id.share_picture:
			ShareContentPicture mShareContentPicture = (ShareContentPicture) mShareManager.getShareContentPicture(R.drawable.share);
			mShareManager.shareByWebchat(mShareContentPicture, WechatShareManager.WECHAT_SHARE_TYPE_FRENDS);
		    break;
		case R.id.share_video:
			ShareContentVideo mShareContentVideo = (ShareContentVideo) mShareManager.getShareContentVideo("http://baidu.hz.letv.com/kan/agSlT?fr=v.baidu.com/");
			mShareManager.shareByWebchat(mShareContentVideo, WechatShareManager.WECHAT_SHARE_TYPE_FRENDS);
			break;
		default:
			break;
		}
	}
	
	private boolean isWebchatAvaliable() {
		//检测手机上是否安装了微信
		try {
			getPackageManager().getPackageInfo("com.tencent.mm", PackageManager.GET_ACTIVITIES);
			return true;
		} catch (Exception e) {
			return false;
		}
	}
}




  • 6
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 20
    评论
### 回答1: Android 微信支付 SDK 的对调打印主要是指在开发过程中,使用 SDK 提供的接口进行支付功能的调试和输出日志信息。 对调打印的目的是为了方便开发人员在开发过程中进行调试和定位问题。在使用微信支付 SDK 进行支付功能开发时,可以通过在关键代码位置添加打印语句,用于输出相关的调试信息,以便于分析和调试。 在对调打印中,可以根据需要打印的信息进行选择,如订单号、支付结果、微信支付 SDK 的版本等。一般来说,在支付请求发送之前和支付结果回调之后的关键阶段打印信息较多,可以通过打印语句输出相关的请求参数和回调结果,以便于了解支付流程和排查可能出现的问题。 在使用 Android 微信支付 SDK 进行对调打印时,需要注意以下几点: 1. 确保在正确的位置插入打印语句,一般在关键代码处添加,如支付请求发送前、支付结果回调等。 2. 打印的信息要具有可读性,可以输出关键参数的值、状态信息等,便于分析和定位问题。 3. 在实际发布应用之前,需要及时去除对调打印相关的代码,以避免信息泄露和代码冗余。 总之,通过对调打印的使用,开发人员能够更方便地进行支付功能的开发和调试,及时排查问题并优化代码,提高应用的支付体验。 ### 回答2: Android微信支付SDK是一种用于在Android应用程序中集成微信支付功能的开发工具包。在进行对调打印时,主要有以下几个步骤: 首先,你需要确认你的开发环境已经配置好,包括Android Studio和相关的开发工具包。接下来,在微信开放平台注册一个开发者账号,并创建一个应用,获得相应的AppID和AppSecret。 然后,你需要下载并导入微信支付SDK到你的Android项目中。可以通过在项目的build.gradle文件中添加相关依赖来导入SDK。然后,在你的项目中创建一个用于处理支付结果的回调类。 接着,你需要在你的应用中添加调起微信支付的代码。首先,你需要获取一个用于支付的预支付订单号,并根据微信支付要求对订单进行签名处理。然后,你可以使用WXAPIFactory工厂类的createWXAPI方法创建一个WXAPI对象,并将AppID注册到该对象上。 最后,在调起支付的时候,你需要构建一个PayReq对象,并将必要的支付参数设置到该对象中。然后,调用WXAPI的sendReq方法,将PayReq对象发送给微信客户端进行支付。支付结果将通过之前注册的回调类返回给你的应用。 总结起来,对调打印的过程包括了注册微信开放平台账号,导入微信支付SDK实现支付结果回调,创建并注册WXAPI对象,构建并发送PayReq对象。通过以上步骤,你的Android应用就可以使用微信支付功能了。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值