我们如何为来电的不同联系人设置不同的振动模式?
在我的研究和开发过程中,我对此进行了评论:
1)How to provide customized vibration on specific incoming calls
2)How to change incoming call Vibration level when incoming call made?
但是我没有成功,而我们可以设置不同的来电不同的振动模式。这是可能的。
示例app:
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
我希望有人可以就这个问题提出一些建议。欢迎对这两种方式或其他方式提出意见。
答案 0 :(得分:2)
首先,您需要在清单中声明此权限
<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);
参考here
像往常一样,宣布许可
<uses-permission android:name="android.permission.READ_CONTACTS" />
使用ContentResolver
查询获取联系人。此查询将联系人ID,姓名和电话号码提取为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();
}
}
}
参考here
此映射存储可以通过多种方式完成,具体取决于您对persistent storage实施的选择。我认为,有两种显而易见的方法
此外,实际映射可以由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);