2011-09-04 2 views

답변

5

이 볼륨의 변화를 감지 할 방송 활동은 없지만, 그럴 수 어쩌면 모든 초 볼륨이 getStreamVolume으로하고 특정 볼륨을 고정해야하는 경우, 매 2 초 사용 어떤 두 검사 : setStreamVolume

자세한 내용은 http://developer.android.com/reference/android/media/AudioManager.htm을 확인하십시오.

AlarmManager 클래스 또는 처리기를 사용하여 1 초마다 볼륨을 확인할 수 있습니다.

활동 인 경우 키 누름을 감지하기 위해 onKeyDown을 무시할 수 있습니다. http://developer.android.com/reference/android/view/View.html

5

실제로 Content Observer를 사용하여 서비스 할 수있는 한 가지 방법이 있습니다. 그것은

public class VolumeService extends Service{ 
AudioManager mAudioManager; 
Handler mHandler; 

private ContentObserver mVolumeObserver = new ContentObserver(mHandler) { 
    @Override 
    public void onChange(boolean selfChange) { 
     super.onChange(selfChange); 
     if (mAudioManager != null) { 

      final int volume = mAudioManager.getStreamVolume(AudioManager.STREAM_RING); 
      System.out.println("Volume thay đổi: " +volume); 

      Intent photoIntent = new Intent(VolumeService.this,TakePhotoActivity.class); 
      photoIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
      startActivity(photoIntent); 
     } 
    } 
}; 





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

    System.out.println("Volume Service started"); 

    mAudioManager = (AudioManager) getSystemService(AUDIO_SERVICE); 

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

    System.out.println("Đã đăng ký Volume listener"); 
} 



@Override 
public void onDestroy() { 
    super.onDestroy();  
    System.out.println("Volume service destroied"); 

    getContentResolver().unregisterContentObserver(mVolumeObserver); 
} 



@Override 
public IBinder onBind(Intent arg0) { 

    return null; 
} 

} 

잊지 마세요 그것을 선언하는 서비스에 다음 코드를 사용하여 ... 통화 로그, 음량, 연락처로 내용을 변경하는 이벤트를 수신하는 방송 수신기처럼 작동 안드로이드 Manifest.xml

<service android:name=".service.VolumeService" > 
+0

나중에 전화가 잠겨 있지 않을 때 작동하지만 휴대 전화가 잠겨 있지 않을 때 !! ?? – Hardik

+0

안녕하세요, 전화가 잠겨있는 동안 키 감지를받을 수있는 옵션이 있습니까? –

0

이 그것을 할 수있는 한 방법입니다, 당신은 단지 세트 볼륨 대신의 변화에 ​​해결할 수 있습니다. 내 목표는 시스템 볼륨 서비스를 조정하는 것이 었습니다.

또한 필요한 경우에만이 작업을 수행하지 마십시오.

public class VolumeKeyController { 

    private MediaSessionCompat mMediaSession; 
    private final Context mContext; 

    public VolumeKeyController(Context context) { 
     mContext = context; 
    } 

    private void createMediaSession() { 
     mMediaSession = new MediaSessionCompat(mContext, KeyUtil.log); 

     mMediaSession.setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS | 
       MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS); 
     mMediaSession.setPlaybackState(new Builder() 
       .setState(PlaybackStateCompat.STATE_PLAYING, 0, 0) 
       .build()); 
     mMediaSession.setPlaybackToRemote(getVolumeProvider()); 
     mMediaSession.setActive(true); 
    } 

    private VolumeProviderCompat getVolumeProvider() { 
     final AudioManager audio = mContext.getSystemService(Context.AUDIO_SERVICE); 

     int STREAM_TYPE = AudioManager.STREAM_MUSIC; 
     int currentVolume = audio.getStreamVolume(STREAM_TYPE); 
     int maxVolume = audio.getStreamMaxVolume(STREAM_TYPE); 
     final int VOLUME_UP = 1; 
     final int VOLUME_DOWN = -1; 

     return new VolumeProviderCompat(VolumeProviderCompat.VOLUME_CONTROL_RELATIVE, maxVolume, currentVolume) { 
      @Override 
      public void onAdjustVolume(int direction) { 
       // Up = 1, Down = -1, Release = 0 
       // Replace with your action, if you don't want to adjust system volume 
       if (direction == VOLUME_UP) { 
        audio.adjustStreamVolume(STREAM_TYPE, 
          AudioManager.ADJUST_RAISE, AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE); 
       } 
       else if (direction == VOLUME_DOWN) { 
        audio.adjustStreamVolume(STREAM_TYPE, 
          AudioManager.ADJUST_LOWER, AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE); 
       } 
       setCurrentVolume(audio.getStreamVolume(STREAM_TYPE)); 
      } 
     }; 
    } 

    // Call when control needed, add a call to constructor if needed immediately 
    public void setActive(boolean active) { 
     if (mMediaSession != null) { 
      mMediaSession.setActive(active); 
      return; 
     } 
     createMediaSession(); 
    } 

    // Call from Service's onDestroy method 
    public void destroy() { 
     if (mMediaSession != null) { 
      mMediaSession.release(); 
     } 
    } 
}