2012-01-10 74 views
22

該程序的功能如下:用戶有一個電話號碼列表,只有在沒有其他系統範圍的應用程序會提供振動時,手機纔可以在來電時振動(例如如靜音模式)。我知道這在某種程度上違背了規則,因爲應用程序應該尊重用戶的設置,但應用程序僅限於某些具有此需求的用戶。我已經嘗試了兩種方式,但他們都不是令人滿意的:如何爲特定來電提供自定義振動

  1. 聽電話態,並用我自己的方式(與Vibrator.vibrate())直接觸發振動服務。當手機處於CALL_STATE_RINGING狀態時,此方法對於沒有來電仍然有效且我認爲這是因爲與實際處理來電時振動的系統範圍應用程序的衝突。

  2. 法官是否是手機在來電振動(與AudioManager.shouldVibrate()),並決定是否改變振動設置(與AudioManager.setRingerMode()AudioManager.setVibrateSetting())。如果我的應用程序更改了振動設置,一旦手機恢復到CALL_STATE_IDLE狀態,它們將被恢復。然而,這種方法有時仍然不起作用,沒有任何理由。

我希望有人能就這個問題提出一些建議。歡迎對這兩種方式或其他建議進行評論。

+0

上有何進展? – Rizon 2012-03-13 22:55:34

+2

@Rizon不幸的是,這個問題贏得了一個風滾草徽章。 – peter 2012-03-14 01:30:32

+0

這是不一樣的,但有人嘗試禁用振動打電話,它證明是不可能的,但結果是有趣的你:http://stackoverflow.com/q/8065862/969325 – Warpzit 2012-04-28 18:59:42

回答

6

爲了讓手機振動,您需要使用兩個設置進行播放。第一個是聲音模式,需要通過使用AufioManager設置:

AudioManager audioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE); 
audioManager.setRingerMode(targetSoundMode); 

第二部分是不正確的記錄,我相信這是你的代碼中缺失的部分:

String VIBRATE_IN_SILENT_SETTING_NAME = "vibrate_in_silent"; 
Settings.System.putInt(getContentResolver(), VIBRATE_IN_SILENT_SETTING_NAME, 1); 

使用1打開振動,0打開振動。

充分了解你應該如何與振動設置和工作模式來看看下面的鏈接: http://hi-android.info/src/com/android/settings/SoundSettings.java.html

+0

感謝您的回答!但是這不是阻止振動器的原因,因爲'vibrate_in_silent'已經設置爲1. Phone.apk可能在我們觸發後立即取消振動器嗎?根據[VibratorService.java](http://androidxref.com/source/xref/frameworks/base/services/java/com/android/server/VibratorService.java),振動器會在這種情況下隨機行爲。這就解釋了爲什麼這個問題只發生在一些手機上:Phone.apk不是系統的一部分。 – peter 2012-05-09 15:10:42

+2

你看過上面鏈接的setPhoneVibrateSettingValue函數嗎?這兩個設置之間有一些依賴關係,應該非常仔細地處理 – Muzikant 2012-05-10 12:38:51

+0

依賴關係是我錯過的東西。我將在更多設備上執行一些測試以確定依賴性。提前致謝! +1給你。 – peter 2012-05-11 02:25:41