IInAppBillingService对象为空

时间:2019-02-06 17:28:29

标签: android nullpointerexception in-app-billing

我正在通过遵循Google文档来尝试使用Android In App Billing。但是我尝试使用bindService方法来使用InAppBillingService对象(mService)。它返回true,但是mService仍然为null。这是我的代码

公共类PaymentActivity扩展了AppCompatActivity {

IInAppBillingService mService;

ServiceConnection mServiceConn;
ArrayList<String> skuList;
Bundle querySkus;
Bundle skuDetails;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_payment);


    Log.d("payment", "isBillingAvailable? " + isBillingAvailable(this));

    String chargeString = getIntent().getStringExtra("charge");

    Log.d("intentTest", "charge is: " + chargeString);

    mServiceConn = new ServiceConnection() {
        @Override
        public void onServiceDisconnected(ComponentName name) {

            Log.d("Payment", "service disconnected!");

            mService = null;
        }

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            mService = IInAppBillingService.Stub.asInterface(service);
            Log.d("Payment", "service connected!");
        }
    };


}

@Override
protected void onStart() {
    super.onStart();
    // Bind to IInAppBillingService
    Intent serviceIntent = new Intent("com.android.vending.billing.InAppBillingService.BIND");
    serviceIntent.setPackage("com.android.vending");
    this.bindService(serviceIntent, mServiceConn, Context.BIND_AUTO_CREATE);



    try{
        while(mService == null){
            Thread.sleep(1000);
            Log.d("payment", "sleep 1 second");
        }

    }catch (InterruptedException e)
    {
        e.printStackTrace();
    }


    skuList = new ArrayList<String> ();
    skuList.add("premiumUpgrade");
    skuList.add("gas");
    querySkus = new Bundle();
    querySkus.putStringArrayList("ITEM_ID_LIST", skuList);

}


@Override
public void onDestroy() {
    super.onDestroy();
    if (mService != null) {
        unbindService(mServiceConn);
    }
}

public static boolean isBillingAvailable(Context context) {
    final PackageManager packageManager = context.getPackageManager();
    final Intent intent = new Intent("com.android.vending.billing.InAppBillingService.BIND");
    List<ResolveInfo> list = packageManager.queryIntentServices(intent, 0);
    return list.size() > 0;
}

}

我知道这是很糟糕的代码,因为在onCreate中调用bindService。但是我在Asyn上尝试过,没有任何变化。我试图等待,直到通过休眠mainTread完成连接。这种尝试使我的应用陷入无限循环。

我的错误消息是

java.lang.RuntimeException:无法启动活动ComponentInfo {kr.co.bigsapp.www / kr.co.bigsapp.www.activities.PaymentActivity}:java.lang.NullPointerException:尝试调用接口方法“ android”。 os.Bundle com.android.vending.billing.IInAppBillingService.getSkuDetails(int,java.lang.String,java.lang.String,android.os.Bundle)'上的空对象引用

请帮助我TT

1 个答案:

答案 0 :(得分:0)

您的方法(循环直到mService不为空)是有缺陷的。实际上,这就是阻止创建服务的原因。

创建本地“进程内” Service不会与bindService() / startService()调用同步进行。您必须将控制权交还给框架。在这种情况下,这意味着从onStart()返回。这是因为Service的状态由在主线程上运行的消息队列(Looper)进行了高级处理,并且当您陷入onStart()时,{{1 }}不是“循环”。

返回后,您会发现LooperService.onCreate()在几毫秒内被调用。