返回列表 回复 发帖

怎么确定手机当前运行时有没有sim卡?

怎么确定手机当前运行时有没有sim卡?

怎么判断手机当前运行时,有没有sim卡呀?
CTelephony::TSubscriberIdV1    iImsi ;
看下iImsi.iSubscriberId,如果这个 得不到imsi号的话,肯定是没sim卡了。我是这么想的。
原帖由 hh404 于 2008-11-6 11:56 发表
CTelephony::TSubscriberIdV1    iImsi ;
看下iImsi.iSubscriberId,如果这个 得不到imsi号的话,肯定是没sim卡了。我是这么想的。
支持,一般都是用这个方法判断的。
天道酬勤!
鱼和渔
针对这个问题,我以前专门写了一个类,大家可以拿来就用,代码如下:
// 设备信息类,可获得手机的IMEI号码等
class CMachineInfo : public CActive
{
public:
        ~CMachineInfo();
        static CMachineInfo* NewL();
        static CMachineInfo* NewLC();
        static void GetIMEI(TDes& aIMEI);
        static void GetIMSI(TDes& aIMSI);

private:
        CMachineInfo();
        void ConstructL();
       
        void GetSerialNumber();
        void GetSubscriberId();
       
private:
        // From CActive
        void RunL();
        void DoCancel();
        TInt RunError( TInt aError );


private:
        enum TMachineInfoState
        {
                ENone,
                EIMEI,
                EIMSI
        };

private:
        TMachineInfoState iState;
        CTelephony* iTel;
        CTelephony::TPhoneIdV1 iPhoneIdV1;
        CTelephony::TSubscriberIdV1 iSubscriberId;
};

CMachineInfo::CMachineInfo() : CActive( EPriorityHigh )        // HIGH priority
{
        iState = ENone;
}

CMachineInfo* CMachineInfo::NewLC()
{
        CMachineInfo* self = new ( ELeave ) CMachineInfo();
        CleanupStack::PushL( self );
        self->ConstructL();
        return self;
}

CMachineInfo* CMachineInfo::NewL()
{
        CMachineInfo* self = CMachineInfo::NewLC();
        CleanupStack::Pop(); // self;
        return self;
}

void CMachineInfo::ConstructL()
{
        iTel = CTelephony::NewL();
        CActiveScheduler::Add( this );
}

CMachineInfo::~CMachineInfo()
{
        Cancel();
        delete iTel;
}

void CMachineInfo::DoCancel()
{
        if (iState == EIMEI)
                iTel->CancelAsync(CTelephony::EGetPhoneIdCancel);
        else if (iState == EIMSI)
                iTel->CancelAsync(CTelephony::EGetSubscriberIdCancel);
}

void CMachineInfo::RunL()
{
        CActiveScheduler::Stop();
}

TInt CMachineInfo::RunError( TInt aError )
{
        return aError;
}

void CMachineInfo::GetSerialNumber()
        {
        Cancel();
        iState = EIMEI;
        CTelephony::TPhoneIdV1Pckg phoneIdPckg( iPhoneIdV1 );
    iTel->GetPhoneId(iStatus, phoneIdPckg);
    SetActive();
    CActiveScheduler::Start();
        }

void CMachineInfo::GetSubscriberId()
        {
        Cancel();
        iState = EIMSI;
        CTelephony::TSubscriberIdV1Pckg SubscriberIdPckg( iSubscriberId );
    iTel->GetSubscriberId(iStatus, SubscriberIdPckg);
    SetActive();
    CActiveScheduler::Start();
        }

void CMachineInfo::GetIMEI(TDes& aIMEI)
        {
        CMachineInfo* aMachineInfo = CMachineInfo::NewL();
        aMachineInfo->GetSerialNumber();
        aIMEI = aMachineInfo->iPhoneIdV1.iSerialNumber;
        delete aMachineInfo;
        }

void CMachineInfo::GetIMSI(TDes& aIMSI)
        {
        CMachineInfo* aMachineInfo = CMachineInfo::NewL();
        aMachineInfo->GetSubscriberId();
        aIMSI = aMachineInfo->iSubscriberId.iSubscriberId;
        delete aMachineInfo;
        }
测试代码使用嵌套的AS效果挺好

如果是正式工程,建议不要使用嵌套的CActiveScheduler达到“伪同步”的效果,如果工程比较复杂,造成的后果不堪设想~~。
天道酬勤!
鱼和渔
原帖由 Cxt_programmer 于 2008-11-6 20:59 发表
测试代码使用嵌套的AS效果挺好

如果是正式工程,建议不要使用嵌套的CActiveScheduler达到“伪同步”的效果,如果工程比较复杂,造成的后果不堪设想~~。
如果不用“伪同步”,那就得用Obersver的方式来异步返回了。这样的话,程序的结构就较复杂了。完成一个取IMEI这样一个简单的功能都要使程序结构搞得如此复杂,总觉得有些不伦不类!
原帖由 solestar 于 2008-11-7 09:31 发表

如果不用“伪同步”,那就得用Obersver的方式来异步返回了。这样的话,程序的结构就较复杂了。完成一个取IMEI这样一个简单的功能都要使程序结构搞得如此复杂,总觉得有些不伦不类!
建议你用CActiveSchedulerWait,安全。 自己嵌套AS,太危险了。
天道酬勤!
鱼和渔
CActiveSchedulerWait是一个循环欠套,当一个RunL执行完之后会再执行下一个RunL,CActiveScheduler就是一个普通的活动调度器,当它的RurL执行完后需要手动调用他自己的Start()从新启动调度器进行下一次的RunL!
建议你用CActiveSchedulerWait,安全。 多谢指点
返回列表