云's profile哈侃8侃PhotosBlogLists Tools Help

Blog


    8/10/2006

    扫街

                        
     
          
     
         
    8/9/2006

    操作系统版本

    TInt machineId;
    HAL::Get(HALData::EMachineUid, machineId);

    Knowing machineId you can determin OS version:

    enum TMachineID
    {
    // S60 1st Edition (0.9) Symbian v.6.1
    ENokia7650 = 0x101F4FC3
    ,ENokiaNGage = 0x101F8C19
    ,ENokiaNGageQD = 0x101FB2B1

    // S60 1st Edition, FP1 (1.2) Symbian v.6.1
    ,ENokia3650 = 0x101F466A
    ,ENokia3660 = ENokia3650
    ,ESendoX = 0X101FA031
    ,ESiemensSX1 = 0x101F9071

    // S60 2nd Edition Symbian v.7.0s
    ,ENokia6600 = 0x101FB3DD

    // S60 2nd Edition, FP1 Symbian v.7.0s
    ,ENokia3230 = 0x10200F97
    ,ENokia6260 = 0x101FB3F4
    ,ENokia6620 = 0x101F3EE3
    ,ENokia6670 = 0x101FB3F3
    ,ENokia7610 = 0x101FB3F3

    // S60 2nd Edition, FP2 Symbian v.8.0a
    ,ENokia6630 = 0x101FBB55
    ,ENokia6680 = 0x10200f99
    ,ENokia6681 = 0x10200F9C
    ,ENokia6682 = 0x10200F9B

    // S60 2nd Edition, FP3 Symbian v.8.1a
    ,ENokiaN70 = 0x10200F9A
    ,ENokiaN90 = 0x10200F98

    // S60 3rd Edition Symbian v.9.1
    ,ENokia3250 = 0x200005F8
    ,ENokiaE60 = 0x20001856
    ,ENokiaE61 = 0x20001858
    ,ENokiaE70 = 0x20001857
    ,ENokiaN71 = 0x200005FF
    ,ENokiaN73 = 0x200005FB
    ,ENokiaN80 = 0x200005F9
    ,ENokiaN91 = 0x200005FC
    ,ENokiaN92 = 0x200005FA
    };

    检测蓝牙是否开启 & 开启蓝牙

    在3rd之前的版本:
    TBool GetBluetoothOn()  // BTONOFF
    {
     // Create and initialise an RHostResolver
     RHostResolver hr;
     TInt res = false;
     TBool ret;
     RSocketServ socketServer;
     User::LeaveIfError(socketServer.Connect());        
     CleanupClosePushL(socketServer);
     TProtocolDesc pInfo;
     //_LIT(KL2Cap, "BTLinkManager");
     User::LeaveIfError(socketServer.FindProtocol(_L("BTLinkManager"),pInfo));
     res =  hr.Open(socketServer, KBTAddrFamily, pInfo.iProtocol);
     if (KErrNone != res) {
      // if not success, this means bluetooth is not on
      ret = EFalse;
     }
     else
     {
      ret = ETrue; // Bluetooth is already ON
      hr.Close();
     }
     CleanupStack::PopAndDestroy(1); 
     return ret;
    }
     
    或者
     
    RSharedDataClient sd;
    sd.Connect(0);
    sd.Assign( TUid::Uid( 0x10005952 ) );
     
    在3rd里可以这样做:
     
    CRepository* cr = CRepository::NewLC( KCRUidBluetoothPowerState );
    TInt value;
    cr->Get( KBTPowerState, value );
    if(value==EBTPowerOn)
        aPower=1;
    CleanupStack::PopAndDestroy( cr );
     
    注意:一定要在IDE中设置好3rd API的相关权限,否则会得到-46的错误代码,表示没有权限调用Get函数。
     
    开启蓝牙
     
    1. 弹出用户确认对话框的方式
    头文件中:
    RNotifier iNotifier;
     TBTDeviceResponseParamsPckg iNotifierResult;
     TPckgBuf<TBool> pckg;
     
    CPP中:
    User::LeaveIfError( iNotifier.Connect() );
    iNotifier.StartNotifierAndGetResponse(  iStatus,
          KPowerModeSettingNotifierUid,
          pckg,
          iNotifierResult );
     iState = EOpeningBT; 
     SetActive();
     
    2.不经过用户确认,自动打开蓝牙
     
    对SDK 1.2中的bteng.llib进行reverse engineering,然后使用其中的CBTMCMSettings类
     // turn on Bluetooth in case it was off
    CBTMCMSettings settings= CBTMCMSettings::NewL( (MBTMCMSettingsCB*)NULL );  
    settings->SetPowerStateL(ETrue,EFalse ); // on, off is (EFalse,EFalse)
     
    在3rd中,还有一种办法,理论上也可以开启蓝牙,但由于权限不够,在真机上没有测试成功。
    CRepository* cr = CRepository::NewLC( KCRUidBluetoothPowerState );
    TInt err = cr->Set(KBTPowerState,EBTPowerOn);
    此时在真机上err的值为-46表示没有权限。