我正在通过遵循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
答案 0 :(得分:0)
您的方法(循环直到mService
不为空)是有缺陷的。实际上,这就是阻止创建服务的原因。
创建本地“进程内” Service
不会与bindService()
/ startService()
调用同步进行。您必须将控制权交还给框架。在这种情况下,这意味着从onStart()
返回。这是因为Service
的状态由在主线程上运行的消息队列(Looper
)进行了高级处理,并且当您陷入onStart()
时,{{1 }}不是“循环”。
返回后,您会发现Looper
和Service.onCreate()
在几毫秒内被调用。