2016-04-18 8 views
1

最近、私はアンドロイドウェアウォッチフェイスでアンビエントウェアを実装しようとしましたが、コーディングを実装した後、アンビエントモード(エミュレータ)に切り替えるとonAmbientModeChangedは呼び出されませんでした通常モードに2回呼び出されます。最初のトリガーはinAmbientModeがtrue、2番目のトリガーinAmbientModeがfalseです。onAmbientModeChangedはアンビエントウォッチフェイスでは呼び出されません

private class Engine extends CanvasWatchFaceService.Engine { 
    ... 
    ... 
    @Override 
    public void onAmbientModeChanged(boolean inAmbientMode) { 
     Log.e(TAG, "isInAmbientMode():" + inAmbientMode); 
     super.onAmbientModeChanged(inAmbientMode); 
     if (mLowBitAmbient) { 
      boolean antiAlias = !inAmbientMode; 
      setPaintAntiAlias(antiAlias); 
     } 

     invalidate(); 
     updateTimer(); 
    } 

    @override 
    public void onDraw(Canvas canvas, , Rect bounds){ 
     ... 
     for(int i=0;i<node.length;i++){ 
     //drawing canvas 
     } 
    } 
} 

AndroidManifest.xml 

<uses-permission android:name="com.google.android.permission.PROVIDE_BACKGROUND" /> 
<uses-permission android:name="android.permission.WAKE_LOCK" /> 
<uses-permission android:name="android.permission.INTERNET"/> 

周囲がオンのときにトリガーしないと何が問題になるのですか?それはバグか、これを引き起こすために何らかのパーミッションやクラスを追加する必要がありますか?どんな助けもありがとう。

EDIT:すると、周囲には通常モードに戻すまで、ウォッチフェイスは、ウォッチフェイスだけ何かをテストおよびデバッグした後、通常のウォッチフェイス

を描いた後、周囲ウォッチフェイスを描画します、再描画しません、私はforループがonAmbientModeChangedをトリガしなかった主な原因であることを知りました。forループをコメントアウトした後、onAmbientModeChangedも正常にトリガされますが、なぜそれが起こり、解決されたのかはわかりません。

+0

ループ内のオンドラフトは悪いのですか? –

答えて

0

私は、マシュマロ更新後にウォッチフェイスがアンビエントモードに無作為に切り替わらず、OSがウォッチフェイスを数ミリ秒間起床させて時刻を更新するまで、onTick()になるまで同様の問題が発生しました。私はこの問題がウェアーズのより積極的な睡眠方針に結びついていると思います。ドーズモードです。

私はonTick()方法は100msのための非参照カウントwakelockを保持していることを見た上で、私は、Androidのメーカーによって逆コンパイルし、それはJetBrainsのJavaバイトコードの逆コンパイラをバンドルしています、WatchFaceServiceコードを見ました。 onAmbientModeChanged()コールバックで同じことを試みましたが、私はウォッチフェイスをアンビエントモードでインタラクティブなスタイルで見たことがありませんでした。ここで

は、コードスニペットです:onCreate()

onAmbientModeChanged(…)
final PowerManager powerManager = (PowerManager) context.getSystemService(POWER_SERVICE); 
mWakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG); 
mWakeLock.setReferenceCounted(false); 

mWakeLock.acquire(100L); 

あなたは10msのにそれを設定することによって、微調整するwakelockの取得時間値を試すことができますウォッチフェイスをタップするたびに10msずつ増分します。

ウォッチフェイスが周囲モード切り替えをアニメーション化するので、この値を個人的にはより適切な値に変更しました。

ところで、モバイルデバイスのパフォーマンスが重要であるため、実行するには長すぎないと言われている回数だけ繰り返されるforループのコードを確認してください。私は個人的にウォッチフェイスのforループを使ってダニを描きましたが、最初にそれを作り、Bitmapにキャッシュすることでスムーズにしましたが、代わりにCanvas#drawLines(…)を使用します。

+0

あなたは本当に私の日を節約するのですが、100msを使う代わりに私はタイムアウトを使わないようにしました。なぜなら、私のタイムアウトを使用した後はいつかはAmbientになるでしょう。もう一度ありがとう! –

+0

あなたはウォークロックを恒久的に保持していますか? –

+0

申し訳ありません私は恒久的に意味するwakelockを保持することを理解していません。私はそれをondestroyで解放し、inAmbientModeがtrueのときに取得します。タイムアウトを使わずに取得すると問題はありますか? –

0

USB接続のPolar M600では、私はonAmbientModeChanged()呼び出しを受け取らないし、isInAmbientMode()も機能しません。

USB接続なしでは、onAmbientModeChanged()およびisInAmbientMode()は確実に動作しません。

私のハックを使用することです:

onTapCommand()真mAmbient = を設定するための(私自身)真(onAmbientModeChanged呼び出し) (最初のタップは、クロックを起こすために消費されますが、私はより多くの情報が必要な場合は、私は

onTimerTick)を再度タップする1分の遅延まで( )自分(偽mAmbient = を設定するために)(私はnAmbientModeChanged(偽を呼び出す)が、私のために)

ワークス問題ではありません。

関連する問題