2017-01-17 27 views
0

私は、アプリケーションでユーザーイベントを追跡するためのライブラリを作成しています。ユーザーがライブラリのアプリのホーム画面でボリュームボタンを2回押したときにコールバックしたいアクティビティを延長せずにコールバックを取得するにはどうすればよいですか。 onKeyDownはアクティビティでのみ動作します。
私は音量に変化がないとき、これはのonChangeを呼び出していない音量ボタンのキーイベントのリスナー

public class SettingsContentObserver extends ContentObserver 
{ 
    int previousVolume; 
    Context context; 

    public SettingsContentObserver(Context c, Handler handler) 
    { 
     super(handler); 
     context = c; 

     AudioManager audio = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); 
     previousVolume = audio.getStreamVolume(AudioManager.RINGER_MODE_NORMAL); 
     Log.i("myTag", "SettingsContentObserver previousVolume = " + previousVolume); 
    } 

    @Override 
    public boolean deliverSelfNotifications() 
    { 
     return super.deliverSelfNotifications(); 
    } 

    @Override 
    public void onChange(boolean selfChange) 
    { 
     super.onChange(selfChange); 

     AudioManager audio = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); 
     int currentVolume = audio.getStreamVolume(AudioManager.RINGER_MODE_NORMAL); 

     Log.d("myTag", currentVolume + " currentVolume"); 

     int delta = previousVolume - currentVolume; 

     if (delta > 0) 
     { 
      Log.i("myTag", delta + " Decreased"); 
      previousVolume = currentVolume; 
     } 
     else if (delta < 0) 
     { 
      Log.i("myTag", delta + " Increased"); 
      previousVolume = currentVolume; 
     } 
    } 
} 

を試してみました。例えば、ユーザが音量アップボタンを押したときに音量が満杯になると、音量が上がらない。同様に、ボリュームが0の場合、ユーザーがボリュームを押し下げると、呼び出されません。どのようにコールバックを得ることができますか?

+0

あなたは、このクラスではdispatchKeyEventを使用することができますか? –

+0

いいえ、できません。同じようなonKeyDown –

答えて

0

ホーム画面でキーイベントを聞く方法はわかりませんが、コンテンツオブザーバーを使用して音量を聞く方法があります。音量、連絡先、通話履歴などのコンテンツが変更されたときに呼び出されるブロードキャスト受信機のようなものですが、電話がスリープ状態にあるときは機能しません。

は、ここでは、コードです:

public class Service_VolumeListener extends Service{ 
AudioManager audioManager; 
Handler handler; 

private ContentObserver volumeObserver = new ContentObserver(handler) { 
    @Override 
    public void onChange(boolean selfChange) { 
     super.onChange(selfChange); 
     if (audioManager != null) { 

      final int volume = audioManager.getStreamVolume(AudioManager.STREAM_RING); 
      Log.d("VOL_STATS", "Volume Changed: " +volume); 
     } 
    } 
}; 

@Override 
public void onCreate() { 
    super.onCreate(); 

    audioManager = (AudioManager) getSystemService(AUDIO_SERVICE); 

    Uri uri = Settings.System.getUriFor(Settings.System.VOLUME_SETTINGS[AudioManager.STREAM_RING]); 
    getContentResolver().registerContentObserver(uri, true, volumeObserver); 

    //Volume listener Registered 
} 

@Override 
public void onDestroy() { 
    super.onDestroy();  

    getContentResolver().unregisterContentObserver(volumeObserver); 
    //Volume service unregistered 
} 

@Override 
public IBinder onBind(Intent arg0) { 

    return null; 
} 
} 
+0

Settings.System.VOLUME_SETTINGSはサポートされなくなりました –

+0

次に、このコードでこの行を置き換えてみてください。 "Uri uri = Settings.System.getUriFor(" VOLUME_RING ");"それが動作すれば私に知らせてください –

+0

Na。それも機能していない。 –

関連する問題