1

Dungeons のサンプルに基づいて課金サービスを実装しています (これは、Google が推奨する方法です)。次の事実により、少し複雑になります。

  1. メインのサービス クラスはライブラリ プロジェクトに存在します (コードのスキンを何度も変更したいため)。このstackoverflowの回答は、ライブラリプロジェクトのサービスが問題を引き起こす可能性があることを示唆しているため、サービスを抽象化し、サブプロジェクトで継承しました。これにより、reskin ごとに異なる公開鍵を使用することもできます (これは望ましいことです)。
  2. 課金がサポートされているかどうかをできるだけ早く知る必要がある UI 要素はたくさんあります。

したがって、最初のアクティビティ実行のメソッドから請求がサポートされているかどうかを確認する関数を呼び出していonCreate()ます (実際にはすべてのアクティビティですが、プリファレンスが書き込まれるため、これは 1 回だけ発生するはずです)。

ServiceDungeons サンプルでは、​​請求がサポートされているかどうかを確認するコードが、次のように (クラスから) 請求サービスにバインドしようとします。

boolean bindResult = bindService(
    new Intent(Consts.MARKET_BILLING_SERVICE_ACTION),
    this,  // ServiceConnection.
    Context.BIND_AUTO_CREATE);

この呼び出しは をスローしていNullPointerExceptionます。私はかなり注意深くチェックしましたが、これらのどれもnullではありません。どうやらContextWrapper.javaの370行目で、関数内で発生しています。

この他のスタックオーバーフローの回答のために、課金を確認するonCreate()のは時期尚早かもしれないと思いましたが、ダンジョンのサンプルプロジェクトはここから呼び出しているので、これではないと思います。

Android (3.1) のかなり新しいバージョンを使用しているため、影響がある可能性がありますが、考えられる原因を知りたいです。もう1つ:Eclipseはnullであると言ってcustomIntentいますが、それが何を指しているのかは完全には明らかではなく、それについてあまり見つけることができませんでした。

4

1 に答える 1

2

答えは非常に単純であることが判明しましたActivity#onCreate

mBillingService = new BillingService()

//THIS STEP IS THE CRITICAL STEP
mBillingService.setContext(this);
//IF ONLY I HAD KNOWN

mBillingService.checkBillingSupported();

これはattachBaseContext(context);

それは今動作します:)

于 2012-04-25T11:45:50.510 に答える