Xamarin Android綁定微信SDK


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

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

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

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

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

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

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

 

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

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

<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>

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

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

 

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 替換為你的應用從官方網站申請到的合法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();
        }

        //網頁類型分享
        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官網";
            msg.Description = "官方網站描述";

            //分享的縮略圖
            Bitmap thumb = BitmapFactory.DecodeResource(this.Resources, Resource.Drawable.Icon);
            MemoryStream ms = new MemoryStream();
            thumb.Compress(Bitmap.CompressFormat.Png, 0, ms);
            byte[] bytes = ms.ToArray();

            //構造一個Req請求
            SendMessageToWX.Req req = new SendMessageToWX.Req();
            //唯一的請求標志
            req.Transaction = System.Guid.NewGuid().ToString();
            req.Message = msg;
            req.Scene = SendMessageToWX.Req.WXSceneTimeline;

            //發送數據
            api.SendReq(req);
        }

        //文字類型分享
        private void BtnText_Click(object sender, EventArgs e)
        {
            //初始化一個WXTextObject對象,填寫分享的文本內容
            WXTextObject textObj = new WXTextObject();
            textObj.Text = "Hello Xamarin";

            //用WXTextObject對象初始化一個WXMediaMessage對象
            WXMediaMessage msg = new WXMediaMessage();
            msg.MyMediaObject = textObj;
            msg.Description = "Hello World";

            //構造一個Req請求
            SendMessageToWX.Req req = new SendMessageToWX.Req();
            //唯一的請求標志
            req.Transaction = System.Guid.NewGuid().ToString();
            req.Message = msg;
            req.Scene = SendMessageToWX.Req.WXSceneSession;

            //發送數據
            api.SendReq(req);
        }

        // 將該app注冊到微信
        private void BtnRegister_Click(object sender, EventArgs e)
        {            
            var result = api.RegisterApp(APP_ID);
            Toast.MakeText(this, "注冊結果:" + result, ToastLength.Short).Show();
        }
    }
}

界面文件Main.axml

<?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="發送文字" />
    <Button
        android:id="@+id/btnHtml"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="發送網頁" />
    <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>

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

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM