答えて

1

TrevorWileyの回答の実装は機能しますが、少し簡略化することができます。はい、NougatのPowerManagerはisLightDeviceIdleMode()で、@hideと注釈が付けられています。リフレクションを使用して呼び出すことができます。これは、PowerManagerの内部実装の詳細とは無関係で、より簡潔です。

public static boolean isLightDeviceIdleMode(final Context context) { 
    boolean result = false; 
    PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); 
    if (pm != null) { 
     try { 
      Method isLightDeviceIdleModeMethod = pm.getClass().getDeclaredMethod("isLightDeviceIdleMode"); 
      result = (boolean)isLightDeviceIdleModeMethod.invoke(pm); 
     } catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) { 
      Log.e(TAG, "Reflection failed for isLightDeviceIdleMode: " + e.toString(), e); 
     } 
    } 
    return result; 
} 

ほとんどの場合、TrevorWileyのブロードキャスト用に登録するための文字列の使用に同意します。上記の方法と同じように、リフレクションを使用してフィールドACTION_LIGHT_DEVICE_IDLE_MODE_CHANGEDの値を取得し、ハードコードされた文字列"android.os.action.LIGHT_DEVICE_IDLE_MODE_CHANGED"にフォールバックすることができます。

+0

私はこれ以上Androidの関連はしていないので、私はこの作品を確認することはできませんが、合理的なので、私はこれを受け入れられた答えに切り替えるよ。誰かがそれに悩まされると、彼らはいつも私の答えに戻ることができます。 – TrevorWiley

2

PowerManagerのオンラインドキュメントには言及されていませんが、最新のソースコード(API 24リビジョン1)にはこのような解決策があるはずです質問:

String ACTION_LIGHT_DEVICE_IDLE_MODE_CHANGED 
     = "android.os.action.LIGHT_DEVICE_IDLE_MODE_CHANGED" 
boolean isLightDeviceIdleMode() 

理論的には、意図的に受信者としてコードを登録して、関数の現在の値を確認するだけで済みます。 dumpsys activity broadcastsで掘り下げたものは、光のドーズ状態が変化したときに意図が実際に送信されることを示しています。

しかし、最新のSDKプラットフォーム(API 24改訂2)は、その中にこれらのシンボルを持っていない - 私はコンパイルエラーを取得(およびjavapjarといくつかの突きは、彼らが本当に存在していないことを示しています)。 Googleに目を向けると、これが意図した設計だと言われています。

上記の同じ文字列をハードコードしてから、リフレクションを使用してAPIで呼び出されたのと同じ機能を呼び出すことは回避策です。このように:

+0

不足しているAPIの調査については、https://code.google.com/p/android/issues/detail?id=222595をご覧ください。 – TrevorWiley

+0

私はGoogleのオフラインに連絡して、最後のコメントに記載されている問題は解決していません。現時点では、公式の回答が含まれています。 – TrevorWiley

関連する問題