我正在尝试在我的应用程序中实现应用内计费。我写了这段代码。
public class Settings extends PreferenceFragment {
ServiceConnection mServiceConn;
IInAppBillingService mService;
PendingIntent pending;
Intent intent;
Bundle bundle;
@Override
public void onDestroy() {
super.onDestroy();
if (mService != null) {
getActivity().unbindService(mServiceConn);
}
}
@Override
public void onCreate(Bundle savedIstanceState) {
super.onCreate(savedIstanceState);
addPreferencesFromResource(R.xml.settings);
getActivity().getActionBar().setTitle(getString(R.string.settings));
mServiceConn = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName arg0, IBinder arg1) {
// TODO Auto-generated method stub
mService = IInAppBillingService.Stub.asInterface(arg1);
}
@Override
public void onServiceDisconnected(ComponentName arg0) {
// TODO Auto-generated method stub
mService = null;
}
};
intent = new Intent("com.android.vending.billing.InAppBillingService.BIND").setPackage("com.android.vending");
getActivity().bindService(intent, mServiceConn, Context.BIND_AUTO_CREATE);
try {
bundle = mService.getBuyIntent(3, getActivity().getPackageName(), "pro_version", "inapp", "bGoa+V7g/yqDXvKRqq+JTFn4uQZbPiQJo4pf9RzJ");
pending = bundle.getParcelable("BUY_INTENT");
getActivity().startIntentSenderForResult(pending.getIntentSender(), 1001, new Intent(), Integer.valueOf(0), Integer.valueOf(0), Integer.valueOf(0));
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SendIntentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
当我启动应用程序并打开此 fragment 时,应用程序崩溃并出现以下错误:
01-31 19:59:30.969: E/AndroidRuntime(11546): java.lang.NullPointerException: Attempt to invoke interface method 'android.os.Bundle com.android.vending.billing.IInAppBillingService.getBuyIntent(int, java.lang.String, java.lang.String, java.lang.String, java.lang.String)' on a null object reference
在 AndroidManifest 中显然我有这些权限:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="com.android.vending.BILLING"/>
最佳答案
您的 try
block 在 onServiceConnected
之前调用,这就是 mService
为 null
的原因。将 try
block 移动到 onServiceConnected
内部以及赋值之后,如下所示:
mServiceConn = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName arg0, IBinder arg1) {
mService = IInAppBillingService.Stub.asInterface(arg1);
try {
bundle = mService.getBuyIntent(3, getActivity().getPackageName(), "pro_version", "inapp", "bGoa+V7g/yqDXvKRqq+JTFn4uQZbPiQJo4pf9RzJ");
pending = bundle.getParcelable("BUY_INTENT");
getActivity().startIntentSenderForResult(pending.getIntentSender(), 1001, new Intent(), Integer.valueOf(0), Integer.valueOf(0), Integer.valueOf(0));
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SendIntentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName arg0) {
// TODO Auto-generated method stub
mService = null;
}
};
关于java - 应用程序内空指针异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28261243/