震动API

震动这个接口的发展历史很奇特,Symbian OS v8.x之前没有提供震动接口,之后开始使用CVibraControl类提供震动接口,而在Symbian OS v9.x之后在保留原有接口基础上又提供了新的CHWRMVibra类来提供震动接口。

 

// for S60 2nd FP2 and FP3

#include <vibractrl.h>  // CVibraControl, VibraCtrl.lib

 

void DoVibrateL( TUint16 aDuration )

{

  CVibraControl* control = VibraFactory::NewL();

  // get vibration setting in the user profile

  if ( CVibraControl::EVibraModeON == control->VibraSettings() ) 

  {

     control->StartVibraL( aDuration );

  }

 

  delete control;

  control = NULL;

}

 

// for S60 3rd

#include <hwrmvibra.h>  // CHWRMVibra, HWRMVibraClient.lib

 

void DoVibrateL( TInt aDuration )

{

  CHWRMVibra* vibra = CHWRMVibra::NewLC();

  // get vibration setting in the user profile

  if ( CHWRMVibra::EVibraModeON == vibra->VibraSettings() ) 

  {

     vibra->StartVibraL( aDuration );

  }

 

  CleanupStack::PopAndDestroy( vibra );

}

事实上如果原封不动拷贝如上代码是实现不了震动功能的,因为不管是CHWRMVibra还是CVibraControl对象在被新建并调用完StartVibraL函数之后,立即就被析构了,因为StartVibraL有类似异步函数的功能,并非阻塞在持续时间之内才会返回,所以对象还没起振就删除了。

震动功能的实现代码虽然简单,但是要想震起来还是有点麻烦的,为此我在使用时除了以上问题,还遇到其它几个问题:

当前情景模式里震动提示设置为关时,显然会因为

if ( CVibraControl::EVibraModeON == control->VibraSettings() )

if ( CHWRMVibra::EVibraModeON == vibra->VibraSettings() )

两个条件判断没通过而没有真实调用StartVibraL函数,那么我如果将判断去掉,始终让其调用StartVibraL函数应该也会震动的吧?

结果是震动函数返回-21即KErrAccessDenied(拒绝接受),这和播放声音提示时的效果完全两样,所以说读情景配置模式里的参数在这里完全是必要的。

好,那就加判断,总算执行到了StartVibraL (TUint16 aDuration, TInt aIntensity)函数,假如在这里aDuration超过KHWRMVibraMaxDuration,或者aIntensity不在-100到100之间(这里的强度值是马达的运转强度值,负值是马达反转,有些文章说该值在+-30范围内会报-2即KErrGeneral错误,但是自己用E65亲测过,在+-30以内,没有报错,震动感不强烈而已,可能跟手机和具体硬件有关吧),那么震动效果又没有起来,此时的震动函数返回为-6,即KErrAgument(错误要求)。

我们解决了以上两个问题后,还有两种特殊情况,一种是当你的手机在充电时,如果调用正确的StartVibraL会返回-22错误,即KErrLocked(锁闭)。以上几种情况还好,虽然不震,但是你可以用TRAP机制捕获错误码,但是如果当你是通过数据线的手机PC模式装上软件后没有拔出数据线,就算使用TRAP返回时KErrNone,但是手机还是没有震动起来,你就会头大了,难道这个函数在当前手机上不管用吗?

事实是,当你拔掉数据线,居然震动来了。

唉,问题总算解决了,代码虽简单,但是实现却并不简单啊。

 

 

 

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/linzhiji/archive/2010/02/04/5288682.aspx

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值