現(xiàn)在幾乎所有的APP都集成了向微博,微信等社交平臺分享的功能。這些社交平臺官方也提供了SDK讓開發(fā)者使用,對于Android和IOS平臺而言,只需要下載官方的SDK,按照官方說明文檔進行集成就可以輕松實現(xiàn)了。

但是對于Xamarin來說,并沒有官方的SDK,這個時候就需要我們手動進行綁定了,首先從Android層開始,讓我們一步步實現(xiàn)如何在你自己的APP中集成微信SDK實現(xiàn)分享功能。

1. 在微信開放平臺官網(wǎng)https://open.weixin.qq.com/ 申請一個開發(fā)者賬號,填寫公司APP信息,通過審核。申請成功的APPID在項目中會使用到。然后下載官方的Android_SDK 下載地址

2. 新建一個Android綁定庫項目

平面設(shè)計培訓(xùn),網(wǎng)頁設(shè)計培訓(xùn),美工培訓(xùn),游戲開發(fā),動畫培訓(xùn)

 3. 把下載的官方SDK中的Jar包放在項目中的Jars文件夾中

平面設(shè)計培訓(xùn),網(wǎng)頁設(shè)計培訓(xùn),美工培訓(xùn),游戲開發(fā),動畫培訓(xùn)

記得修改Jar包的屬性為嵌入的Jar包,否則在真實項目中編譯時會報錯。

平面設(shè)計培訓(xùn),網(wǎng)頁設(shè)計培訓(xùn),美工培訓(xùn),游戲開發(fā),動畫培訓(xùn)

4. 這個時候進行編譯會報錯,不過別害怕我們定位到錯誤的地方發(fā)現(xiàn),原來是編譯器在把Jar包轉(zhuǎn)換為C#代碼時出現(xiàn)了重名的情況,這個類中有兩個ErrCode了。這樣可能是因為原來的Java代碼屬性的名字是errCode,在轉(zhuǎn)換為C#代碼時編譯器自動把首字母變?yōu)榇髮?,所以和后面的類ErrCode起了沖突。

平面設(shè)計培訓(xùn),網(wǎng)頁設(shè)計培訓(xùn),美工培訓(xùn),游戲開發(fā),動畫培訓(xùn)

 平面設(shè)計培訓(xùn),網(wǎng)頁設(shè)計培訓(xùn),美工培訓(xùn),游戲開發(fā),動畫培訓(xùn)

5. 出現(xiàn)了重名我們給他改個名字就可以了,打開項目文件Metadata.xml。這個文件是在把Jar包轉(zhuǎn)換成C#代碼時的配置文件,可以進行移除類,移除方法,修改字段名等操作,具體功能這里就不細說了有興趣的朋友可以研究一下Xamarin的官方文檔。

平面設(shè)計培訓(xùn),網(wǎng)頁設(shè)計培訓(xùn),美工培訓(xùn),游戲開發(fā),動畫培訓(xùn)

6. 添加如下代碼,在轉(zhuǎn)換時就會把名稱修改為我們指定的名字了。

平面設(shè)計培訓(xùn),網(wǎng)頁設(shè)計培訓(xùn),美工培訓(xùn),游戲開發(fā),動畫培訓(xùn)

<metadata> <!-- This sample removes the class: android.support.v4.content.AsyncTaskLoader.LoadTask: <remove-node path="/api/package[@name='android.support.v4.content']/class[@name='AsyncTaskLoader.LoadTask']" /> This sample removes the method: android.support.v4.content.CursorLoader.loadInBackground: <remove-node path="/api/package[@name='android.support.v4.content']/class[@name='CursorLoader']/method[@name='loadInBackground']" /> --> <attr path="/api/package[@name='com.tencent.mm.opensdk.modelmsg']/class[@name='WXMediaMessage']/field[@name='mediaObject']"       name="managedName">MyMediaObject</attr> <attr path="/api/package[@name='com.tencent.mm.opensdk.modelbase']/class[@name='BaseResp']/field[@name='errCode']"       name="managedName">MyErrCode</attr> </metadata>

平面設(shè)計培訓(xùn),網(wǎng)頁設(shè)計培訓(xùn),美工培訓(xùn),游戲開發(fā),動畫培訓(xùn)

再編譯一下,OK已經(jīng)成功生成了Android的綁定庫。接下來建立一個Android項目試一試效果。

平面設(shè)計培訓(xùn),網(wǎng)頁設(shè)計培訓(xùn),美工培訓(xùn),游戲開發(fā),動畫培訓(xùn)

7. 添加引用剛才的Android綁定庫,然后修改MainActivity.cs代碼

 平面設(shè)計培訓(xùn),網(wǎng)頁設(shè)計培訓(xùn),美工培訓(xùn),游戲開發(fā),動畫培訓(xùn)

平面設(shè)計培訓(xùn),網(wǎng)頁設(shè)計培訓(xùn),美工培訓(xùn),游戲開發(fā),動畫培訓(xùn)

using Android.App; using Android.Widget; using Android.OS; using Com.Tencent.MM.Opensdk.Openapi; using Com.Tencent.MM.Opensdk.Modelbase; using Com.Tencent.MM.Opensdk.Modelmsg; using System; using Android.Graphics; using System.IO; namespace WeChat.Android.Samples {     [Activity(Label = "WeChat.Android.Samples", MainLauncher = true, Icon = "@drawable/icon")]     public class MainActivity : Activity, IWXAPIEventHandler     {         // IWXAPI 是第三方app和微信通信的openapi接口         private IWXAPI api;         // APP_ID 替換為你的應(yīng)用從官方網(wǎng)站申請到的合法appId         public const string APP_ID = "wxd930ea5d5a258f4f";         //最小支持朋友圈的版本         private const int TIMELINE_SUPPORTED_VERSION = 0x21020001;         public void OnReq(BaseReq p0)         {             throw new NotImplementedException();         }         public void OnResp(BaseResp p0)         {             throw new NotImplementedException();         }         protected override void OnCreate(Bundle bundle)         {             base.OnCreate(bundle);             // Set our view from the "main" layout resource             SetContentView (Resource.Layout.Main);             // 通過WXAPIFactory工廠,獲取IWXAPI的實例             api = WXAPIFactory.CreateWXAPI(this, APP_ID, false);             Button btnRegister = FindViewById<Button>(Resource.Id.btnRegister);             btnRegister.Click += BtnRegister_Click;             Button btnText = FindViewById<Button>(Resource.Id.btnText);             btnText.Click += BtnText_Click;             Button btnHtml = FindViewById<Button>(Resource.Id.btnHtml);             btnHtml.Click += BtnHtml_Click;             Button btnOpenWeChat = FindViewById<Button>(Resource.Id.btnOpenWeChat);             btnOpenWeChat.Click += BtnOpenWeChat_Click;             Button btnIsMoments = FindViewById<Button>(Resource.Id.btnIsMoments);             btnIsMoments.Click += BtnIsMoments_Click;         }         //是否支持朋友圈         private void BtnIsMoments_Click(object sender, EventArgs e)         {             int wxSdkVersion = api.WXAppSupportAPI;             if (wxSdkVersion >= TIMELINE_SUPPORTED_VERSION)             {                 Toast.MakeText(this, "wxSdkVersion = " + wxSdkVersion + "\n支持", ToastLength.Long).Show();             }             else             {                 Toast.MakeText(this, "wxSdkVersion = " + wxSdkVersion + "\n不支持", ToastLength.Long).Show();             }         }         //打開微信APP         private void BtnOpenWeChat_Click(object sender, EventArgs e)         {             Toast.MakeText(this, "launch result = " + api.OpenWXApp(), ToastLength.Long).Show();         }         //網(wǎng)頁類型分享         private void BtnHtml_Click(object sender, EventArgs e)         {             WXWebpageObject webObj = new WXWebpageObject();             webObj.WebpageUrl = "https://www.xamarin.com/";             WXMediaMessage msg = new WXMediaMessage(webObj);             msg.Title = "Xamarin官網(wǎng)";             msg.Description = "官方網(wǎng)站描述";             //分享的縮略圖             Bitmap thumb = BitmapFactory.DecodeResource(this.Resources, Resource.Drawable.Icon);             MemoryStream ms = new MemoryStream();             thumb.Compress(Bitmap.CompressFormat.Png, 0, ms);             byte[] bytes = ms.ToArray();             //構(gòu)造一個Req請求             SendMessageToWX.Req req = new SendMessageToWX.Req();             //唯一的請求標志             req.Transaction = System.Guid.NewGuid().ToString();             req.Message = msg;             req.Scene = SendMessageToWX.Req.WXSceneTimeline;             //發(fā)送數(shù)據(jù)             api.SendReq(req);         }         //文字類型分享         private void BtnText_Click(object sender, EventArgs e)         {             //初始化一個WXTextObject對象,填寫分享的文本內(nèi)容             WXTextObject textObj = new WXTextObject();             textObj.Text = "Hello Xamarin";             //用WXTextObject對象初始化一個WXMediaMessage對象             WXMediaMessage msg = new WXMediaMessage();             msg.MyMediaObject = textObj;             msg.Description = "Hello World";             //構(gòu)造一個Req請求             SendMessageToWX.Req req = new SendMessageToWX.Req();             //唯一的請求標志             req.Transaction = System.Guid.NewGuid().ToString();             req.Message = msg;             req.Scene = SendMessageToWX.Req.WXSceneSession;             //發(fā)送數(shù)據(jù)             api.SendReq(req);         }         // 將該app注冊到微信         private void BtnRegister_Click(object sender, EventArgs e)         {                         var result = api.RegisterApp(APP_ID);             Toast.MakeText(this, "注冊結(jié)果:" + result, ToastLength.Short).Show();         }     } }

平面設(shè)計培訓(xùn),網(wǎng)頁設(shè)計培訓(xùn),美工培訓(xùn),游戲開發(fā),動畫培訓(xùn)

界面文件Main.axml

平面設(shè)計培訓(xùn),網(wǎng)頁設(shè)計培訓(xùn),美工培訓(xùn),游戲開發(fā),動畫培訓(xùn)

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"     android:orientation="vertical"     android:layout_width="match_parent"     android:layout_height="match_parent">     <Button         android:id="@+id/btnRegister"         android:layout_width="fill_parent"         android:layout_height="wrap_content"         android:text="將app注冊到微信" />     <Button         android:id="@+id/btnText"         android:layout_width="fill_parent"         android:layout_height="wrap_content"         android:text="發(fā)送文字" />     <Button         android:id="@+id/btnHtml"         android:layout_width="fill_parent"         android:layout_height="wrap_content"         android:text="發(fā)送網(wǎng)頁" />     <Button         android:id="@+id/btnOpenWeChat"         android:layout_width="fill_parent"         android:layout_height="wrap_content"         android:text="打開微信" />     <Button         android:id="@+id/btnIsMoments"         android:layout_width="fill_parent"         android:layout_height="wrap_content"         android:text="是否支持朋友圈" /> </LinearLayout>

平面設(shè)計培訓(xùn),網(wǎng)頁設(shè)計培訓(xùn),美工培訓(xùn),游戲開發(fā),動畫培訓(xùn)

8. 到現(xiàn)在為止工作都完成了,現(xiàn)在來調(diào)試一下,如果分享時出現(xiàn)閃退的話只需要將APP_ID修改為你在微信開放平臺注冊的就可以了。

平面設(shè)計培訓(xùn),網(wǎng)頁設(shè)計培訓(xùn),美工培訓(xùn),游戲開發(fā),動畫培訓(xùn)

最后附上Github源碼地址:https://github.com/vilyo/WeChatDemo

 

http://www.cnblogs.com/vilyo/p/7220393.html