2011-08-24 3 views
0

나는 PHONE_STATE에서 변경 사항을 듣고있는 BroadcastReceiver를 만들었습니다. onReceive 메서드에서 시스템 바이브레이터를 끄고 싶습니다. 나는 다른 접근법을 시도했지만 그들 중 아직까지는 효과가 없었다.안드로이드 전화 수신시 시스템 진동 중지

AudioManager audioManager = (AudioManager)ctx.getSystemService(Context.AUDIO_SERVICE); 
systemVibration = audioManager.getVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER); 
audioManager.setVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER, AudioManager.VIBRATE_SETTING_OFF); 

또는

Vibrator vib = (Vibrator)ctx.getSystemService(Context.VIBRATOR_SERVICE); 
vib.cancel(); 

또는

System.putInt(ctx.getContentResolver(), System.VIBRATE_ON, 0); 

또는 모두 함께.

AudioManager의 첫 번째 접근 방식은 실제로 진동에 대한 시스템 설정을 변경하지만 현재 진행중인 시스템 설정에는 영향을 미치지 않습니다.

어떤 아이디어가 있습니까?

사이먼

답변

0

이 시도 : (빌려 안드로이드 소스에서 수정)

AudioManager am = Context.getSystemService(Context.AUDIO_SERVICE); 
boolean vibeInSilent = false; 
int callsVibrateSetting = AudioManager.VIBRATE_SETTING_OFF; 

Settings.System.putInt(getContentResolver(), 
     Settings.System.VIBRATE_IN_SILENT, 
     vibeInSilent ? 1 : 0); 

//mAudioManager.setRingerMode(AudioManager.RINGER_MODE_VIBRATE); 
//or (not sure which one will work) 
//mAudioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT); 

am.setVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER, 
     callsVibrateSetting); 
+1

이전에 코드를 잘랐습니다. 여기에 2 가지 문제가 있습니다. 1. 전화가 자동 모드가 아니며 2. Settings.System.VIBRATE_IN_SILENT 값을 찾을 수 없습니다. 안드로이드의 어떤 버전이되어야 하는가? 버전 2.1 (7) – SimonSays

+0

Settings.System.VIBRATE_IN_SILENT 2.1 사용하고 있습니다. 그것은 단지 문서에 숨겨져 있습니다. 상수가 작동하지 않습니까? 자동 모드가 아닌데도이 두 줄 중 하나의 주석을 제거해야합니다. –

+0

VIBRATE_IN_SILENT를 확인할 수 없으며 향후 릴리스에서 제거 될 가능성이 큰 문서입니다. 방금 대신 문자열 값 "vibrate_in_silent"를 사용했습니다. 이것은 실제로 작동하지만, 사실상 내 의도가 아닌 자동 모드로 전화를 전환합니다. 링거 모드는 손대지 않아야하며 진동 만 차단해야합니다. – SimonSays

1

이제 안드로이드에서 사용할 수 없습니다 다른 프로세스에 의해 시작 진동을 중지하고, 따라서이 해킹 진동을 막을 수 있거나 줄 것이다 당신은 진동을 멈추었다 고 느낍니다.

long timea = System.currentTimeMillis(); 진동기 v = (진동기) getSystemService (Context.VIBRATOR_SERVICE);

while ((System.currentTimeMillis() - timea) < 15000) { v.vibrate (1); { Thread.sleep (10); } catch (InterruptedException e) {} }