質問編集履歴
2
進捗と現状の共有のため。
test
CHANGED
File without changes
|
test
CHANGED
@@ -306,7 +306,7 @@
|
|
306
306
|
|
307
307
|
[Medium - Google Playアプリ内課金の実装方法ガイド](https://medium.com/@dkmczk/android%E9%96%8B%E7%99%BA-google-play%E3%82%A2%E3%83%97%E3%83%AA%E5%86%85%E8%AA%B2%E9%87%91%E3%81%AE%E5%AE%9F%E8%A3%85%E6%96%B9%E6%B3%95%E3%82%AC%E3%82%A4%E3%83%89-8be98331a35c)
|
308
308
|
|
309
|
-
### 【追記(2021.11.5)】
|
309
|
+
### 【追記 1(2021.11.5)】
|
310
310
|
|
311
311
|
その後色々と試していると、「google playとの通信中には変数の値の書き換えができない」ことがわかりました。
|
312
312
|
|
@@ -387,3 +387,97 @@
|
|
387
387
|
<質問>
|
388
388
|
|
389
389
|
「onResume内で、suspendの関数を実行するためには、どのように記述すればよいのでしょうか。」
|
390
|
+
|
391
|
+
### 【追記 2(2021.11.5)】
|
392
|
+
|
393
|
+
上記の追加質問について、下記のサイトを参考にonResume内のsuspend関数を「runBlocking{}」で囲むことで一旦はエラーなく実装することができました。
|
394
|
+
|
395
|
+
```kotlin
|
396
|
+
|
397
|
+
// Activity(画面)が表示、再開された際に呼ばれる
|
398
|
+
|
399
|
+
@RequiresApi(Build.VERSION_CODES.M)
|
400
|
+
|
401
|
+
override fun onResume() {
|
402
|
+
|
403
|
+
super.onResume()
|
404
|
+
|
405
|
+
// ビューの設定ができている場合(再開時に実行する)
|
406
|
+
|
407
|
+
if (textureView.isAvailable) {
|
408
|
+
|
409
|
+
// 購入履歴をチェック
|
410
|
+
|
411
|
+
if (billingClient.isReady) {
|
412
|
+
|
413
|
+
runBlocking {
|
414
|
+
|
415
|
+
queryPurchases()
|
416
|
+
|
417
|
+
}
|
418
|
+
|
419
|
+
}
|
420
|
+
|
421
|
+
...
|
422
|
+
|
423
|
+
} else { // ビューの設定がまだ完了していない場合
|
424
|
+
|
425
|
+
...
|
426
|
+
|
427
|
+
}
|
428
|
+
|
429
|
+
}
|
430
|
+
|
431
|
+
|
432
|
+
|
433
|
+
...
|
434
|
+
|
435
|
+
|
436
|
+
|
437
|
+
// google playのキャッシュに購入履歴がないか確認する
|
438
|
+
|
439
|
+
suspend fun queryPurchases() {
|
440
|
+
|
441
|
+
val result = billingClient.queryPurchasesAsync(skuType = BillingClient.SkuType.INAPP)
|
442
|
+
|
443
|
+
if(!result.purchasesList.isNullOrEmpty()) { // 何かしらの購入履歴がキャッシュに残っている場合
|
444
|
+
|
445
|
+
purchaseSW = true
|
446
|
+
|
447
|
+
}
|
448
|
+
|
449
|
+
}
|
450
|
+
|
451
|
+
```
|
452
|
+
|
453
|
+
また、キャッシュに購入履歴がないかを確認する方法として、下記のような条件を設定しています。
|
454
|
+
|
455
|
+
```
|
456
|
+
|
457
|
+
if(!result.purchasesList.isNullOrEmpty())
|
458
|
+
|
459
|
+
```
|
460
|
+
|
461
|
+
###### 現状
|
462
|
+
|
463
|
+
録画ボタンを押すと、1回目は購入ダイアログが表示されます。
|
464
|
+
|
465
|
+
ですが、購入したかどうかに関わらず、2回目以降は購入ダイアログが表示されず、録画が実行されます。
|
466
|
+
|
467
|
+
|
468
|
+
|
469
|
+
<推測>
|
470
|
+
|
471
|
+
購入のキャッシュが端末から完全に削除されていないことが原因で、onResume内でqueryPurchasesが実行された瞬間、purchaseSWをtrueにしているのかもしれません。
|
472
|
+
|
473
|
+
そのため、購入したかどうかに関わらず、2回目以降は購入ダイアログが表示されていない可能性があります。
|
474
|
+
|
475
|
+
|
476
|
+
|
477
|
+
###### 追加の質問事項
|
478
|
+
|
479
|
+
・suspendの関数を実行するにあたり、現在の実装方法は正しいのでしょうか。
|
480
|
+
|
481
|
+
・今回のコードでファイルが空かどうか確認するために「isNullOrEmpty()」を使用するのは正しいのでしょうか。
|
482
|
+
|
483
|
+
・アプリを起動したタイミングで購入のキャッシュを確認するためにはどのような実装方法があるのでしょうか。
|
1
進捗と状況の変化を共有するため。
test
CHANGED
File without changes
|
test
CHANGED
@@ -305,3 +305,85 @@
|
|
305
305
|
[公式リファレンス - queryPurchasesAsyncについて](https://developer.android.com/reference/com/android/billingclient/api/BillingClient#queryPurchasesAsync(java.lang.String,%20com.android.billingclient.api.PurchasesResponseListener))
|
306
306
|
|
307
307
|
[Medium - Google Playアプリ内課金の実装方法ガイド](https://medium.com/@dkmczk/android%E9%96%8B%E7%99%BA-google-play%E3%82%A2%E3%83%97%E3%83%AA%E5%86%85%E8%AA%B2%E9%87%91%E3%81%AE%E5%AE%9F%E8%A3%85%E6%96%B9%E6%B3%95%E3%82%AC%E3%82%A4%E3%83%89-8be98331a35c)
|
308
|
+
|
309
|
+
### 【追記(2021.11.5)】
|
310
|
+
|
311
|
+
その後色々と試していると、「google playとの通信中には変数の値の書き換えができない」ことがわかりました。
|
312
|
+
|
313
|
+
|
314
|
+
|
315
|
+
そのため、google playとの通信のキャッシュを活用して、onResumeのタイミングで購入状況を確認する方法に変更しようと考えています。
|
316
|
+
|
317
|
+
アイテムが購入されているかを確認するためには、「queryPurchasesAsync()」を使用すると下記の公式リファレンスに説明があったので、リファレンスを参考に実装を進めています。
|
318
|
+
|
319
|
+
|
320
|
+
|
321
|
+
[公式リファレンス - queryPurchasesAsync()を使ったアプリ外購入の確認](https://developer.android.google.cn/google/play/billing/migrate?hl=ja#out-of-app)
|
322
|
+
|
323
|
+
[公式リファレンス - queryPurchasesAsync()](https://developer.android.com/reference/com/android/billingclient/api/BillingClient#queryPurchasesAsync(java.lang.String,%20com.android.billingclient.api.PurchasesResponseListener))
|
324
|
+
|
325
|
+
|
326
|
+
|
327
|
+
###### 追加の質問事項
|
328
|
+
|
329
|
+
「queryPurchasesAsync()」はsuspend関数内で実行する必要があります。
|
330
|
+
|
331
|
+
そのため、onResume内で普通に「queryPurchasesAsync()」と記述して実行することができません。
|
332
|
+
|
333
|
+
```kotlin
|
334
|
+
|
335
|
+
// Activity(画面)が表示、再開された際に呼ばれる
|
336
|
+
|
337
|
+
@RequiresApi(Build.VERSION_CODES.M)
|
338
|
+
|
339
|
+
override fun onResume() {
|
340
|
+
|
341
|
+
super.onResume()
|
342
|
+
|
343
|
+
// ビューの設定ができている場合(再開時に実行する)
|
344
|
+
|
345
|
+
if (textureView.isAvailable) {
|
346
|
+
|
347
|
+
// 購入履歴をチェック
|
348
|
+
|
349
|
+
queryPurchases() // ← onResumeもsuspendにしてください。とエラーが出る。
|
350
|
+
|
351
|
+
...
|
352
|
+
|
353
|
+
} else { // ビューの設定がまだ完了していない場合
|
354
|
+
|
355
|
+
...
|
356
|
+
|
357
|
+
}
|
358
|
+
|
359
|
+
}
|
360
|
+
|
361
|
+
|
362
|
+
|
363
|
+
...
|
364
|
+
|
365
|
+
|
366
|
+
|
367
|
+
// google playのキャッシュに購入履歴がないか確認する
|
368
|
+
|
369
|
+
suspend fun queryPurchases() {
|
370
|
+
|
371
|
+
val result = billingClient.queryPurchasesAsync(skuType = BillingClient.SkuType.INAPP)
|
372
|
+
|
373
|
+
if(result.purchasesList != null) { // 何かしらの購入履歴がキャッシュに残っている場合
|
374
|
+
|
375
|
+
purchaseSW = true
|
376
|
+
|
377
|
+
}
|
378
|
+
|
379
|
+
}
|
380
|
+
|
381
|
+
```
|
382
|
+
|
383
|
+
抜粋ですがコードは上記のようになっています。
|
384
|
+
|
385
|
+
|
386
|
+
|
387
|
+
<質問>
|
388
|
+
|
389
|
+
「onResume内で、suspendの関数を実行するためには、どのように記述すればよいのでしょうか。」
|