質問編集履歴

2

進捗と現状の共有のため。

2021/11/05 09:18

投稿

m-mega
m-mega

スコア56

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

進捗と状況の変化を共有するため。

2021/11/05 09:18

投稿

m-mega
m-mega

スコア56

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の関数を実行するためには、どのように記述すればよいのでしょうか。」