Создайте собственный шаблон вибрации
Во-первых, вам нужно объявить это разрешение в своем манифесте.
<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