次のコードを使用して、このユーザーがプレミアム ユーザーであるかどうかを調べています。ユーザーがアプリ課金で購入したかどうかの天気。しかし、このメソッド isPremium() を呼び出すと、初回のみ正しい結果が得られますが、初めて実行すると、常に間違った結果が得られます。IInAppBillingService の mService 変数が null です。誰かがその理由を教えてもらえますか。コードは以下の通りです。
public boolean isPremium() {
boolean mIsPremium = false;
Log.d(TAG, "::isPremium:" + "mService:"+mService);
if(mService==null){
return mIsPremium;
}
try {
Bundle ownedItems = mService.getPurchases(3, getPackageName(),
"inapp", null);
if (ownedItems != null) {
int response = ownedItems.getInt("RESPONSE_CODE");
if (response == 0) {
ArrayList ownedSkus = ownedItems
.getStringArrayList("INAPP_PURCHASE_ITEM_LIST");
ArrayList purchaseDataList = ownedItems
.getStringArrayList("INAPP_PURCHASE_DATA_LIST");
ArrayList signatureList = ownedItems
.getStringArrayList("INAPP_DATA_SIGNATURE");
String continuationToken = ownedItems
.getString("INAPP_CONTINUATION_TOKEN");
for (int i = 0; i < purchaseDataList.size(); ++i) {
String signature = null;
String purchaseData = (String) purchaseDataList.get(i);
if (signatureList != null)
signature = (String) signatureList.get(i);
String sku = (String) ownedSkus.get(i);
Log.d(TAG, "::isPremium:" + "sku:" + sku);
Log.d(TAG, "::isPremium:" + "purchaseData:"
+ purchaseData);
Log.d(TAG, "::isPremium:" + "signature:" + signature);
if (sku.equalsIgnoreCase(SKU_PREMIUM)) {
Log.d(TAG, "::isPremium:" + "Already Purchased");
return true;
}
// do something with this purchase information
// e.g. display the updated list of products owned by
// user
}
// if continuationToken != null, call getPurchases again
// and pass in the token to retrieve more items
}
}
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return mIsPremium;
}
以下は、サービスを初期化するコードです。私がサービスに来るたびに。「onServiceConnected」ログのみを取得します。ログ ":onServiceDisconnected:" を取得しませんでした
ServiceConnection mServiceConn = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
Log.d(TAG, "::onServiceDisconnected:" + "");
mService = null;
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Log.d(TAG, "::onServiceConnected:" + "");
mService = IInAppBillingService.Stub.asInterface(service);
}
};
では、初めて mService が null になる理由を教えてください。1回だけ呼び出す必要がありますか? 私のサービスは切断されていますか?しかし、ログには表示されませんでした。