1. 程式人生 > >關於微信sdk的注意事項與解決方案

關於微信sdk的注意事項與解決方案

不得不說,為了實現一個微信簡單的分享功能真的是浪費了我好多的時間,官方的文件說的什麼我也不做什麼評價,畢竟這個sdk是人家寫的,我學習這個sdk的重要方法就是在看那個給的那個官方的demo,就和學習百度雲推送一樣,我感覺我們要是可以理清了這個demo的基本思路,那麼我們就可以簡單了利用它來實現自己的東西了。我覺得最好的學習方法就是在原有的基礎上面改,畢竟人家那個例子是可以執行的,我們改一點看一點,只要是不改的太多基本就可以完美執行,這樣的話看到了自己改動的痕跡,我們學起來也有信心與興趣!好了廢話不多說,我這裡只是想說一下關於網頁分享的問題,如果學習過微信官方給的demo的話,那麼大家就一定會發現那個網頁的分享是不可用的,究其根本原因貌似是圖片轉化上面有點問題,感興趣的朋友可以去百度或者谷歌一下,就一定會有大神來給我們講解的!好了,下面我們就來看一下我的這個例子的實現。

畢竟大家都是有Android開發經驗的人了,對於佈局檔案什麼的,大家可以隨心所欲的實現,還有就是要在libs裡面加入微信的sdk,這個例子我做的也是特別好,就不在此班門弄斧了,直接上主程式碼:

package com.weixinshare.wxapi;


import com.tencent.mm.sdk.openapi.BaseReq;
import com.tencent.mm.sdk.openapi.BaseResp;
import com.tencent.mm.sdk.openapi.IWXAPI;
import com.tencent.mm.sdk.openapi.IWXAPIEventHandler;
import com.tencent.mm.sdk.openapi.SendMessageToWX;
import com.tencent.mm.sdk.openapi.WXAPIFactory;
import com.tencent.mm.sdk.openapi.WXMediaMessage;
import com.tencent.mm.sdk.openapi.WXWebpageObject;

import com.weixintest.R;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class WXEntryActivity extends Activity implements IWXAPIEventHandler{
	public static final String APP_ID = "wx6a4a9fd0f8322251";
	// IWXAPI 是第三方app和微信通訊的openapi介面
    private IWXAPI api;
	private Button gotoBtn;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.entry);
        
        // 通過WXAPIFactory工廠,獲取IWXAPI的例項
    	api = WXAPIFactory.createWXAPI(this, APP_ID, false);
    	
        gotoBtn = (Button) findViewById(R.id.button1);
        gotoBtn.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View v) {
				api.registerApp(APP_ID); 
				WXWebpageObject webpage = new WXWebpageObject();
				webpage.webpageUrl = "http://www.baidu.com";
				WXMediaMessage msg = new WXMediaMessage(webpage);
				msg.title = "我的測試";
				msg.description = "測試微信分享";
				try
				{
					Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.send_img);
					Bitmap thumbBmp = Bitmap.createScaledBitmap(bmp, 150, 150, true);
					bmp.recycle();
					msg.setThumbImage(thumbBmp);
				} 
				catch (Exception e)
				{
					e.printStackTrace();
				}
				SendMessageToWX.Req req = new SendMessageToWX.Req();
				req.transaction = String.valueOf(System.currentTimeMillis());
				req.message = msg;
				req.scene = SendMessageToWX.Req.WXSceneTimeline;
//				req.scene = isTimelineCb.isChecked() ? SendMessageToWX.Req.WXSceneTimeline : SendMessageToWX.Req.WXSceneSession;  
				api.sendReq(req);
			}
		});
    }
	// 微信傳送請求到第三方應用時,會回撥到該方法
	@Override
	public void onReq(BaseReq req) {
		
	}

	// 第三方應用傳送到微信的請求處理後的響應結果,會回撥到該方法
	@Override
	public void onResp(BaseResp resp) {
		String result;
		
		switch (resp.errCode) {
		case BaseResp.ErrCode.ERR_OK:
			result = "傳送成功";
			break;
		case BaseResp.ErrCode.ERR_USER_CANCEL:
			result = "傳送取消";
			break;
		case BaseResp.ErrCode.ERR_AUTH_DENIED:
			result = "傳送被拒絕";
			break;
		default:
			result = "傳送返回";
			break;
		}
		
		Toast.makeText(this, result, Toast.LENGTH_LONG).show();
	}

我感覺這具體的語法啥的無非就是這幾個物件的建立然後用req發出去,這裡我要講一下我的問題的所在,以至於我一度認為微信sdk有bug......

相信大家都知道,這個微信的驗證是很麻煩的,必須要求我們的程式的簽名,api_id和我們申請時候所填的包名必須一致才可以保證它的正常與執行。因為我在改自己的例子的時候吧,改包名那裡就只是簡單的用shift+alt+r更改了而已,然後我還特意的去我的workspace的資料夾發現這個例子的一層層的資料夾都變了就是先com->weixintest->wxapi,但是我在測試的是後無論怎樣都測試不了,我還以為是簽名的問題,於是在我的獲取簽名的手機軟體裡面輸入:com.weixintest 竟然告訴我,這個沒有簽名,我就更加撲朔迷離了,大家可以想象一下我當時的心情,我的確是用Android->tool生成的簽名apk啊,最後竟然告訴我沒有簽名,而且按照官方的說法我更改了包名就應該錯誤了吧,於是我又開啟一個新的微信Demo的例子(可以正常執行的官方的例子),用shift+alt+r的方法把那個net.resourceforge.simcpux更改為了com.share最後竟然還可以正常與執行

神奇的是我在獲取簽名的軟體中輸入:net.resourceforge.simcpux竟然獲取了預設的debug簽名,我在想我這裡也沒有這個包啊?於是感覺特別神奇,這時,我就在想是什麼讓我沒有該包呢,於是上網查了一下,發現改包的的方法還是我用的那個啊,這時候我無意的去看了一個關於解釋微信的sdk的部落格,我這才突然發現貌似也可以在manifest裡面改包,於是我就去看了一下我的manifest,竟然發現我的包名竟然沒有變化。。。。於是一切都明瞭了。。。然後我就在這裡更改了包名為了com.wexintest於是就ok了!

或許對於一些大神來說沒有遇到這用“二”的問題,由於我花費了很長時間才搞懂這個,就特地在此寫出來分享一下,也做個紀念吧!