Java Android应用内计费,解锁所有功能
我按照指南进入应用内购买并解锁所有功能。采购程序很有效。 我解释了我的做法:我在数据库中添加了一个检查,它统计表中记录的数量,如果数量>=1,我在应用程序中打开一个活动进行购买。一旦购买,通过getPurchases方法控制购买,如果完成了,我打开活动,否则我打开活动进行购买。我创建了此代码危险控制,但出现错误:Java Android应用内计费,解锁所有功能,java,android,sqlite,Java,Android,Sqlite,我按照指南进入应用内购买并解锁所有功能。采购程序很有效。 我解释了我的做法:我在数据库中添加了一个检查,它统计表中记录的数量,如果数量>=1,我在应用程序中打开一个活动进行购买。一旦购买,通过getPurchases方法控制购买,如果完成了,我打开活动,否则我打开活动进行购买。我创建了此代码危险控制,但出现错误: 08-11 18:08:18.120: W/ContextImpl(19293): Implicit intents with startService are not safe:
08-11 18:08:18.120: W/ContextImpl(19293): Implicit intents with startService
are not safe: Intent {
act=com.android.vending.billing.InAppBillingService.BIND }
android.content.ContextWrapper.bindService:529
main.Elenco_F_Fragment.Controlla_record_per_acquisto:243
main.Elenco_F_Fragment.access$9:233
这是第243行:
final boolean blnBind = getActivity().bindService(new Intent(
"com.android.vending.billing.InAppBillingService.BIND"),
mServiceConn, Context.BIND_AUTO_CREATE);
这是控件的代码
private void Controlla_record_per_acquisto(){
SQLiteDatabase db = new DatabaseHelper(getActivity()).getReadableDatabase();
String controllo = "SELECT COUNT(_id) FROM tbf";
Cursor c = db.rawQuery(controllo, null);
while (c.moveToNext()){
int numero_id = c.getInt(0);
if(numero_id >=1){
// Bind Service
final boolean blnBind = getActivity().bindService(new Intent(
"com.android.vending.billing.InAppBillingService.BIND"),
mServiceConn, Context.BIND_AUTO_CREATE);
if (!blnBind) return;
if (mService == null) return;
Bundle ownedItems;
try {
ownedItems = mService.getPurchases(3, getActivity().getPackageName(), "inapp", null);
Intent intent = null;
intent = new Intent(getActivity(), Crea_e.class);
startActivity(intent);
} catch (RemoteException e) {
e.printStackTrace();
Toast.makeText(context, "getPurchases - fail!", Toast.LENGTH_SHORT).show();
Log.w(tag, "getPurchases() - fail!");
return;
}
int response = ownedItems.getInt("RESPONSE_CODE");
Toast.makeText(context, "getPurchases() - \"RESPONSE_CODE\" return " + String.valueOf(response), Toast.LENGTH_SHORT).show();
Log.i(tag, "getPurchases() - \"RESPONSE_CODE\" return " + String.valueOf(response));
if (response != 0) return;
ArrayList<String> ownedSkus = ownedItems.getStringArrayList("INAPP_PURCHASE_ITEM_LIST");
ArrayList<String> purchaseDataList = ownedItems.getStringArrayList("INAPP_PURCHASE_DATA_LIST");
ArrayList<String> signatureList = ownedItems.getStringArrayList("INAPP_DATA_SIGNATURE");
String continuationToken = ownedItems.getString("INAPP_CONTINUATION_TOKEN");
Log.i(tag, "getPurchases() - \"INAPP_PURCHASE_ITEM_LIST\" return " + ownedSkus.toString());
Log.i(tag, "getPurchases() - \"INAPP_PURCHASE_DATA_LIST\" return " + purchaseDataList.toString());
Log.i(tag, "getPurchases() - \"INAPP_DATA_SIGNATURE\" return " + (signatureList != null ? signatureList.toString() : "null"));
Log.i(tag, "getPurchases() - \"INAPP_CONTINUATION_TOKEN\" return " + (continuationToken != null ? continuationToken : "null"));
}else {
Intent intent = null;
intent = new Intent(getActivity(), InAppBillingActivity.class);
startActivity(intent);
}
c.close();
db.close();
}
}
我建议您使用新的计费系统,在IABHeloper类中,您可以执行上面描述的异步/同步操作,而不需要额外的代码
我遵循了这个指南:[更新了,而且比你的指南更简单。它工作得很好,但如果用户已经做了检查,我仍然必须在查询中进行检查,统计记录购买我必须打开另一个活动。我如何才能?你可以异步获取用户拥有的所有购买,例如当应用程序启动时,然后你可以将它们存储在SharedReferences中。我就是这样做的,它工作得很好。在Query Purchased items->yes下,但在这种情况下,如果你卸载然后再次安装?因为你在应用程序启动时查询资源清册每次启动应用程序时(包括用户重新安装时),都会更新SharedReferences。
private void Controlla_record_per_acquisto(){
SQLiteDatabase db = new DatabaseHelper(getActivity()).getReadableDatabase();
String controllo = "SELECT COUNT(_id) FROM FTB";
Cursor c = db.rawQuery(controllo, null);
while (c.moveToNext()){
int numero_id = c.getInt(0);
if(numero_id >=1){
Intent intent = null;
intent = new Intent(getActivity(), InAppBillingActivity.class);
startActivity(intent);
}else {
Intent intent = null;
intent = new Intent(getActivity(), Cure.class);
startActivity(intent);
}
c.close();
db.close();
}
}