2010-01-08 10:37
How to know Flight mode status
From Forum Nokia Wiki
This is done using GetFlightMode() function from CTelephony class.
• Asynchronous call; so to cancel it use CTelephony::EGetFlightModeCancel
• Sometimes the phone’s software may not support this feature then the method returns KErrNotSupported.
Libraries needed:
LIBRARY Etel3rdParty.lib and euser.lib
Source:
class CClientApp : public CActive
{
private:
CTelephony* iTelephony;
CTelephony::TFlightModeV1 iFlightModeV1;
CTelephony::TFlightModeV1Pckg iFlightModeV1Pckg;
public:
CClientApp(CTelephony* aTelephony);
void FlightModeStatus();
private:
void RunL();
void DoCancel();
};
CClientApp:: CClientApp(CTelephony* aTelephony)
: CActive(EPriorityStandard),
iTelephony(aTelephony),
iFlightModeV1Pckg(iFlightModeV1)
{
//Constructor
}
void CClientApp::FlightModeStatus()
{
iTelephony->GetFlightMode(iStatus, iFlightModeV1Pckg);
SetActive();
}
void CClientApp::RunL()
{
if(iStatus==KErrNone)
{
CTelephony::TFlightModeStatus flightMode = iFlightModeV1.iFlightModeStatus;
if(flightMode == CTelephony::EFlightModeOff)
{} //If Flight mode status is off, all operations will be allowed
}
}
void CClientApp::DoCancel()
{
iTelephony->CancelAsync(CTelephony::EGetFlightModeCancel);
}
===============================================================
How to check if the phone is in offline mode
There's a CenRep key KCoreAppUIsNetworkConnectionAllowed that can be used for detecting off-line mode.
#include <CoreApplicationUIsSDKCRKeys.h>
To ask one time:
TInt aOfflineModeOff(0);
CRepository* repository = CRepository::NewL(KCRUidCoreApplicationUIs);
if (repository->Get(KCoreAppUIsNetworkConnectionAllowed, aOfflineModeOff) == KErrNone)
{
}
delete repository;
You might want to order notifications about the changes:
iRepository = CRepository::NewL(KCRUidCoreApplicationUIs);
iCenRepNotifyHandler =
CCenRepNotifyHandler::NewL(*this, *iRepository,
CCenRepNotifyHandler::EIntKey, KCoreAppUIsNetworkConnectionAllowed);
iCenRepNotifyHandler->StartListeningL();
void CThisClass::HandleNotifyInt(
TUint32 aId,
TInt aNewValue )
{
if (aId == KCoreAppUIsNetworkConnectionAllowed)
{
}
}
S60 3rd, FP1
Another way to query the profile is to use the Profiles Engine Wrapper API:
#include <proengfactory.h>
#include <mproengengine.h>
MProEngEngine* engine = ProEngFactory::NewEngineLC();
TInt profileId = engine->ActiveProfileId();
if (profileId == 5) //offline
{
}
CleanupStack::PopAndDestroy(); //engine
=========================================================================================
How to Detect Offline Mode in 3rd Edition
Headers Required:
#include <centralrepository.h>
#include <ProfileEngineSDKCRKeys.h>
Library needed:
LIBRARY centralrepository.lib
We need to Query Central Repository.
CRepository* cRepository = CRepository::NewLC( KCRUidProfileEngine );
TInt CurrentProfileId;
User::LeaveIfError( cRepository->Get( KProEngActiveProfile, CurrentProfileId ) );
if ( CurrentProfileId == 5 )
{
}
================================================================================
How to get notification of profile change
From Forum Nokia Wiki
Profiles Engine API, part of the Extension plug-in package for S60 3rd Edition, MR, provides a class CProfileChangeNotifyHandler using which we can get a notification for activation of a new profile and modifications of current active profile settings.
Header files
#include <CProfileChangeNotifyHandler.h>
#include <MProfileChangeObserver.h>
Libraries used
profileeng.lib
iHandler = CProfileChangeNotifyHandler::NewL( this );
void CNotifyEngine::HandleActiveProfileEventL(
TProfileEvent aProfileEvent,
TInt aProfileId )
{
TBuf<30> msg(_L("Current Profile Id : "));
msg.AppendNum(aProfileId);
switch(aProfileEvent)
{
case EProfileNewActiveProfile:
{
CEikonEnv::InfoWinL(_L("New Active Profile"),msg);
break;
}
case EProfileActiveProfileModified:
{
break;
}
case EProfileUnknownEvent:
{
break;
}
}
}
Example project :
NotifyProfileChange_SampleCode
=================================================================
How to detect profile
This sample shows how to detect if the user has selected silent profile (in S60 3rd edition and in older models)
TBool CheckIfSilentMode()
{
#ifdef __SERIES60_3X__
TBool inSilentMode=EFalse;
CRepository* cr = CRepository::NewLC( KCRUidProfileEngine );
TInt value;
// Get the ID of the currently active profile:
cr->Get( KProEngActiveProfile, value ) ;
if(value==1||value==2)
inSilentMode=ETrue;
cr->Get( KProEngActiveRingingType, value );
if(value==4) //silent
inSilentMode=ETrue;
CleanupStack::PopAndDestroy( cr );
#else
_LIT(KProfileDatabase,"c://system//Apps//profileApp//dbProfile.db");
_LIT(KProfileLookup,"ProfileLookup");
_LIT(KProfileStore,"ProfileStore");
CPermanentFileStore* fstore =
CPermanentFileStore::OpenLC(CEikonEnv::Static()->FsSession(),
KProfileDatabase,EFileRead);
RDbStoreDatabase database;
database.OpenL(fstore,fstore->Root());
RDbTable table;
table.Open(database, KProfileLookup);
TBool foundactive = EFalse;
TInt prfindex=0;
while (table.NextL() && !foundactive)
{
table.GetL();
if (!table.IsColNull(6) && (table.ColInt16(6) != 0) )
{
foundactive = ETrue;
prfindex = table.ColInt16(1);
}
}
table.Close();
TBuf<20> tablestr;
tablestr.Format(_L("PRF%d"),prfindex);
table.Open(database,tablestr);
// first record, field 3 holds call alert
table.FirstL();
table.GetL();
TInt value;
value = table.ColInt16(3);
inSilentMode = (value == 4);
table.Close();
database.Close();
CleanupStack::PopAndDestroy(fstore);
#endif
return inSilentMode;
}
=================================2nd上是可以用的 test ok=====================================
Handle Profile Activation
Library Needed:
LIBRARY PlatformEnv.lib //CSettingInfo
In Header File
#include <settinginfo.h> // CSettingInfo
#include <settinginfoids.h> // CSettingInfo ID's
class MyClass:public MSettingInfoObserver
{
void HandleNotificationL( SettingInfo::TSettingID aID,
const TDesC& aNewValue );
private:
CSettingInfo* iSettings;
}
In the CPP File
CMyClass::ConstructL()
{
iSettings = CSettingInfo::NewL(this);
TInt err = iSettings->NotifyChanges(SettingInfo::EActiveProfile);
if(err != KErrNone)
{
}
}
void CMyClass::HandleNotificationL(SettingInfo::TSettingID aID,
const TDesC& aNewValue )
{
TInt err(0);
switch(aID)
{
case SettingInfo::EActiveProfile:
{
TLex parsed(aNewValue);
TInt value;
if ( (err = parsed.Val(value)) == KErrNone )
{
//Parsing successful
if(value==0)
//"General" Profile is Activated
if(value==1)
//"Silent" Profile is Activated
if(value==2)
//"meeting" Profile is Activated
if(value==3)
//"Outdoor" Profile is Activated
if(value==4)
//"Pager" Profile is Activated
if(value==5)
//"Offline" Profile is Activated
}
else
{
// parsing failed.....
}
break;
}
default:
break;
}
}
================================================
这个帖子
symbian 来电铃声及情景模式设置
http://www.devdiv.net/home/space.php?uid=11451&do=blog&id=78
main about using class of CRepository