前言

趁著失業(yè)了,閑著沒事兒學(xué)習(xí)了下Xamarin.Android binding,在以往的開發(fā)中,我相信很多人都遇到過binding的坑,也不例外,

我也踩了很多雷,好在認識了個大佬,指導(dǎo)了很多  電腦培訓(xùn),計算機培訓(xùn),平面設(shè)計培訓(xùn),網(wǎng)頁設(shè)計培訓(xùn),美工培訓(xùn),Web培訓(xùn),Web前端開發(fā)培訓(xùn) !

在做這個工作前,我上網(wǎng)搜索了一下關(guān)于binding的文章,也有,但是比較少,而且文章都是一兩年前,很多SDK都更新了很多代了,

按照他們之前的一些做法就會有問題。

我嘗試綁定了微信SDK、支付寶SDK、百度地圖SDK,在大神幫助下,一步一步綁定成功了。

而且我相信這幾個SDK在開發(fā)中用到的概率也還是很大的,所以特此分享下綁定遇到的坑,也為了更好的記錄自己遇到的問題。

話不多說,直接上代碼。

百度地圖SDK綁定

1.準備工作:下載百度android開發(fā)包,畢竟工欲善其事必先利其器,地址:http://lbsyun.baidu.com/sdk/download?selected=mapsdk_basicmap,mapsdk_searchfunction,mapsdk_lbscloudsearch,mapsdk_calculationtool

2.開發(fā)環(huán)境,這里就不講解開發(fā)環(huán)境搭建了。我這兒的環(huán)境的是VS2017+win10,后續(xù)的兩個綁定都是如此。

3.Binding:

3.1 新建安卓bingding工程

電腦培訓(xùn),計算機培訓(xùn),平面設(shè)計培訓(xùn),網(wǎng)頁設(shè)計培訓(xùn),美工培訓(xùn),Web培訓(xùn),Web前端開發(fā)培訓(xùn)

3.2 將下載的壓縮包解壓,然后把里面的jar包以及so文件放到以下目錄

電腦培訓(xùn),計算機培訓(xùn),平面設(shè)計培訓(xùn),網(wǎng)頁設(shè)計培訓(xùn),美工培訓(xùn),Web培訓(xùn),Web前端開發(fā)培訓(xùn)

這里的so文件就是為不同的cup架構(gòu)提供的指令集

3.3 接下來就是設(shè)置jar、so文件的屬性,按照如下設(shè)置

電腦培訓(xùn),計算機培訓(xùn),平面設(shè)計培訓(xùn),網(wǎng)頁設(shè)計培訓(xùn),美工培訓(xùn),Web培訓(xùn),Web前端開發(fā)培訓(xùn)

電腦培訓(xùn),計算機培訓(xùn),平面設(shè)計培訓(xùn),網(wǎng)頁設(shè)計培訓(xùn),美工培訓(xùn),Web培訓(xùn),Web前端開發(fā)培訓(xùn)

3.4接下來就是編譯,不出意外會出現(xiàn)以下錯誤

電腦培訓(xùn),計算機培訓(xùn),平面設(shè)計培訓(xùn),網(wǎng)頁設(shè)計培訓(xùn),美工培訓(xùn),Web培訓(xùn),Web前端開發(fā)培訓(xùn)

錯誤的意思就是字段名稱和類名重復(fù)了才導(dǎo)致編譯不過,那么接下來怎么辦呢,這就需要我們手動配置這些字段名稱,畢竟VS再智能也會有綁定不對的時候??!

打開文件Metadata.xml文件,加入以下代碼。

<attr path="/api/package[@name='com.baidu.location']/class[@name='Address']/field[@name='address']" name="name">AddressInfo</attr>  <attr path="/api/package[@name='com.baidu.mapapi']/class[@name='VersionInfo']/field[@name='VERSION_INFO']" name="name">VersionInformation</attr><attr path="/api/package[@name='com.baidu.platform.comapi.map']/class[@name='B']/field[@name='b']" name="name">BField</attr><attr path="/api/package[@name='com.baidu.platform.comapi.map']/class[@name='E']/field[@name='e']" name="name">EField</attr>

 

這里的意思呢就是講這些字段名稱重命名,Metadata.xml還可以去除某些類或字段,設(shè)置某些函數(shù)的返回值之類的。Metadata.xml更多的用法的話,可以參考https://developer.xamarin.com/guides/android/advanced_topics/binding-a-java-library/customizing-bindings/java-bindings-metadata/。主要全是英文,我英文能力也差,估計翻譯出來大家都會吐槽,還不如自己看。

然后再編譯就沒有問題了,說一下,百度地圖我編譯的環(huán)境是在jdk1.8+安卓目標平臺7.0下編譯的。

然后我照著百度地圖提供的DEMO寫了個示例

關(guān)鍵代碼:

SDKInitializer.Initialize(ApplicationContext);
            SetContentView(Resource.Layout.Main);
            mapView = FindViewById<MapView>(Resource.Id.mapView);
            currentLocationMode = LocationMode.Normal;            var baiduMap = mapView.Map;            //定義Maker坐標點  
            LatLng point = new LatLng(30.691359, 104.052236);            //構(gòu)建Marker圖標  
            BitmapDescriptor bitmap = BitmapDescriptorFactory.FromResource(Resource.Drawable.marker);            //構(gòu)建MarkerOption,用于在地圖上添加Marker  
            OverlayOptions option = new MarkerOptions().InvokePosition(point).InvokeIcon(bitmap);            //在地圖上添加Marker,并顯示              baiduMap.AddOverlay(option);
            baiduMap.MyLocationEnabled = true;

更多的用法的話,參照百度地圖的API

代碼的話,別急,會在最后給出GITHub的地址。

效果圖:

電腦培訓(xùn),計算機培訓(xùn),平面設(shè)計培訓(xùn),網(wǎng)頁設(shè)計培訓(xùn),美工培訓(xùn),Web培訓(xùn),Web前端開發(fā)培訓(xùn)

 在調(diào)用百度地圖的時候,需要配置你的APK簽名的sha1值,調(diào)試的時候呢,都是用的這個目錄下的 C:\Users\HuShuai\AppData\Local\Xamarin\Mono for Android

 debug.keystore來簽名的,然后需要獲取它的sha1值,推薦一個好用的工具,而且非常簡單的,詳情請看: http://bbs.lbsyun.baidu.com/forum.php?mod=viewthread&tid=106461&qq-pf-to=pcqq.group.

 可以通過命令行來獲取 Keytool -list -v -keystore "C:\Users\用戶名\AppData\Local\Xamarin\Mono for Android\debug.keystore" -alias androiddebugkey -storepass android -keypass android。

 但是這個有時候好像不太管用, 比如我就沒有獲取到,不如第一種方式簡單暴力。

支付寶SDK綁定

有了前面的百度地圖綁定示例,后面的兩個綁定基本都類似了,無非就是修修改改編譯不過的問題。

SDK下載地址:https://doc.open.alipay.com/doc2/detail.htm?treeId=54&articleId=104509&docType=1

But支付寶稍微有點兒不一樣:

一開始編譯的話,應(yīng)該會提示以下錯誤

電腦培訓(xùn),計算機培訓(xùn),平面設(shè)計培訓(xùn),網(wǎng)頁設(shè)計培訓(xùn),美工培訓(xùn),Web培訓(xùn),Web前端開發(fā)培訓(xùn)

全部提示不能強制轉(zhuǎn)換類RpcException為java.lang.object

按照上一個綁定的經(jīng)驗來綁定的話,完全懵逼了,根本沒法弄。But可以這樣

將轉(zhuǎn)換的地方,直接修改成 this.Handle

類似下面這樣

電腦培訓(xùn),計算機培訓(xùn),平面設(shè)計培訓(xùn),網(wǎng)頁設(shè)計培訓(xùn),美工培訓(xùn),Web培訓(xùn),Web前端開發(fā)培訓(xùn)

接下來就是把里面轉(zhuǎn)換的地方都改完,然后把里面的內(nèi)容全部復(fù)制,新建一個名字為RpcException的類

然后把內(nèi)容粘貼進去,新建的類放在 Additions 這個文件夾中。

然后就是在Metadata.xml里面加入一下代碼

<remove-node path="/api/package[@name='com.alipay.android.phone.mrpc.core']/class[@name='RpcException']" />

這里的意思呢就是刪除banding自動給我們生成的類,而我們的 Additions  文件夾呢則是存放用戶自定義的內(nèi)容,在編譯的時候則會把我們添加的內(nèi)容一起編譯進去。

然后就是自己寫了一個支付demo,只能跳轉(zhuǎn)到支付界面以及調(diào)用H5頁面支付界面,沒有測試是否能夠真的支付成功,主要是沒有如果要測試的話,還需要部署套測試環(huán)境才行。如果那位測試可以支付的話,請給博主留言,謝謝了。

調(diào)用H5支付頁面的話,需要在AndroidManifest.xml文件中加入以下節(jié)點:

<activity android:name="com.alipay.sdk.app.H5PayActivity" android:configChanges="orientation|keyboardHidden|navigation" android:exported="false" android:screenOrientation="behind"></activity>
    <activity android:name="com.alipay.sdk.auth.AuthActivity" android:configChanges="orientation|keyboardHidden|navigation" android:exported="false" android:screenOrientation="behind"></activity>

效果圖:

電腦培訓(xùn),計算機培訓(xùn),平面設(shè)計培訓(xùn),網(wǎng)頁設(shè)計培訓(xùn),美工培訓(xùn),Web培訓(xùn),Web前端開發(fā)培訓(xùn)

微信SDK綁定

微信SDK下載地址:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=11_1

還是按照之前的操作,將jar文件復(fù)制到 Jars 文件夾里,設(shè)置編譯屬性為 EmbeddedJar

這里呢說一下博主在綁定過程中 遇到的坑:

                                                                             電腦培訓(xùn),計算機培訓(xùn),平面設(shè)計培訓(xùn),網(wǎng)頁設(shè)計培訓(xùn),美工培訓(xùn),Web培訓(xùn),Web前端開發(fā)培訓(xùn)

一開始編譯的時候,提示名稱重復(fù),我心想so easy,這難道不我啊,畢竟有兩個綁定的經(jīng)驗了,然后就再Metadata.xml添加了如下兩句代碼:

<attr path="/api/package[@name='com.tencent.mm.opensdk.modelbase']/class[@name='BaseResp']/field[@name='errCode']" name="managedName">errCode</attr>
  <attr path="/api/package[@name='com.tencent.mm.opensdk.modelmsg']/class[@name='WXMediaMessage']/field[@name='mediaObject']" name="managedName">mediaObject</attr>

而且也如預(yù)期一樣編譯成功了,心想這不是多難啊。然后就想照著這個 文章  這樣寫個支付Demo,寫著寫著,準備用到 PayReq 這個類的時候,結(jié)果發(fā)現(xiàn)如何引用都找不到它,這就尷尬了。

我反編譯看了下微信SDK源碼,

電腦培訓(xùn),計算機培訓(xùn),平面設(shè)計培訓(xùn),網(wǎng)頁設(shè)計培訓(xùn),美工培訓(xùn),Web培訓(xùn),Web前端開發(fā)培訓(xùn)

我發(fā)現(xiàn)是有這個類的,但是為什么綁定沒有呢? 我又在綁定項目工程下的目錄去查看了生成的類文件,結(jié)果也沒有叫做 PayReq的類

電腦培訓(xùn),計算機培訓(xùn),平面設(shè)計培訓(xùn),網(wǎng)頁設(shè)計培訓(xùn),美工培訓(xùn),Web培訓(xùn),Web前端開發(fā)培訓(xùn)

What ? 這咋辦呢,然后看了下警告信息,發(fā)現(xiàn)是這個類不能正確映射,然后就缺失了,但是這咋辦呢?翻了一下午的Xamarin論壇,又全是英文,也沒有找到什么有效的解決辦法,But 我最前面說認識了個大佬啊,不懂就請教啊。

大佬告訴我你這錯誤原因可能是 JDK版本 設(shè)置的過高的原因,讓我改成 JDK1.7,目標編譯框架設(shè)置成6.0試試

電腦培訓(xùn),計算機培訓(xùn),平面設(shè)計培訓(xùn),網(wǎng)頁設(shè)計培訓(xùn),美工培訓(xùn),Web培訓(xùn),Web前端開發(fā)培訓(xùn)

大佬就是大佬,一針見血的找到問題,剩下的就是兩個小問題,重命名就搞定了,到此編譯成功!

<attr path="/api/package[@name='com.tencent.mm.opensdk.modelbase']/class[@name='BaseResp']/field[@name='errCode']" name="managedName">errCode</attr>
  <attr path="/api/package[@name='com.tencent.mm.opensdk.modelmsg']/class[@name='WXMediaMessage']/field[@name='mediaObject']" name="managedName">mediaObject</attr>

但是又遇到一個奇葩問題,在實例化 PayReq  對象時,VS還是找不到這個類,我用ILSpay看了生成的類,是有這個的  !電腦培訓(xùn),計算機培訓(xùn),平面設(shè)計培訓(xùn),網(wǎng)頁設(shè)計培訓(xùn),美工培訓(xùn),Web培訓(xùn),Web前端開發(fā)培訓(xùn)

電腦培訓(xùn),計算機培訓(xùn),平面設(shè)計培訓(xùn),網(wǎng)頁設(shè)計培訓(xùn),美工培訓(xùn),Web培訓(xùn),Web前端開發(fā)培訓(xùn)

But并不能影響什么,因為還是可以編譯成功?。?!

                                                                                      電腦培訓(xùn),計算機培訓(xùn),平面設(shè)計培訓(xùn),網(wǎng)頁設(shè)計培訓(xùn),美工培訓(xùn),Web培訓(xùn),Web前端開發(fā)培訓(xùn)

電腦培訓(xùn),計算機培訓(xùn),平面設(shè)計培訓(xùn),網(wǎng)頁設(shè)計培訓(xùn),美工培訓(xùn),Web培訓(xùn),Web前端開發(fā)培訓(xùn)

而且如果我將編譯好的dll 文件單獨放到 安卓工程里面去引用的話,編譯是沒有問題的,這個時候VS也能知道這個類,在對象瀏覽器中也能看到這個類,我試過將兩個工程里面的obj、bin目錄下的文件都刪除,然后重新編譯,結(jié)果還是這個問題,直接引用這個binding工程找不到PayReq這個類,但是卻能編譯成功。不知道是不是VS17的一個Bug,如果那位園友遇到過這個問題,也可以留言說一下。

微信支付后回調(diào)Activity 代碼:

using System;using Android.App;using Android.Content;using Android.OS;using Com.Tencent.MM.Opensdk.Modelbase;using Com.Tencent.MM.Opensdk.Openapi;using Android.Util;using Android.Widget;using Com.Tencent.MM.Opensdk.Constants;namespace XamarinWeiXinDemo
{    /// <summary>
    /// 微信支付回調(diào)Activity    /// </summary>
    public class WXPayEntryActivity : Activity, IWXAPIEventHandler
    {        private IWXAPI api;        public void onCreate(Bundle savedInstanceState)
        {            base.OnCreate(savedInstanceState);            //SetContentView(R.layout.pay_result);            //布局是可以自定義
            api = WXAPIFactory.CreateWXAPI(this, "App_ID");
            api.HandleIntent(Intent, this);
        }        protected override void OnNewIntent(Intent intent)
        {            base.OnNewIntent(intent);
            Intent = intent;
            api.HandleIntent(intent, this);
        }        public void OnReq(BaseReq p0)
        {

        }        public void OnResp(BaseResp p0)
        {
            Log.Debug("微信支付回調(diào)", "onPayFinish, errCode = " + p0.errCode);            
            if (p0.Type == ConstantsAPI.CommandPayByWx)
            {                //0   成功 展示成功頁面                //-1  錯誤 可能的原因:簽名錯誤、未注冊APPID、項目設(shè)置APPID不正確、注冊的APPID與設(shè)置的不匹配、其他異常等。                //-2  用戶取消 無需處理。發(fā)生場景:用戶不支付了,點擊取消,返回APP。
                if (p0.errCode == 0)
                {                    //支付成功邏輯
                    Toast.MakeText(this, "支付成功", ToastLength.Long).Show();
                }                else
                {                    //支付失敗
                    Toast.MakeText(this, "支付失敗", ToastLength.Long).Show();
                }
                Finish();
            }

        }

    }

}

最后

三個綁定demo都已經(jīng)傳至GitHub

百度地圖:https://github.com/HuUncle/Xamarin.Android-BaiDuMapSDKBinding

微信:https://github.com/HuUncle/Xamarin.Android-WeiXinSDKBindingDemo

支付寶:https://github.com/HuUncle/Xamarin.Android-AlipaySDKBindingDemo

如果覺得對你有幫助,請幫我點個贊,你的推薦是我學(xué)習(xí)的動力。

轉(zhuǎn)載請注明出處 IT胡小帥: http://www.cnblogs.com/CallMeUncle/p/6562440.html

分類: Xamarin.Android

標簽: Xamarin.Android

http://www.cnblogs.com/CallMeUncle/p/6562440.html