【问题标题】:Xamarin - Android - Plugin.InAppBilling ExceptionXamarin - Android - Plugin.InAppBilling 异常
【发布时间】:2018-09-24 02:43:14
【问题描述】:

我正在尝试使用plugin InAppBilling 为 Xamarin 表单解决方案实施 (应用程序计费)
除了@987654322,我找不到此插件的任何完整代码示例或文档@
我一步一步地按照说明操作,但是当我运行我的代码时,我得到了这个异常

{System.NullReferenceException:当前上下文/活动为空, 确保 MainApplication.cs 文件正在设置 CurrentActivity 在您的源代码中,以便 In App Billing 可以使用它。在 Plugin.InAppBilling.InAppBillingImplementation.get_Context () [0x00000] 在 C:\projects\inappbillingplugin\src\Plugin.InAppBilling.Android\InAppBillingImplementation.cs:59 在 Plugin.InAppBilling.InAppBillingImplementation.ConnectAsync (Plugin.InAppBilling.Abstractions.ItemType itemType) [0x00000] 在 C:\projects\inappbillingplugin\src\Plugin.InAppBilling.Android\InAppBillingImplementation.cs:372 在 myproject.MainPage+d__28.MoveNext () [0x00051] 在 C:\Users\xuser\source\repos\myproject\MainPage.xaml.cs:415 }

我的示例代码
此代码在(共享/可移植类库/.NET 标准)中

MainPage.xaml.cs

 public partial class MainPage : ContentPage
    {

     void OnPurchased(object sender, EventArgs e)
            {
              InAppBilling();
            }
     async void InAppBilling()
            {
                try
                {
                    var productId = "xxxxx.xxxx_appbilling";
                    var connected = await CrossInAppBilling.Current.ConnectAsync();
                    if (!connected)
                    {
                        //Couldn't connect to billing, could be offline, alert user
                        return;
                    }
                    //try to purchase item
                    var purchase = await CrossInAppBilling.Current.PurchaseAsync(productId, ItemType.InAppPurchase, "apppayload");
                    if (purchase == null)
                    {
                        //Not purchased, alert the user
                    }
                    else
                    {
                        //Purchased, save this information
                        var id = purchase.Id;
                        var token = purchase.PurchaseToken;
                        var state = purchase.State;
                    }
                }
                catch (Exception ex)
                {
                    //Something bad has occurred, alert user
                }
                finally
                {
                    //Disconnect, it is okay if we never connected
                    await CrossInAppBilling.Current.DisconnectAsync();
                }

            }
}

Droid 项目中的这段代码

 public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
    {
  protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
        {
            base.OnActivityResult(requestCode, resultCode, data);
            InAppBillingImplementation.HandleActivityResult(requestCode, resultCode, data);
        }
    }

【问题讨论】:

    标签: c# android xamarin xamarin.forms xamarin.android


    【解决方案1】:

    您缺少在OnCreate 方法中设置当前活动(上下文)的文档部分:

    Plugin.CurrentActivity.CrossCurrentActivity.Current.Activity = this;
    

    Android 当前活动设置

    此插件使用当前活动插件来访问当前的 Android 活动。如果 MainApplication.cs 文件未自动添加到您的应用程序,请务必完成完整设置。请通读当前活动插件文档。您必须至少在 Activity 的 OnCreate 方法中设置以下内容:

    【讨论】:

    • 我要问你这段代码 var purchase = await CrossInAppBilling.Current.PurchaseAsync(productId, ItemType.InAppPurchase, "apppayload");我应该更改“apppayload”还是保留它?
    • @DevC 来自 docs 的引用:“payload 属性是一个特殊的payload,它被发送然后从服务器返回以进行额外的验证。它可以是任何你想要的,但应该是一个常量在任何使用有效负载的地方使用。"
    猜你喜欢
    • 2021-07-05
    • 2021-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多