Simulando a vibração como ao receber uma chamada
Pergunta
Então, estou tentando simular que o telefone está recebendo uma ligação. Eu extraí com sucesso o toque de telefones e toquei. Agora eu quero simular a vibração. Embora eu possa fazer o telefone vibrar, quero imitar o padrão exato com o qual o telefone vibra como quando recebe uma chamada. Existe alguma configuração ou classe que eu possa usar para extrair esse padrão e também detectar se a vibração está ligada?
Solução
Você tem que vibrar em um padrão.
Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
// 1. Vibrate for 1000 milliseconds
long milliseconds = 1000;
v.vibrate(milliseconds);
// 2. Vibrate in a Pattern with 500ms on, 500ms off for 5 times
long[] pattern = { 500, 300 };
v.vibrate(pattern, 5);
http://www.androidsnippets.org/snippets/22/
Não tenho certeza de qual padrão é usado como padrão, você provavelmente pode encontrá -lo na fonte, ou então continue tentando diferentes padrões até que seja satisfatório.
Outras dicas
Por que não usar a fonte do Android para ver como eles fazem isso?
A fonte do aplicativo de telefone está disponível em
https://android.googlesource.com/platform/packages/apps/phone
Parece que não há classe que possa fornecer configurações de vibração 'Standart' para a chamada recebida. Como a maioria dos telefones vem com aplicativos personalizados de chamadores de fornecedores e, como existem muitos aplicativos de chamadas personalizados no Google Play, esse padrão 'Standart' provavelmente nem existe.
O aplicativo Standart Caller da AOSP usa esse padrão:
private static final int VIBRATE_LENGTH = 1000; // ms
private static final int PAUSE_LENGTH = 1000; // ms
E para detectar se a vibração está ligada:
boolean shouldVibrate() {
AudioManager audioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
int ringerMode = audioManager.getRingerMode();
if (Settings.System.getInt(mContext.getContentResolver(), "vibrate_when_ringing", 0) > 0) {
return ringerMode != AudioManager.RINGER_MODE_SILENT;
} else {
return ringerMode == AudioManager.RINGER_MODE_VIBRATE;
}
}
Isso se baseia nas configurações "vibrar enquanto tocar" e "modo de som" que você pode encontrar nas configurações do telefone Standart.