我试图加入应用程序购买,我已成功通过显示SKU可用。现在我想做一个假购买。所以我使用了appId =“android.test.purchased”。这是第一次完美无瑕地工作,但是接下来它会抛出异常,如下所示。
尝试在空对象引用上调用虚拟方法'android.content.IntentSender android.app.PendingIntent.getIntentSender()'
有人遇到过这种情况吗?
package com.inappbilling.poc;
import java.util.ArrayList;
import org.json.JSONObject;
import android.app.Activity;
import android.app.PendingIntent;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import com.android.vending.billing.IInAppBillingService;
public class TestInAppPurchase extends Activity {
private final static String SERVICE_INTENT = "com.android.vending.billing.InAppBillingService.BIND";
private static final String _TAG = "BILLING ACTIVITY";
private final String _testSku = "android.test.purchased";
//available skus
static final String SKU_7DAYS = "7days";
static final String SKU_30DAYS = "30days";
private Button _7daysPurchase = null;
private Button _30daysPurchase = null;
private IInAppBillingService _service = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d(_TAG, "created");
_7daysPurchase = ( Button ) findViewById(R.id.sevendays_btn);
_30daysPurchase = ( Button ) findViewById(R.id.thirtydays_btn);
_7daysPurchase.setOnClickListener(_purchaseListener);
_30daysPurchase.setOnClickListener(_purchaseListener);
}
@Override
protected void onStart() {
super.onStart();
}
OnClickListener _purchaseListener = new OnClickListener() {
@Override
public void onClick(View v) {
switch ( v.getId() ) {
case R.id.sevendays_btn:
doPurchase();
break;
case R.id.thirtydays_btn:
break;
}
}
};
private ServiceConnection _serviceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
_service = IInAppBillingService.Stub.asInterface( service );
Log.d(_TAG, _service.toString());
}
@Override
public void onServiceDisconnected(ComponentName name) {
_service = null;
Log.d(_TAG, "destroyed");
}
};
private void doPurchase(){
if ( _service == null) {
Log.e( _TAG , "Billing failed: billing service is null ");
return;
}
ArrayList testSku = new ArrayList( );
testSku.add( _testSku );
Bundle querySkus = new Bundle();
querySkus.putStringArrayList("ITEM_ID_LIST", testSku);
Bundle skuDetails ;
try {
skuDetails = _service.getSkuDetails(3, getPackageName(), "inapp", querySkus);
int response = skuDetails.getInt("RESPONSE_CODE");
if( response == 0 ){
ArrayList<String> responseList = new ArrayList<String>( );
responseList = skuDetails.getStringArrayList("DETAILS_LIST");
for( String responseString : responseList ) {
JSONObject jobj = new JSONObject( responseString );
String sku = jobj.getString("productId");
if( sku.equals( _testSku )){
Bundle buyIntentBundle = _service.getBuyIntent(3, getPackageName(), sku ,"inapp","" );
PendingIntent pendingIntent = buyIntentBundle.getParcelable("BUY_INTENT");
startIntentSenderForResult(pendingIntent.getIntentSender(),
1001, new Intent(), Integer.valueOf(0), Integer.valueOf(0),
Integer.valueOf(0));
}
}
} else {
Log.e( _TAG , "Failed " );
}
} catch (Exception e) {
Log.e( _TAG, "Caught exception !"+ e.getMessage() );
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if(requestCode == 1001 ){
String purchaseData = data.getStringExtra("INAPP_PURCHASE_DATA");
if( resultCode == RESULT_OK ){
try{
JSONObject jobj = new JSONObject( purchaseData );
String sku = jobj.getString(_testSku);
String paid = jobj.getString("price");
Log.v("SKU DATA", sku +"============"+ paid);
}catch( Exception e) {
e.printStackTrace();
}
}
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if( _serviceConnection != null ){
unbindService( _serviceConnection );
}
}
}
答案 0 :(得分:2)
嗨了解上述问题的解决方案。要摆脱这个,你应该清除Android手机上谷歌播放应用程序的缓存。当我们进行任何应用程序购买时,详细信息由Google Play保留服务。一旦购买产品,播放隔离特定的sku,以避免重复购买。 注 - 这实际上是出于测试目的。因为Google Play服务维护所有应用程序购买或Oauth或任何其他设施的应用程序的记录。 希望它会帮助那些面临这个问题的人。
答案 1 :(得分:1)
当我们尝试购买已经拥有的项目时,我们将在Pending Intent中获得null异常。
因此,您需要检查产品是否已购买,然后仅在未购买产品时才开始购买。
可以使用函数
检索产品购买状态boolean haspurchase = inventory.hasPurchase(sku_id);
它对我有用.. !!