Teste de facturação na aplicação: android.teste.adquiridos já propriedade
estou actualmente a testar a facturação de uma aplicação futura, e depois de "ter comprado" com sucesso o item de teste "android.teste.comprado " a primeira vez, eu agora recebo o código de Resposta 7 cada vez que eu tento comprá-lo novamente, o que significa que eu já possui este item.
Pelo que sei, esta compra deve ser sempre possível., certo? Para que o desenvolvedor possa testar a sua aplicação? Se não, como posso "reiniciar" o seu estado para não ser dono? Estou usando o pacote util da amostra de faturamento do Google In-App.12-15 23:02:14.149: e / IabHelper(19829): erro de facturação na aplicação: incapaz para comprar o item, resposta de Erro: 7: Item já propriedade
16 answers
Adicione este código a um tópico para iniciar o pedido de consumo.
int response = mService.consumePurchase(3, getPackageName(), purchaseToken);
Aqui para o teste de compra, purchaseToken é
purchaseToken = "inapp:" + getPackageName() + ":android.test.purchased";
E
if (response == 0)
Então o consumo é bem sucedido.
adb shell pm clear com.android.vending
In-app version 3:
IabHelper.QueryInventoryFinishedListener mGotInventoryListener = new IabHelper.QueryInventoryFinishedListener() {
public void onQueryInventoryFinished(IabResult result, Inventory inventory) {
.....................
if (inventory.hasPurchase(SKU_CONTENT)) {
mHelper.consumeAsync(inventory.getPurchase(SKU_CONTENT), null);
}
}
};
Version3 : Limpar a 'cache' da Play Store do Google permitirá "android.teste.comprado " disponível novamente.
É assim que podemos consumir o Item
consume.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Thread t = new Thread(new Runnable() {
@Override
public void run() {
String purchaseToken = "inapp:" + getPackageName() + ":android.test.purchased";
try {
Log.d("","Running");
int response = mService.consumePurchase(3, getPackageName(), purchaseToken);
if(response==0)
{
Log.d("Consumed","Consumed");
}else {
Log.d("","No"+response);
}
}catch (RemoteException e)
{
Log.d("Errorr",""+e);
}
}
});
t.start();
}
});
Na minha opinião, se o seu programa não foi concebido para consumir o item, não precisa de ajustar o código para limpar a memória de um vendedor externo. Isto tornará o seu código mais frágil e você terá que gastar muito tempo para adicionar e remover código que não pertence ao seu software, por isso é um mau design para implementar uma solução como essa.
A melhor solução que me deu para limpar o android.teste.comprado eraadb uninstall com.yourapp.name
E depois
adb shell pm clear com.android.vending
Eu não precisava de levantar dinheiro e navegar na configuração das minhas aplicações ou mudar de código para isso. Eu precisava adicionar o adb ao path variáveis do sistema windows que era bastante direto para a frente. Então sim você precisa usar adb que você provavelmente precisa de qualquer maneira assim..
Basta adicionar o seu C:\...\android-sdk\platform-tools; in Windows path in environment variables, and I imagine that it is pretty simple in mac and linux os as well. Espero que ajude alguém a passar menos uns dias com implementando android em app billings.Usei a casca adb:
adb shell pm clear com.android.vending
O principal problema é que você tem que consumir o item android.test.purchased
. Mas este item não estará disponível em seu inventário de consulta, então você não pode consumir usando o fluxo normal.
Então, se estiver a usar o IabHelper, na classe IabHelper
, pode mudar temporariamente o serviço IInAppBillingService
para o público de modo a que seja acessível a partir do seu IabHelper.
int response = mHelper.mService.consumePurchase(3, getPackageName(), "inapp:"+getPackageName()+":android.test.purchased");
Se o sucesso, a resposta será 0.
Espero que isto ajude.Se estiver em ambiente de ensaio
No caso do android.teste.comprado, eu posso resetar o pagamento falso reiniciando o dispositivo android (consumido o inventário).2) no InApp util há um arquivo chamado Segurança.java torná-lo como a seguir, por temporário. Desde que o pagamento teste (falso) sempre retornar falso devido à exceção de segurança.
public static boolean verifyPurchase(String base64PublicKey,
String signedData, String signature) {
return true; }
Depois, na sua única compra, o Finishedlistener call fechinv forconsumeitem ()
IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener
= new IabHelper.OnIabPurchaseFinishedListener() {
public void onIabPurchaseFinished(IabResult result,
Purchase purchase)
{
if (result.isFailure()) {
// Handle error
Log.e("123","Failure");
return;
}
else if (purchase.getSku().equals(ITEM_SKU)) {
Log.e("123","PURCAsed");
fechInvForconsumeItem(); // Restart device if not consume
}
}
};
O fechInvForconsumeItem() riz[6]}
public void fechInvForconsumeItem() {
mHelper.queryInventoryAsync(mReceivedInventoryListener);
}
IabHelper.QueryInventoryFinishedListener mReceivedInventoryListener
= new IabHelper.QueryInventoryFinishedListener() {
public void onQueryInventoryFinished(IabResult result,
Inventory inventory) {
if (result.isFailure()) {
// Handle failure
Log.e("11","Failure");
} else {
Log.e("11","suc");
mHelper.consumeAsync(inventory.getPurchase(ITEM_SKU),
mConsumeFinishedListener);
}
}
};
Consuma Listener is
IabHelper.OnConsumeFinishedListener mConsumeFinishedListener =
new IabHelper.OnConsumeFinishedListener() {
public void onConsumeFinished(Purchase purchase,
IabResult result) {
if (result.isSuccess()) {
} else {
// handle error
Log.e("11","sucConsume");
}
}
};
Para efeitos de teste, também sugiro que insira um código que estará a limpar todos os produtos que comprou antes de invocar um método que inicialize o fluxo de compra gp. Isso é especialmente confortável, quando você testa apenas um item no momento. Por exemplo:
PurchasesResult purchasesResult = mBillingClient.queryPurchases(BillingClient.SkuType.INAPP);
for (Purchase sourcePurchase : purchasesResult.getPurchasesList()) {
if(sourcePurchase != null){
ConsumeResponseListener listener = new ConsumeResponseListener() {
@Override
public void onConsumeResponse(String outToken, @BillingResponse int responseCode) {
System.out.println("all consumed");
}
};
mBillingClient.consumeAsync(sourcePurchase.getPurchaseToken(), listener);
}else{
System.out.println("null");
}
}
// and then initiate whole process with clear "shoping basket"
BillingFlowParams.Builder builder = new BillingFlowParams.Builder()
.setSku(itemName).setType(BillingClient.SkuType.INAPP);
Vá à consola de Jogo do Google e abra a página de gestão de encomendas. Lá você pode reembolsar / cancelar as compras de teste.
IabHelper.QueryInventoryFinishedListener
mQueryFinishedListener = new IabHelper.QueryInventoryFinishedListener() {
public void onQueryInventoryFinished(IabResult result, Inventory inventory)
{
if (result.isFailure()) {
return;
}
try {
if(inventory.hasPurchase("product_sku_id"))
{
isItemEnable= true;
mHelper.consumeAsync(inventory.getPurchase("product_sku_id"),null);
}
else
{
isItemEnable = false;
}
} catch (Exception e) {
e.printStackTrace();
}
}
};
android.test.purchased already owned
aparece. No entanto, usando outro dispositivo ou redefinindo o dispositivo limpa o cache, e permite que a compra seja repetida.
Do meu dispositivo (4.4.2), naveguei para "configuração->Gestor de aplicações". Em seguida, eu selecionei o aplicativo a partir da página "baixado", e em seguida,"Limpar cache".