Установить индивидуальную вибрацию при входящем звонке в Android

Как мы можем установить разные шаблоны вибрации для разных контактов при входящем звонке?

Во время моих исследований и разработок я ссылался на это:

1) Как настроить вибрацию при определенных входящих вызовах
2) Как изменить уровень вибрации при входящем звонке при входящем звонке?

Но у меня с этим ничего не вышло, а на разные входящие звонки можно поставить разные виброзвонки. это возможно.

Пример приложения:

1) https://play.google.com/store/apps/details?id=ac.vibration&hl=en

2) https://play.google.com/store/apps/details?id=com.bfc.morsecall

Я надеюсь, что кто-то может дать несколько советов по этому вопросу. Приветствуются комментарии по поводу этих двух способов или других предложений.


person Jetly Brevo    schedule 24.02.2015    source источник


Ответы (1)


Создайте собственный шаблон вибрации

Во-первых, вам нужно объявить это разрешение в своем манифесте.

<uses-permission android:name="android.permission.VIBRATE"/>

Во-вторых, вам нужно будет получить экземпляр класса Vibrator.

Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);

Вот предложение о том, как вы можете настроить собственный шаблон вибрации

// Start without a delay
// Each element then alternates between vibrate, sleep, vibrate, sleep...
long[] pattern = {0, 100, 1000, 300, 200, 100, 500, 200, 100};

// The '-1' here means to vibrate once, as '-1' is out of bounds in the pattern array
v.vibrate(pattern, -1);

Ссылка здесь

Получить имена контактов

Как обычно, объявить разрешение

<uses-permission android:name="android.permission.READ_CONTACTS" />

Получить контакты с помощью ContentResolver запроса. Этот запрос извлекает идентификатор контакта, имя и номер телефона как String.

ContentResolver cr = getContentResolver();
        Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI,
                null, null, null, null);
        if (cur.getCount() > 0) {
            while (cur.moveToNext()) {
                  String id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));
                  String name = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));                      
                  if (Integer.parseInt(cur.getString(
                        cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) {
                     Cursor pCur = cr.query(
                               ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                               null,
                               ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?",
                               new String[]{id}, null);
                     while (pCur.moveToNext()) {
                         String phoneNo = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                         Toast.makeText(NativeContentProvider.this, "Name: " + name + ", Phone No: " + phoneNo, Toast.LENGTH_SHORT).show();
                     }
                    pCur.close();
                }
            }
        }

Ссылка здесь

Сопоставьте контакт с шаблоном вибрации

Это сопоставление хранилища может быть выполнено несколькими способами, в зависимости от вашего выбора постоянное хранилище реализации. Как я вижу, есть два очевидных пути

Кроме того, фактическое сопоставление может быть выполнено с помощью id -> pattern, name -> pattern или phone_nr -> pattern. Опять же, это ваш выбор дизайна реализации. Лично я бы реализовал поддержку базы данных, потому что она поддерживает удобство сопровождения и масштабируемость, отображая phone_nr -> pattern.

Например, вы реализуете два метода для установки сопоставления и еще один метод для получения этого сопоставления из заданного phone_nr.

Установить сопоставление

public void setPatternMapping(String phonr_nr, long[] pattern){

    //Database call here. Example:
    try{
        database.open();
        database.setPattern(phone_nr, pattern);
        database.close();
    }catch(SQLiteException e){
        e.printStackTrace();
    }

}

Получить шаблон

public long[] getPattern(String phone_nr){

    //Database call here. Example:
    long[] pattern = null;
    try{
        database.open();
        pattern = database.setPattern(phone_nr, pattern);
        database.close();
    }catch(SQLiteException e){
        e.printStackTrace();
    }
    return pattern;

}

Использование всего этого

Для прослушивания входящего звонка можно реализовать прослушиватель в виде BroadcastReceiver. Класс получателя прослушивает CallStateChange, поэтому, когда вы получаете входящий вызов, вы получаете номер телефона для входящего вызова. Довольно удобно, если вы сопоставили телефонный номер со своим шаблоном вибрации, как показано выше.

В вашем AndroidManifest.xml:

<receiver android:name=".CallReceiver" >
    <intent-filter>
        <action android:name="android.intent.action.PHONE_STATE" />
    </intent-filter>
</receiver> 

Класс приемника

public class CallReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(final Context context, Intent intent) {
        TelephonyManager telephony = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
        telephony.listen(new PhoneStateListener(){
            @Override
            public void onCallStateChanged(int state, String incomingNumber) {
                super.onCallStateChanged(state, incomingNumber);

                //Make a database call, to get the vibrate pattern 
                long[] pattern = getPattern(incomingNumber);
                //Set the phone to vibrate using that pattern, if there was a mapping
                if(pattern != null){                     
                    Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
                    v.vibrate(pattern, -1);
                }
                System.out.println("incomingNumber : "+incomingNumber);
            }
        },PhoneStateListener.LISTEN_CALL_STATE);
    }
}

Изменить

Чтобы отключить вибрацию, вы можете использовать этот код:

AudioManager am =(AudioManager)getSystemService(Context.AUDIO_SERVICE);
am.setRingerMode(AudioManager.RINGER_MODE_SILENT);

Чтобы включить его снова:

am.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
person Marcus    schedule 24.02.2015
comment
Спасибо за ответ и хорошее объяснение, но это не отключит текущую вибрацию входящего вызова, чего я пытаюсь добиться, это изменить вибрацию входящего вызова. Если текущая вибрация устройства включена, этот код не работает. поэтому нам нужно сначала включить вибрацию, а затем вибрировать телефон с нашей настройкой вибрации. Пожалуйста, дайте мне знать, как мы можем этого добиться. - person Jetly Brevo; 25.02.2015