こんにちは、私たちはこのアプリを inApp Billing で市場にリリースしました。私たちのログは、特定の顧客のデバイスで BillingService (おそらくアプリ自体) が非常にランダムに殺され続けていることを示しています。このため、購入が成功したかどうかの通知を受け取ることができない場合があります。一部の顧客は、購入を成功させるために 2 回購入する必要があります。これはごく一部のお客様に発生しますが、非常に厄介です。なぜそれが起こっているのか、またはこの問題を回避するために何ができるのか。
2 に答える
それが役立つかどうかはわかりませんが、BillingService フォアグラウンド サービスを作成することをお勧めします: http://developer.android.com/guide/components/services.html#Foreground
ここにドキュメントの一部があります「サービスをフォアグラウンド状態にするAPI。システムは、ユーザーが積極的に認識しているものであり、メモリが不足しているときに強制終了の候補ではないと見なします。」
ユーザーのごく一部がメモリ不足の状態にあり、サービス/アプリケーション (あなたのものを含む) を殺し始めている可能性があります。
アプリ内課金に使用するコードを提示できますか? アプリ内課金がデバイスでサポートされていないか、Android マーケットのブロードキャスト通知にアクセスしようとしたときにインターネット接続が失われた可能性があります。私がアプリで使用したのは、基本的に次のようなものです。
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
if( BillingHelper.isBillingSupported()){
switch (arg2) {
case 0:
Log.d("Appname", "30 coins");
BillingHelper.requestPurchase(context, "com.paid.smallcoinbundle");
break;
case 1:
Log.d("Appname", "85 coins");
BillingHelper.requestPurchase(context, "com.paid.medcoinbundle");
break;
case 2:
Log.d("Appname", "175 coins");
BillingHelper.requestPurchase(context, "com.paid.midcoinbundle");
break;
case 3:
Log.d("Appname", "500 coins");
BillingHelper.requestPurchase(context, "com.paid.maxcoinbundle");
break;
default: Log.d("Appname", "Something broke");
break;
}
// BillingHelper.requestPurchase(mContext, "android.test.purchased");
// android.test.purchased or android.test.canceled or android.test.refunded or com.blundell.item.passport
} else {
LayoutInflater inflater = getLayoutInflater();
View layout = inflater.inflate(R.layout.toast_layout,(ViewGroup) findViewById(R.id.toast_layout_root));
TextView text = (TextView) layout.findViewById(R.id.text);
text.setText("In App Billing isnt supported by your device");
Toast toast = new Toast(getBaseContext());
toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0);
toast.setDuration(Toast.LENGTH_LONG);
toast.setView(layout);
toast.show();
return;
}
}
それで :
public Handler mTransactionHandler = new Handler(){
public void handleMessage(android.os.Message msg) {
Log.d("Appname", "Transaction complete");
Log.d("Appname", "Transaction status: "+BillingHelper.latestPurchase.purchaseState);
Log.d("Appname", "Item purchased is: "+BillingHelper.latestPurchase.productId);
if(BillingHelper.latestPurchase.isPurchased()){
Log.d("Appname", "Ispurchased : " + BillingHelper.latestPurchase.productId);
if(BillingHelper.latestPurchase.productId.equals("com.paid.smallcoinbundle")){
ConnectToServer.UpdateCoins(context,id,"add","30");
}
if(BillingHelper.latestPurchase.productId.equals("com.paid.medcoinbundle")){
ConnectToServer.UpdateCoins(context,id,"add","85");
}
if(BillingHelper.latestPurchase.productId.equals("com..paid.midcoinbundle")){
ConnectToServer.UpdateCoins(context,id,"add","175");
}
if(BillingHelper.latestPurchase.productId.equals("com.paid.maxcoinbundle")){
ConnectToServer.UpdateCoins(context,id,"add","500");
}
finish();
}
};
};
アプリ内課金は使えるとおっしゃっていましたが、アイテムを2回購入する必要がある場合もありますが、パッケージ名は正しいと思います。
あなたがそれを修正しようとしているのかどうか、そして何が問題だったのか教えてください。これは非常に興味深いトピックです。