Android的应用内计费:空指针异常 [英] Android In-App billing: Null Pointer Exception
问题描述
我想实现应用内结算我的申请。
I'm trying to implement in-app billing to my application.
我读上developer.android.com指导,看着他们的示例应用程序。
I'm reading the guide on developer.android.com, looking at their example application.
我一开始是否支持应用内计费写检查的基本方法,但是当我尝试打电话给我sendBillingRequest收到以下错误:
I started to write basic methods for check if In-App billing is supported, but when i try to call sendBillingRequest i receive the following error:
05-17 14:23:30.479: W/System.err(15332): java.lang.NullPointerException
05-17 14:23:30.489: W/System.err(15332): at resistorcalc.main.billing.BillingService.checkBilling(BillingService.java:63)
05-17 14:23:30.489: W/System.err(15332): at resistorcalc.main.SupportusActivity.onCreate(SupportusActivity.java:24)
05-17 14:23:30.499: W/System.err(15332): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
05-17 14:23:30.509: W/System.err(15332): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1615)
05-17 14:23:30.509: W/System.err(15332): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1667)
05-17 14:23:30.519: W/System.err(15332): at android.app.ActivityThread.access$1500(ActivityThread.java:117)
05-17 14:23:30.529: W/System.err(15332): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:935)
05-17 14:23:30.539: W/System.err(15332): at android.os.Handler.dispatchMessage(Handler.java:99)
05-17 14:23:30.539: W/System.err(15332): at android.os.Looper.loop(Looper.java:130)
05-17 14:23:30.549: W/System.err(15332): at android.app.ActivityThread.main(ActivityThread.java:3687)
05-17 14:23:30.549: W/System.err(15332): at java.lang.reflect.Method.invokeNative(Native Method)
05-17 14:23:30.549: W/System.err(15332): at java.lang.reflect.Method.invoke(Method.java:507)
05-17 14:23:30.549: W/System.err(15332): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
05-17 14:23:30.559: W/System.err(15332): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
05-17 14:23:30.559: W/System.err(15332): at dalvik.system.NativeStart.main(Native Method)
该BillingService有类是:
The billingService Class is:
package resistorcalc.main.billing;
import android.app.Service;
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.os.RemoteException;
import android.util.Log;
import com.android.vending.billing.IMarketBillingService;
public class BillingService extends Service implements ServiceConnection {
private static final String TAG = "BillingService";
private IMarketBillingService mService;
public BillingService(){
super();
}
@Override
public void onCreate() {
super.onCreate();
try {
Log.i(TAG, "Service starting with onCreate");
boolean bindResult = bindService(new Intent("com.android.vending.billing.MarketBillingService.BIND"), this, Context.BIND_AUTO_CREATE);
if(bindResult){
Log.i(TAG,"Market Billing Service Successfully Bound");
} else {
Log.e(TAG,"Market Billing Service could not be bound.");
}
} catch (SecurityException e){
Log.e(TAG,"Market Billing Service could not be bound. SecurityException: "+e);
}
}
public void setContext(Context context) {
attachBaseContext(context);
}
/**
* The Android system calls this when we are connected to the MarketBillingService.
*/
public void onServiceConnected(ComponentName name, IBinder service) {
Log.i(TAG, "MarketBillingService connected.");
mService = IMarketBillingService.Stub.asInterface(service);
}
protected Bundle makeRequestBundle(String method) {
Bundle request = new Bundle();
request.putString(BillingConst.BILLING_REQUEST_METHOD, method);
request.putInt(BillingConst.BILLING_REQUEST_API_VERSION, 1);
request.putString(BillingConst.BILLING_PACKAGE_NAME, getPackageName());
return request;
}
public boolean checkBilling(){
try {
Bundle request = makeRequestBundle("CHECK_BILLING_SUPPORTED");
Bundle response = mService.sendBillingRequest(request);
int code = response.getInt("RESPONSE_CODE");
if(code==0){
return true;
} else {
return false;
}
} catch (Exception e) {
e.printStackTrace();
System.err.print(e.getMessage());
return false;
}
}
public void onServiceDisconnected(ComponentName arg0) {
// TODO Auto-generated method stub
}
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return null;
}
}
唯一的例外发生在该行:
The exception occur on that line:
捆绑响应= mService.sendBillingRequest(请求);
Bundle response = mService.sendBillingRequest(request);
这是因为MSERVICE变量为空。该MSERVICE变量在该方法中初始化:
This happens because the mService variable is null. The mService variable is initialized on that method:
public void onServiceConnected(ComponentName name, IBinder service) {
Log.i(TAG, "MarketBillingService connected.");
mService = IMarketBillingService.Stub.asInterface(service);
}
(如写在该指南:http://developer.android.com/guide/market/billing/billing_integrate.html#billing-service)
问题是,onServiceConnected不会被调用。
(as written in the that guide: http://developer.android.com/guide/market/billing/billing_integrate.html#billing-service) The problem is that onServiceConnected is never called.
这是推出的服务活动:
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.supportus);
mBillingService = new BillingService();
mBillingService.setContext(this);
Intent intent = new Intent();
intent.setClass(this, BillingService.class);
startService(intent);
if(mBillingService.checkBilling()){
Toast.makeText(this, "TRUE", Toast.LENGTH_SHORT);
} else {
Toast.makeText(this, "FALSE", Toast.LENGTH_SHORT);
}
}
我不明白是什么问题。为什么的onCreate和onServiceConnected方法不叫?纵观lifceycle的BillingService有onCreate方法服务应该用startService调用。
在哪里做我错了
I cannot understand what is the problem. Why the onCreate and onServiceConnected method aren't called? Looking at the service lifceycle the BillingService onCreate method should be called with a startService. Where did I wrong
推荐答案
最后,我发现在该问题的解决方案。它是我的错。
FInally i found the solution on that problem. And it was my fault.
在清单中的错误,其实我在服务声明为
The error was in the manifest, in fact i declared in the service as
<service android:name=".BillingService" />
但BillingService有类是在一个子包(resistorcalc.main.billing)。然后我更换了符合:
But the BillingService class was in a subpackage (resistorcalc.main.billing). Then i replaced the line with:
<service android:name=".billing.BillingService" />
和服务开始工作。
这篇关于Android的应用内计费:空指针异常的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!