1

Geofence API を使用する Android アプリがあります

val intent = Intent(contextProvider.context, GeofenceReceiver::class.java)
val pendingIntent= PendingIntent.getBroadcast(contextProvider.context,0,intent,PendingIntent.FLAG_UPDATE_CURRENT)
val builder = GeofencingRequest.Builder()  
builder.setInitialTrigger(initialTrigger)
addGeofences(builder) // in this function I have the code to add one or more geofences
geofencingRequest = builder.build()

コードは正常に動作し、デバイスがアイドル状態でない場合、ブロードキャスト レシーバーでメソッド onReceive が呼び出されます。アイドル期間中、デバイスはまったく反応しません。

マニフェストにアクセス許可を追加しようとしましたがREQUEST_IGNORE_BATTERY_OPTIMIZATIONS、別の場所でコードを呼び出します

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    val powerManager = context.getSystemService(POWER_SERVICE) as PowerManager
    val packageName = context.applicationContext.packageName
    val ignoringOptimizations = powerManager.isIgnoringBatteryOptimizations(packageName)

    if (!ignoringOptimizations) {
        val intent = Intent(ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS)
        intent.setData(Uri.parse("package:$packageName"))
        context.startActivity(intent)
    } 
}

バッテリーの最適化を無視することをまだ許可していない場合は、それを求めるダイアログが表示されます。アプリの動作に違いは見られません。新しいアクセス許可が機能するかどうかを確認するために、カウンターの値を毎秒記録するバックグラウンド スレッドを用意しました。

Single.fromCallable {
    var counter = 0
    do {
        Timber.i("#$counter")
        Thread.sleep(1000)
    } while (counter++ < 120)
}.subscribeOn(Schedulers.io()).subscribe({
    Timber.i("onSuccess")
},
    {
        Timber.e("onError: $it")

    })

これは私が得るログの種類です:

Mi. Apr. 17 2019 at 13:47:27:662 :    - #1
Mi. Apr. 17 2019 at 13:47:28:674 :    - #2
Mi. Apr. 17 2019 at 13:47:29:683 :    - #3
Mi. Apr. 17 2019 at 13:47:30:693 :    - #4
Mi. Apr. 17 2019 at 13:47:31:700 :    - #5
Mi. Apr. 17 2019 at 13:47:32:707 :    - #6
Mi. Apr. 17 2019 at 13:47:33:719 :    - #7
Mi. Apr. 17 2019 at 13:47:40:008 :    - #8
Mi. Apr. 17 2019 at 13:47:41:018 :    - #9
Mi. Apr. 17 2019 at 13:47:42:036 :    - #10
Mi. Apr. 17 2019 at 13:48:55:449 :    - #11
Mi. Apr. 17 2019 at 13:48:56:457 :    - #12
Mi. Apr. 17 2019 at 13:48:57:471 :    - #13

最初は毎秒新しい出力があり、その後、いくつかの遅れがあることに気付くでしょう。この遅れはアイドルモードが原因だと思います。バッテリー最適化の有無にかかわらず、同様のログを取得します。

私のアプリは、アプリがアイドル状態になるのを避けるためのフォアグラウンド サービスも使用していますが、何の効果もないようです。

最後に 2 つの質問があります。

1-アプリへの影響を確認するために、バッテリーの最適化を無視する権限をどのように使用すればよいですか?

2-デバイスがアイドル状態のときにジオフェンスを管理するためのより良い方法はありますか?

ありがとう!

4

0 に答える 0