カスタム バイブレーション パターンを作成する
まず、マニフェストでこの許可を宣言する必要があります
<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
ます。このクエリは、連絡先 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();
}
}
}
ここを参照
接触を振動パターンにマッピングする
このマッピング ストレージは、選択した永続ストレージの実装に応じて、いくつかの方法で実行できます。私が見ているように、2つの明白な方法があります
id -> pattern
また、実際のマッピングは、name -> pattern
またはのいずれかで行うことができますphone_nr -> pattern
。繰り返しますが、それは実装設計の選択です。個人的には、保守性とスケーラビリティ、マッピングをサポートするため、データベース サポートを実装しますphone_nr -> pattern
。
たとえば、マッピングを設定する 2 つのメソッドと、特定の からそのマッピングを取得する別のメソッドを実装します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);