首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在android中通过呼叫设置定制的振动

在android中通过呼叫设置定制的振动
EN

Stack Overflow用户
提问于 2015-02-24 17:59:05
回答 1查看 2.2K关注 0票数 2

我们如何设置不同的振动模式,为不同的接触与来电?

在我的研究和开发过程中,我引用了以下几点:

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

我希望有人能就这个问题提出一些建议。欢迎对这两种方式的评论或其他建议。

EN

回答 1

Stack Overflow用户

发布于 2015-02-24 19:05:43

创建一个自定义的振动模式

首先,您需要在清单中声明此权限。

代码语言:javascript
运行
复制
<uses-permission android:name="android.permission.VIBRATE"/>

其次,您需要获得一个Vibrator类的实例。

代码语言:javascript
运行
复制
Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);

以下是关于如何建立自定义振动模式的建议

代码语言:javascript
运行
复制
// 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);

参考这里

获取联系人姓名

和往常一样,宣布许可

代码语言:javascript
运行
复制
<uses-permission android:name="android.permission.READ_CONTACTS" />

使用ContentResolver查询获取联系人。此查询以String的形式获取联系人id、姓名和电话号码。

代码语言:javascript
运行
复制
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 -> patternname -> patternphone_nr -> pattern来完成。同样,这也是您对实现设计的选择。就我个人而言,我会实现数据库支持,因为它支持可维护性和可伸缩性,映射phone_nr -> pattern

例如,您实现了两种方法来设置映射,另一种方法用于从给定的phone_nr获取映射。

集映射

代码语言:javascript
运行
复制
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();
    }

}

获取模式

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
<receiver android:name=".CallReceiver" >
    <intent-filter>
        <action android:name="android.intent.action.PHONE_STATE" />
    </intent-filter>
</receiver> 

接收类

代码语言:javascript
运行
复制
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);
    }
}

编辑

要关闭振动,可以使用以下代码:

代码语言:javascript
运行
复制
AudioManager am =(AudioManager)getSystemService(Context.AUDIO_SERVICE);
am.setRingerMode(AudioManager.RINGER_MODE_SILENT);

为了再次启用它:

代码语言:javascript
运行
复制
am.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28702944

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档