2012-04-24 2 views
1

Я реализую услугу биллинга, основанную на образце Dungeons (именно так рекомендую Google по этому поводу). Это немного осложнено следующими фактами:В службе выставления счетов, основанной на подземельях, bindService возвращает NullPointerException

  1. Основной класс службы живет в проекте библиотеки (потому что я хочу многократно переустанавливать код). Поскольку this stackoverflow answer предлагает услугу в библиотечном проекте, могут возникнуть проблемы, я сделал абстрактную услугу и унаследовал ее в подпроектах; это также позволяет мне использовать разные открытые ключи для каждого reskin (что желательно).
  2. Существует множество элементов пользовательского интерфейса, которые должны знать, поддерживается ли биллинг как можно скорее.

Следовательно я звоню функцию для проверки счетов поддерживаются от onCreate() метода первого запуска деятельности (на самом деле какой-либо деятельности, но предпочтение будет записать так что это должно произойти только один раз).

В образце Dungeons код, чтобы проверить, если платежный поддерживается пытается связываться со службой биллинга, таким образом (от Service класса):

boolean bindResult = bindService(
    new Intent(Consts.MARKET_BILLING_SERVICE_ACTION), 
    this, // ServiceConnection. 
    Context.BIND_AUTO_CREATE); 

этот вызов бросает NullPointerException. Я проверил довольно внимательно, и ни одна из этих вещей не является нулевой; это происходит в пределах функция, по-видимому, на строке 370 ContextWrapper.java.

Из-за this other stackoverflow answer Я задавался вопросом, может ли проверка выставления счета с onCreate() может быть преждевременной, но проект примера подземелий снова вызывает его здесь, поэтому я не думаю, что это так.

Я использую гораздо более позднюю версию Android (3.1), так что это может иметь эффект, но я бы хотел узнать возможные причины этого. Еще одна вещь: Eclipse сообщает мне, что customIntent имеет значение NULL, но не совсем понятно, что это значит, и я не смог найти много об этом.

ответ

2

Ответ оказывается очень, очень просто: я пропустил этот шаг в Activity#onCreate:

mBillingService = new BillingService() 

//THIS STEP IS THE CRITICAL STEP 
mBillingService.setContext(this); 
//IF ONLY I HAD KNOWN 

mBillingService.checkBillingSupported(); 

Это вызывает attachBaseContext(context);

Он работает сейчас :)

Смежные вопросы