2

着信時に連絡先ごとに異なる振動パターンを設定するにはどうすればよいですか?

私の研究開発中に、私はこれを参照しました:

1)特定の着信時にカスタマイズされたバイブレーションを提供する
方法 2)着信コールの振動レベルを変更する方法 着信コールが行われたときの振動レベルは?

しかし、これでは成功しませんでしたが、着信ごとに異なる振動パターンを設定できます。それが可能だ。

例のアプリ:

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

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

誰かがこの問題についてアドバイスをくれることを願っています。これらの 2 つの方法またはその他の提案に関するコメントを歓迎します。

4

1 に答える 1

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);

ここを参照

連絡先の名前を取得する

いつものように、許可を宣言します

<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);
于 2015-02-24T19:05:43.490 に答える