IInAppBillingService Объект является нулевым - PullRequest
0 голосов
/ 06 февраля 2019

Я пытаюсь использовать Android In App Billing, следуя документам Google.Но я пытался использовать метод bindService для использования объекта InAppBillingService (mService).Возвращает true, но mService по-прежнему нулевой.вот мой код

открытый класс 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;
}

}

Я знаю, что это очень плохой код, потому что bindService вызывается в onCreate.Но я попробовал это на Асине, и никаких изменений не было.Я пытался дождаться завершения соединения с помощью спящего режима 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)' onнулевая ссылка на объект

Пожалуйста, помогите мне TT

1 Ответ

0 голосов
/ 07 февраля 2019

Ваш подход (цикл до тех пор, пока mService не равен нулю) имеет недостатки.Фактически, именно это препятствует созданию службы.

Создание локального "в процессе" Service не происходит синхронно с вызовом bindService() / startService().Вы должны вернуть контроль в рамки;в этом случае это означает возврат с onStart().Это связано с тем, что состояние Service улучшается за счет очереди сообщений (Looper), которая работает в главном потоке, и, пока вы застряли в onStart(), Looper не «зацикливается».

Если вы вернетесь, вы обнаружите, что Service.onCreate() и ServiceConnection.onServiceConnected() вызываются в течение нескольких миллисекунд.

...