精华内容
下载资源
问答
  • Camera 关闭摄像头闪光灯功能

    千次阅读 2016-07-01 11:04:04
    关闭手机的闪光灯功能和去掉Camera中的闪光灯 图标 删除 \mediatek\custom\out\keytak72_wet_lca\kernel\flashlight 修改 constant_flashlight 为dummy_flashlight 编译./mk r  ProjectConfig.mk文件 ...

    关闭手机的闪光灯功能和去掉Camera中的闪光灯 图标

    删除

    \mediatek\custom\out\keytak72_wet_lca\kernel\flashlight

    修改 constant_flashlight dummy_flashlight

    编译./mk  r

     ProjectConfig.mk文件

    # User space cameara flashlight driver.Youcan use this driver to choose cameara flashlight type.

    CUSTOM_HAL_FLASHLIGHT=constant_flashlight

     

    # Kernel space cameara flashlight driver.You can use this driver to choose cameara flashlight type.

    CUSTOM_KERNEL_FLASHLIGHT=constant_flashlight


    展开全文
  • <br />在nokia的论坛上提供了调用S60系统...(3)完成摄像后没有关闭摄像头,这样在某些手机上(如N70)无法第二次启动摄像头;针对存在的这三个问题,我们做了如下工作: Ø 自动查找摄像头app的UID;<br

    nokia的论坛上提供了调用S60系统摄像头的示例代码,但在使用中我们发现,(1)需要指定系统摄像头appUID,因为不同型号的S60手机系统摄像头appUID可能不同,就需要开发者跟据不同手机的摄像头ID进行适配;(2)没有提供拍照后的文件信息,当完成拍照或录像后没法知道所对应的影像文件;(3)完成摄像后没有关闭摄像头,这样在某些手机上(如N70)无法第二次启动摄像头;针对存在的这三个问题,我们做了如下工作:

    Ø        自动查找摄像头appUID

    Ø        打开摄像头

    Ø        查找完成操作后的相关影像文件;

    Ø        关闭摄像头的系统调用;

     

    一、自动查找摄像头appUID

     

        通过RApaLsSessionGetAllApps接口可以得到所有系统上应用程序的信息,包括UIDFull path nameCaption ,在其中一一比对系统摄像头所在的文件路径,找到其UID

     

    具体代码见附录二中的CLaunchCamera::FindCamera

     

    其中对KCameraAppString定义说明如下:

    1KCameraAppString定义了系统摄像头在设备上的路径

    模拟器及大部分S60手机上定义如下(测试通过了6681,7610):

    _LIT(KCameraAppString , "z://system//apps//camcorder//camcorder.app") ;

    N70手机上,要定义如下:

    _LIT(KCameraAppString , "z://system//apps//cammojave//cammojave.app") ;       

    2、如果FindCamera返回TURE,则找到系统摄像头

     

    二、打开摄像头
     

    通过系统调用,打开设备的摄像头,具体的代码见附录二中的CLaunchCamera::OpenCamera() 

     

    三、查找完成操作后的相关影像文件
     

        当用户完成摄像功能后,会通过MApaEmbeddedDocObserver类的回调函数NotifyExit进行通知,改函数具体定义如下:

        void NotifyExit(TExitMode aMode)

    其中:

    enum TExitMode {

       EKeepChanges,

       ERevertToSaved,

       ENoChanges,

       EEmpty

      };

    EKeepChanges表示用户进行了拍照或摄像操作,ENoChanges表示用户取消了拍照或摄像操作,其它两个不用处理。

     

    在这个唯一可以知道用户进行了操作的通知函数中,没有所拍照的图像文件路径信息,因此我们只有通过遍例设备上的图像文件来找到最新的拍照文件。遍例包括对设备存储分区和存储卡分区(即C盘与E盘),PathInfo类提供了对这两个分区的图像文件与影像文件的访问路径,分别是:

     

            TFileName PhoneIamgePath ;

            TFileName PhoneVideoPath ;

     

            TFileName MemoryIamgePath ;

            TFileName MemoryVideoPath ;

     

            PhoneIamgePath.Append(PathInfo::PhoneMemoryRootPath()) ;

            PhoneIamgePath.Append(PathInfo::ImagesPath());

     

            PhoneVideoPath.Append(PathInfo::PhoneMemoryRootPath()) ;

            PhoneVideoPath.Append(PathInfo::VideosPath()) ;

     

            MemoryIamgePath.Append(PathInfo::MemoryCardRootPath()) ;

            MemoryIamgePath.Append(PathInfo::ImagesPath()) ;

     

            MemoryVideoPath.Append(PathInfo::MemoryCardRootPath()) ;

            MemoryVideoPath.Append(PathInfo::VideosPath()) ;

     

    同时还要注意有些手机可能会对拍的图片上边的文件夹中再进行分类存储,所以查找的时候查找到以上目录的二级子目录就可以满足要求。

    查找使用RFs类的GetDir接口,具体定义如下:

     TInt GetDir(const TDesC& aName,TUint anEntryAttMask,TUint anEntrySortKey,CDir*& anEntryList) const;

     TInt GetDir(const TDesC& aName,TUint anEntryAttMask,TUint anEntrySortKey,CDir*& anEntryList,CDir*& aDirList) const;

     

    其中:

    aName:文件夹的完整路径

    anEntryAttMask:查找文件选项,这里使用KEntryAttNormal

    anEntrySortKey:查找结果的排序选项,这里使用ESortByDate|EDescending,即按时间进行降序排序

    anEntryList:查找到的文件例表;

    aDirList:查找到的文件目录例表;

     

    具体查找代码见附录二中的CLaunchCamera::GetLastFileLaunchCamera::GetLastNewFile

     

    四:关闭摄像头的系统调用
     

       在使用完摄像头后要调用CEikProcessDestroyDocument接口,删除对系统摄像头的调用,否则在有些手机上无法第二次调用摄像,但要注意的时DestroyDocument接口不能在回调通知函数NotifyExit中调用,否则程序会crash,我们的变通方法是CLaunchCamera的外部调用启动一下timer,在timer中轮询调用EnableCloseCamera来判断当前的摄像头是否可以关闭。

     

    附录一:CLaunchCamera的类定义:

     

    #include <e32std.h>
    #include 
    <apparc.h> //for MApaEmbeddedDocObserver
    #include <eikproc.h> //for CEikProcess
    //

    enum Camera_File_Type
    {
            CFT_NoFind 
    = 0x0,
            CFT_Image 
    = 0x1 ,
            CFT_Video 
    = 0x2 ,
    }
    ;

    typedef Camera_File_Type   enCameraFileType ;

    class MCameraEvenCallBack
    {
    public:
        
    virtual void Camera_HandleFile(enCameraFileType enFileType , const TDesC & aFilePath) = 0 ;
            
    virtual void Camera_UpdateData(TBool bUpdate = TRUE ) = 0;
    }
    ;

    //

    class CApaDocument ;
    class CEikonEnv ;

    class CLaunchCamera  : public MApaEmbeddedDocObserver
    {
    public:
            CLaunchCamera();
            
    virtual ~CLaunchCamera();

        
    static CLaunchCamera * NewL(MCameraEvenCallBack * pEvenCallBack,CEikonEnv * pEikonEnv );
        
    static CLaunchCamera * NewLC(MCameraEvenCallBack * pEvenCallBack,CEikonEnv * pEikonEnv);
            TBool OpenCamera() ;

            
    //注意些接口不能在MCameraEvenCallBack的回调中调用,否则设备会crash
            void  CloseCamera() ;

            TBool EnableCloseCamera() ;

    private:
            
    void ConstructL(MCameraEvenCallBack * pEvenCallBack,CEikonEnv * pEikonEnv) ;
            
            
    //From MApaEmbeddedDocObserver
            void  NotifyExit(TExitMode aMode) ;

            
    void FindNewFile() ;

            TBool GetLastFile(TFileName 
    & filePath , TTime & fileTime) ;
            TBool GetLastNewFile(TFileName 
    & filePath , TTime & fileTime)  ;
            TBool FindCamera( TApaAppInfo 
    & appInfo) ;

    private:
            CEikonEnv    
    *   m_pEikonEnv ;        
            MCameraEvenCallBack 
    * m_pCallBack ;

            CApaDocument 
    *        m_pAppdoc;
            CEikProcess 
    * m_pProcess ;

            TBool  m_bCloseCamera ;

    }
    ;

     附录二:CLaunchCamera类实现

    #include <eikenv.h> //for CEikProcess

    #include <eikproc.h> //for CEikProcess

    #include <PathInfo.h> //for PathInfo

    #include <apgcli.h>  //for RApaLsSession

    #include <apacln.h>  // for TApaDocCleanupItem

     

    #include "LaunchCamera.h"

     

    CLaunchCamera* CLaunchCamera::NewL(MCameraEvenCallBack * pEvenCallBack,CEikonEnv * pEikonEnv )

    {

            CLaunchCamera* self = NewLC(pEvenCallBack ,pEikonEnv);

            CleanupStack::Pop(self);

            return self;

    }

     

    CLaunchCamera* CLaunchCamera::NewLC(MCameraEvenCallBack * pEvenCallBack,CEikonEnv * pEikonEnv )

    {

            CLaunchCamera* self = new (ELeave) CLaunchCamera;

            CleanupStack::PushL(self);

            self->ConstructL(pEvenCallBack,pEikonEnv);

            return self;

    }

     

    void CLaunchCamera::ConstructL(MCameraEvenCallBack * pEvenCallBack , CEikonEnv * pEikonEnv)

    {

            m_pProcess = NULL ;

            m_pAppdoc = NULL ;

            m_pCallBack = pEvenCallBack ;

            m_pEikonEnv = pEikonEnv ;

            m_bCloseCamera = FALSE ;

    }

     

    CLaunchCamera::CLaunchCamera()

    {

            m_pAppdoc = NULL ;       

    }

     

    CLaunchCamera::~CLaunchCamera()

    {

            //CloseCamera() ;

            m_pEikonEnv = NULL ;

            m_pCallBack = NULL ;

    }

     

     

    // Function name        : CLaunchCamera::OpenCamera

    // Description            : Open camera and review

    // Return type                : TURE if successful, otherwise FALSE

    TBool CLaunchCamera::OpenCamera()

    {

            if( m_pEikonEnv == NULL ) return FALSE ;

           

            TApaAppInfo appInfo;

            if( FindCamera( appInfo) == FALSE ) return FALSE ;

     

            m_pProcess = m_pEikonEnv->Process();

     

            m_pAppdoc = m_pProcess->AddNewDocumentL(appInfo.iFullName, appInfo.iUid);

            ASSERT( m_pAppdoc != NULL ) ;

           

            TApaDocCleanupItem cleanup(m_pProcess, m_pAppdoc);

            CleanupStack::PushL(cleanup);

     

            m_pAppdoc->NewDocumentL();

            CleanupStack::Pop(); // cleanup

           

            m_bCloseCamera = FALSE ;

           

            m_pAppdoc->EditL(this, EFalse );

     

            return TRUE ;

    }

     

    void CLaunchCamera::CloseCamera()

    {

            if( m_pProcess )

            {

                    m_pProcess->DestroyDocument(m_pAppdoc) ;

                    m_pProcess = NULL ;

                    m_pAppdoc = NULL ;

            }

     

            m_bCloseCamera = TRUE ;

    }

     

    TBool CLaunchCamera::FindCamera(TApaAppInfo & appInfo)

    {

            RApaLsSession apaTmpLs;

     

             User::LeaveIfError(apaTmpLs.Connect());

             CleanupClosePushL(apaTmpLs);

     

            User::LeaveIfError(apaTmpLs.GetAllApps());

     

            TBool bFindCamera = FALSE ;

            appInfo.iFullName.FillZ(appInfo.iFullName.MaxLength()) ;

            appInfo.iFullName.Zero() ;

     

            while(apaTmpLs.GetNextApp(appInfo) == KErrNone)

            {

                    appInfo.iFullName.LowerCase() ;

     

                    TInt nTmpID = appInfo.iFullName.Compare(KCameraAppString) ;

                    if( nTmpID == 0 )

                    {

                            bFindCamera = TRUE ;

                            break ;

                    }

     

                    appInfo.iFullName.FillZ(appInfo.iFullName.MaxLength()) ;

                    appInfo.iFullName.Zero() ;

            }

     

            CleanupStack::PopAndDestroy(); // apaTmpLs

     

            return bFindCamera ;

    }

     

    // Function name        : CLaunchCamera::NotifyExit

    // Description            : when selected "select", frame will call this function

    // Return type                : void

    // Argument         : TExitMode aMode

    void CLaunchCamera::NotifyExit(TExitMode aMode)

    {

            if( aMode == EKeepChanges )

            {

                    //不能在这里调,否则设备为crash

                    //m_pProcess->DestroyDocument(m_pAppdoc) ;

                    FindNewFile() ;

            }

        else

        {

                    //m_pProcess->DestroyDocument(m_pAppdoc) ;

                    if( m_pCallBack )

                            m_pCallBack->Camera_HandleFile(CFT_NoFind, _L("FileNotSelect"));

        }

     

            m_bCloseCamera = TRUE ;

    }

     

    TBool CLaunchCamera::EnableCloseCamera()

    {

            return m_bCloseCamera ;

    }

     

    // Function name        : CLaunchCamera::FindNewFile

    // Description            : Search the last new files

    //if find the last new file, call Camera_HandleFile to caller

    // Return type                : void

     

    void CLaunchCamera::FindNewFile()

    {

            if( m_pCallBack == NULL ) return ;

           

            TFileName PhoneIamgePath ;

            TFileName MemoryIamgePath ;

            TFileName PhoneVideoPath ;

            TFileName MemoryVideoPath ;

     

            PhoneIamgePath.Append(PathInfo::PhoneMemoryRootPath()) ;

            PhoneIamgePath.Append(PathInfo::ImagesPath());

     

            MemoryIamgePath.Append(PathInfo::MemoryCardRootPath()) ;

            MemoryIamgePath.Append(PathInfo::ImagesPath()) ;

     

            PhoneVideoPath.Append(PathInfo::PhoneMemoryRootPath()) ;

            PhoneVideoPath.Append(PathInfo::VideosPath()) ;

     

            MemoryVideoPath.Append(PathInfo::MemoryCardRootPath()) ;

            MemoryVideoPath.Append(PathInfo::VideosPath()) ;

     

            TTime  tFileTime(0) ;

            TTime  tLastFileTime(0) ;

            TInt   nIndex = -1 ;

     

            //查找最新时间的文件

            //find phone card image

            if( GetLastFile(PhoneIamgePath , tFileTime) == TRUE )

            {

                    if( tFileTime > tLastFileTime )

                    {

                            tLastFileTime = tFileTime ;

                            nIndex = 0 ;

                    }       

            }

            //find memory card image

            if( GetLastFile(MemoryIamgePath , tFileTime) == TRUE )

            {

                    if( tFileTime > tLastFileTime )

                    {

                            tLastFileTime = tFileTime ;

                            nIndex = 1 ;

                    }       

            }

            //find phone memory video file

            if( GetLastFile(PhoneVideoPath , tFileTime) == TRUE )

            {

                    if( tFileTime > tLastFileTime )

                    {

                            tLastFileTime = tFileTime ;

                            nIndex = 2 ;

                    }       

            }

            //find memory card video files

            if( GetLastFile(MemoryVideoPath , tFileTime) == TRUE )

            {

                    if( tFileTime > tLastFileTime )

                    {

                            tLastFileTime = tFileTime ;

                            nIndex = 3 ;

                    }       

            }

     

            //判断是那个目录下的文件

            switch(nIndex)

            {

            case 0:

                    m_pCallBack->Camera_HandleFile(CFT_Image , PhoneIamgePath) ;

                    break;

            case 1:

                    m_pCallBack->Camera_HandleFile(CFT_Image , MemoryIamgePath) ;

                    break;

            case 2:

                    m_pCallBack->Camera_HandleFile(CFT_Video , PhoneVideoPath) ;

                    break;

            case 3:

                    m_pCallBack->Camera_HandleFile(CFT_Video , MemoryVideoPath) ;

                    break;

            default:

                    m_pCallBack->Camera_HandleFile(CFT_NoFind , TFileName(0) ) ;

                    break;

            }

    }

     

    //

    //查找最新的图像文件,只查找到二级目录

    //

    //

    //

     

    TBool CLaunchCamera::GetLastFile(TFileName & filePath , TTime & fileTime)

    {

            RFs sessionRFs;

            User::LeaveIfError(sessionRFs.Connect());

     

            CDir* FileList;

            CDir* dirList ;

     

            //读出文件夹下文件信息,并对所有的文件进行降序排列

            TInt nError = sessionRFs.GetDir(filePath,KEntryAttNormal, ESortByDate|EDescending , FileList , dirList);

     

            if( nError != KErrNone )

            {

                    //ASSERT(FALSE) ;

                    sessionRFs.Close() ;

                    return FALSE;

            }       

            else if( nError == KErrNone )

            {

                    TFileName  tmpFileName(0) ;

                    TTime tmpTime(0) ;

     

                    TTime  tLastFileTime(0) ;

                    TFileName tLastFile(0) ;

                   

                    //file

                    if( FileList->Count() > 0 )

                    {

                            tmpFileName.FillZ(KMaxFileName) ;

                            tmpFileName.Zero() ;

                            tmpFileName.Append(filePath) ;

                            tmpFileName.Append((*FileList)[0].iName) ;

                   

                            //get file modification time

                            sessionRFs.Modified(tmpFileName , tmpTime ) ;

     

                            if( tmpTime > tLastFileTime )

                            {

                                    tLastFileTime = tmpTime ;

                                    tLastFile.FillZ(KMaxFileName) ;

                                    tLastFile.Zero() ;

                                    tLastFile.Append(tmpFileName) ;

                            }

                    }

                    delete FileList ;

     

                    //dir

                    TInt nDirCount = dirList->Count() ;

                    for( int i = 0 ; i< nDirCount ; i++ )

                    {

                            tmpFileName.FillZ(KMaxFileName) ;

                            tmpFileName.Zero() ;

                            tmpFileName.Append(filePath) ;

                            tmpFileName.Append((*dirList)[i].iName) ;

                            tmpFileName.Append(_L("//")) ;

     

                            if( GetLastNewFile( tmpFileName , tmpTime ) == TRUE )

                            {

                                    if( tmpTime > tLastFileTime )

                                    {

                                            tLastFileTime = tmpTime ;

                                            tLastFile.FillZ(KMaxFileName) ;

                                            tLastFile.Zero() ;

                                            tLastFile.Append(tmpFileName) ;

                                    }

                            }               

                    }       

                    delete dirList;

     

                    //是否找到新的文件

                    if( tLastFileTime > TTime(0) )

                    {

                            filePath.FillZ(KMaxFileName) ;

                            filePath.Zero() ;

                            filePath.Append(tLastFile) ;

                            fileTime = tLastFileTime ;

                    }

                    else

                    {

                            sessionRFs.Close() ;

                            return FALSE ;

                    }

            }

     

            sessionRFs.Close() ;

     

            return TRUE ;

    }

     

    //KEntryAttNormal只查找目录中的文件

    TBool CLaunchCamera::GetLastNewFile(TFileName & filePath , TTime & fileTime)

    {

            RFs sessionRFs;

            User::LeaveIfError(sessionRFs.Connect());

     

            CDir* dirList;

     

            //读出文件夹下文件信息,并对所有的文件进行降序排列

            TInt nError = sessionRFs.GetDir(filePath,KEntryAttNormal, ESortByDate|EDescending,dirList);

            if( nError != KErrNone )

            {

                    sessionRFs.Close() ;

                    return FALSE;

            }       

            else if( dirList->Count() > 0 )

            {

                    //get filename

                    filePath.Append((*dirList)[0].iName) ;

     

                    //get file modification time

                    sessionRFs.Modified(filePath , fileTime ) ;                       

                    delete dirList;

            }

            else

            {

                    sessionRFs.Close() ;

                    return FALSE;

            }

     

            sessionRFs.Close() ;

     

            return TRUE ;

    }

    展开全文
  • 在nokia的论坛上提供了调用S60系统摄像头的示例代码,但在使用中我们发现,(1)需要指定系统摄像头app的UID,...(3)完成摄像后没有关闭摄像头,这样在某些手机上(如N70)无法第二次启动摄像头;针对存在的这三个问题

    nokia的论坛上提供了调用S60系统摄像头的示例代码,但在使用中我们发现,(1)需要指定系统摄像头appUID,因为不同型号的S60手机系统摄像头appUID可能不同,就需要开发者跟据不同手机的摄像头ID进行适配;(2)没有提供拍照后的文件信息,当完成拍照或录像后没法知道所对应的影像文件;(3)完成摄像后没有关闭摄像头,这样在某些手机上(如N70)无法第二次启动摄像头;针对存在的这三个问题,我们做了如下工作:

    Ø        自动查找摄像头appUID

    Ø        打开摄像头

    Ø        查找完成操作后的相关影像文件;

    Ø        关闭摄像头的系统调用;

     

    一、自动查找摄像头appUID

     

        通过RApaLsSessionGetAllApps接口可以得到所有系统上应用程序的信息,包括UIDFull path nameCaption ,在其中一一比对系统摄像头所在的文件路径,找到其UID

     

    具体代码见附录二中的CLaunchCamera::FindCamera

     

    其中对KCameraAppString定义说明如下:

    1KCameraAppString定义了系统摄像头在设备上的路径

    模拟器及大部分S60手机上定义如下(测试通过了6681,7610):

    _LIT(KCameraAppString , "z://system//apps//camcorder//camcorder.app") ;

    N70手机上,要定义如下:

    _LIT(KCameraAppString , "z://system//apps//cammojave//cammojave.app") ;       

    2、如果FindCamera返回TURE,则找到系统摄像头

     

    二、打开摄像头
     

    通过系统调用,打开设备的摄像头,具体的代码见附录二中的CLaunchCamera::OpenCamera()

     

    三、查找完成操作后的相关影像文件
     

        当用户完成摄像功能后,会通过MApaEmbeddedDocObserver类的回调函数NotifyExit进行通知,改函数具体定义如下:

        void NotifyExit(TExitMode aMode)

    其中:

    enum TExitMode {

       EKeepChanges,

       ERevertToSaved,

       ENoChanges,

       EEmpty

      };

    EKeepChanges表示用户进行了拍照或摄像操作,ENoChanges表示用户取消了拍照或摄像操作,其它两个不用处理。

     

    在这个唯一可以知道用户进行了操作的通知函数中,没有所拍照的图像文件路径信息,因此我们只有通过遍例设备上的图像文件来找到最新的拍照文件。遍例包括对设备存储分区和存储卡分区(即C盘与E盘),PathInfo类提供了对这两个分区的图像文件与影像文件的访问路径,分别是:

     

            TFileName PhoneIamgePath ;

            TFileName PhoneVideoPath ;

     

            TFileName MemoryIamgePath ;

            TFileName MemoryVideoPath ;

     

            PhoneIamgePath.Append(PathInfo::PhoneMemoryRootPath()) ;

            PhoneIamgePath.Append(PathInfo::ImagesPath());

     

            PhoneVideoPath.Append(PathInfo::PhoneMemoryRootPath()) ;

            PhoneVideoPath.Append(PathInfo::VideosPath()) ;

     

            MemoryIamgePath.Append(PathInfo::MemoryCardRootPath()) ;

            MemoryIamgePath.Append(PathInfo::ImagesPath()) ;

     

            MemoryVideoPath.Append(PathInfo::MemoryCardRootPath()) ;

            MemoryVideoPath.Append(PathInfo::VideosPath()) ;

     

    同时还要注意有些手机可能会对拍的图片上边的文件夹中再进行分类存储,所以查找的时候查找到以上目录的二级子目录就可以满足要求。

    查找使用RFs类的GetDir接口,具体定义如下:

     TInt GetDir(const TDesC& aName,TUint anEntryAttMask,TUint anEntrySortKey,CDir*& anEntryList) const;

     TInt GetDir(const TDesC& aName,TUint anEntryAttMask,TUint anEntrySortKey,CDir*& anEntryList,CDir*& aDirList) const;

     

    其中:

    aName:文件夹的完整路径

    anEntryAttMask:查找文件选项,这里使用KEntryAttNormal

    anEntrySortKey:查找结果的排序选项,这里使用ESortByDate|EDescending,即按时间进行降序排序

    anEntryList:查找到的文件例表;

    aDirList:查找到的文件目录例表;

     

    具体查找代码见附录二中的CLaunchCamera::GetLastFileLaunchCamera::GetLastNewFile

     

    四:关闭摄像头的系统调用
     

       在使用完摄像头后要调用CEikProcessDestroyDocument接口,删除对系统摄像头的调用,否则在有些手机上无法第二次调用摄像,但要注意的时DestroyDocument接口不能在回调通知函数NotifyExit中调用,否则程序会crash,我们的变通方法是CLaunchCamera的外部调用启动一下timer,在timer中轮询调用EnableCloseCamera来判断当前的摄像头是否可以关闭。

     

    附录一:CLaunchCamera的类定义:

     

    #include <e32std.h>
    #include 
    <apparc.h> //for MApaEmbeddedDocObserver
    #include <eikproc.h> //for CEikProcess
    //

    enum Camera_File_Type
    {
            CFT_NoFind 
    = 0x0,
            CFT_Image 
    = 0x1 ,
            CFT_Video 
    = 0x2 ,
    }
    ;

    typedef Camera_File_Type   enCameraFileType ;

    class MCameraEvenCallBack
    {
    public:
        
    virtual void Camera_HandleFile(enCameraFileType enFileType , const TDesC & aFilePath) = 0 ;
            
    virtual void Camera_UpdateData(TBool bUpdate = TRUE ) = 0;
    }
    ;

    //

    class CApaDocument ;
    class CEikonEnv ;

    class CLaunchCamera  : public MApaEmbeddedDocObserver
    {
    public:
            CLaunchCamera();
            
    virtual ~CLaunchCamera();

        
    static CLaunchCamera * NewL(MCameraEvenCallBack * pEvenCallBack,CEikonEnv * pEikonEnv );
        
    static CLaunchCamera * NewLC(MCameraEvenCallBack * pEvenCallBack,CEikonEnv * pEikonEnv);
            TBool OpenCamera() ;

            
    //注意些接口不能在MCameraEvenCallBack的回调中调用,否则设备会crash
            void  CloseCamera() ;

            TBool EnableCloseCamera() ;

    private:
            
    void ConstructL(MCameraEvenCallBack * pEvenCallBack,CEikonEnv * pEikonEnv) ;
            
            
    //From MApaEmbeddedDocObserver
            void  NotifyExit(TExitMode aMode) ;

            
    void FindNewFile() ;

            TBool GetLastFile(TFileName 
    & filePath , TTime & fileTime) ;
            TBool GetLastNewFile(TFileName 
    & filePath , TTime & fileTime)  ;
            TBool FindCamera( TApaAppInfo 
    & appInfo) ;

    private:
            CEikonEnv    
    *   m_pEikonEnv ;        
            MCameraEvenCallBack 
    * m_pCallBack ;

            CApaDocument 
    *        m_pAppdoc;
            CEikProcess 
    * m_pProcess ;

            TBool  m_bCloseCamera ;

    }
    ;

     附录二:CLaunchCamera类实现

    #include <eikenv.h> //for CEikProcess

    #include <eikproc.h> //for CEikProcess

    #include <PathInfo.h> //for PathInfo

    #include <apgcli.h>  //for RApaLsSession

    #include <apacln.h>  // for TApaDocCleanupItem

     

    #include "LaunchCamera.h"

     

    CLaunchCamera* CLaunchCamera::NewL(MCameraEvenCallBack * pEvenCallBack,CEikonEnv * pEikonEnv )

    {

            CLaunchCamera* self = NewLC(pEvenCallBack ,pEikonEnv);

            CleanupStack::Pop(self);

            return self;

    }

     

    CLaunchCamera* CLaunchCamera::NewLC(MCameraEvenCallBack * pEvenCallBack,CEikonEnv * pEikonEnv )

    {

            CLaunchCamera* self = new (ELeave) CLaunchCamera;

            CleanupStack::PushL(self);

            self->ConstructL(pEvenCallBack,pEikonEnv);

            return self;

    }

     

    void CLaunchCamera::ConstructL(MCameraEvenCallBack * pEvenCallBack , CEikonEnv * pEikonEnv)

    {

            m_pProcess = NULL ;

            m_pAppdoc = NULL ;

            m_pCallBack = pEvenCallBack ;

            m_pEikonEnv = pEikonEnv ;

            m_bCloseCamera = FALSE ;

    }

     

    CLaunchCamera::CLaunchCamera()

    {

            m_pAppdoc = NULL ;       

    }

     

    CLaunchCamera::~CLaunchCamera()

    {

            //CloseCamera() ;

            m_pEikonEnv = NULL ;

            m_pCallBack = NULL ;

    }

     

     

    // Function name        : CLaunchCamera::OpenCamera

    // Description            : Open camera and review

    // Return type                : TURE if successful, otherwise FALSE

    TBool CLaunchCamera::OpenCamera()

    {

            if( m_pEikonEnv == NULL ) return FALSE ;

           

            TApaAppInfo appInfo;

            if( FindCamera( appInfo) == FALSE ) return FALSE ;

     

            m_pProcess = m_pEikonEnv->Process();

     

            m_pAppdoc = m_pProcess->AddNewDocumentL(appInfo.iFullName, appInfo.iUid);

            ASSERT( m_pAppdoc != NULL ) ;

           

            TApaDocCleanupItem cleanup(m_pProcess, m_pAppdoc);

            CleanupStack::PushL(cleanup);

     

            m_pAppdoc->NewDocumentL();

            CleanupStack::Pop(); // cleanup

           

            m_bCloseCamera = FALSE ;

           

            m_pAppdoc->EditL(this, EFalse );

     

            return TRUE ;

    }

     

    void CLaunchCamera::CloseCamera()

    {

            if( m_pProcess )

            {

                    m_pProcess->DestroyDocument(m_pAppdoc) ;

                    m_pProcess = NULL ;

                    m_pAppdoc = NULL ;

            }

     

            m_bCloseCamera = TRUE ;

    }

     

    TBool CLaunchCamera::FindCamera(TApaAppInfo & appInfo)

    {

            RApaLsSession apaTmpLs;

     

             User::LeaveIfError(apaTmpLs.Connect());

             CleanupClosePushL(apaTmpLs);

     

            User::LeaveIfError(apaTmpLs.GetAllApps());

     

            TBool bFindCamera = FALSE ;

            appInfo.iFullName.FillZ(appInfo.iFullName.MaxLength()) ;

            appInfo.iFullName.Zero() ;

     

            while(apaTmpLs.GetNextApp(appInfo) == KErrNone)

            {

                    appInfo.iFullName.LowerCase() ;

     

                    TInt nTmpID = appInfo.iFullName.Compare(KCameraAppString) ;

                    if( nTmpID == 0 )

                    {

                            bFindCamera = TRUE ;

                            break ;

                    }

     

                    appInfo.iFullName.FillZ(appInfo.iFullName.MaxLength()) ;

                    appInfo.iFullName.Zero() ;

            }

     

            CleanupStack::PopAndDestroy(); // apaTmpLs

     

            return bFindCamera ;

    }

     

    // Function name        : CLaunchCamera::NotifyExit

    // Description            : when selected "select", frame will call this function

    // Return type                : void

    // Argument         : TExitMode aMode

    void CLaunchCamera::NotifyExit(TExitMode aMode)

    {

            if( aMode == EKeepChanges )

            {

                    //不能在这里调,否则设备为crash

                    //m_pProcess->DestroyDocument(m_pAppdoc) ;

                    FindNewFile() ;

            }

        else

        {

                    //m_pProcess->DestroyDocument(m_pAppdoc) ;

                    if( m_pCallBack )

                            m_pCallBack->Camera_HandleFile(CFT_NoFind, _L("FileNotSelect"));

        }

     

            m_bCloseCamera = TRUE ;

    }

     

    TBool CLaunchCamera::EnableCloseCamera()

    {

            return m_bCloseCamera ;

    }

     

    // Function name        : CLaunchCamera::FindNewFile

    // Description            : Search the last new files

    //if find the last new file, call Camera_HandleFile to caller

    // Return type                : void

     

    void CLaunchCamera::FindNewFile()

    {

            if( m_pCallBack == NULL ) return ;

           

            TFileName PhoneIamgePath ;

            TFileName MemoryIamgePath ;

            TFileName PhoneVideoPath ;

            TFileName MemoryVideoPath ;

     

            PhoneIamgePath.Append(PathInfo::PhoneMemoryRootPath()) ;

            PhoneIamgePath.Append(PathInfo::ImagesPath());

     

            MemoryIamgePath.Append(PathInfo::MemoryCardRootPath()) ;

            MemoryIamgePath.Append(PathInfo::ImagesPath()) ;

     

            PhoneVideoPath.Append(PathInfo::PhoneMemoryRootPath()) ;

            PhoneVideoPath.Append(PathInfo::VideosPath()) ;

     

            MemoryVideoPath.Append(PathInfo::MemoryCardRootPath()) ;

            MemoryVideoPath.Append(PathInfo::VideosPath()) ;

     

            TTime  tFileTime(0) ;

            TTime  tLastFileTime(0) ;

            TInt   nIndex = -1 ;

     

            //查找最新时间的文件

            //find phone card image

            if( GetLastFile(PhoneIamgePath , tFileTime) == TRUE )

            {

                    if( tFileTime > tLastFileTime )

                    {

                            tLastFileTime = tFileTime ;

                            nIndex = 0 ;

                    }       

            }

            //find memory card image

            if( GetLastFile(MemoryIamgePath , tFileTime) == TRUE )

            {

                    if( tFileTime > tLastFileTime )

                    {

                            tLastFileTime = tFileTime ;

                            nIndex = 1 ;

                    }       

            }

            //find phone memory video file

            if( GetLastFile(PhoneVideoPath , tFileTime) == TRUE )

            {

                    if( tFileTime > tLastFileTime )

                    {

                            tLastFileTime = tFileTime ;

                            nIndex = 2 ;

                    }       

            }

            //find memory card video files

            if( GetLastFile(MemoryVideoPath , tFileTime) == TRUE )

            {

                    if( tFileTime > tLastFileTime )

                    {

                            tLastFileTime = tFileTime ;

                            nIndex = 3 ;

                    }       

            }

     

            //判断是那个目录下的文件

            switch(nIndex)

            {

            case 0:

                    m_pCallBack->Camera_HandleFile(CFT_Image , PhoneIamgePath) ;

                    break;

            case 1:

                    m_pCallBack->Camera_HandleFile(CFT_Image , MemoryIamgePath) ;

                    break;

            case 2:

                    m_pCallBack->Camera_HandleFile(CFT_Video , PhoneVideoPath) ;

                    break;

            case 3:

                    m_pCallBack->Camera_HandleFile(CFT_Video , MemoryVideoPath) ;

                    break;

            default:

                    m_pCallBack->Camera_HandleFile(CFT_NoFind , TFileName(0) ) ;

                    break;

            }

    }

     

    //

    //查找最新的图像文件,只查找到二级目录

    //

    //

    //

     

    TBool CLaunchCamera::GetLastFile(TFileName & filePath , TTime & fileTime)

    {

            RFs sessionRFs;

            User::LeaveIfError(sessionRFs.Connect());

     

            CDir* FileList;

            CDir* dirList ;

     

            //读出文件夹下文件信息,并对所有的文件进行降序排列

            TInt nError = sessionRFs.GetDir(filePath,KEntryAttNormal, ESortByDate|EDescending , FileList , dirList);

     

            if( nError != KErrNone )

            {

                    //ASSERT(FALSE) ;

                    sessionRFs.Close() ;

                    return FALSE;

            }       

            else if( nError == KErrNone )

            {

                    TFileName  tmpFileName(0) ;

                    TTime tmpTime(0) ;

     

                    TTime  tLastFileTime(0) ;

                    TFileName tLastFile(0) ;

                   

                    //file

                    if( FileList->Count() > 0 )

                    {

                            tmpFileName.FillZ(KMaxFileName) ;

                            tmpFileName.Zero() ;

                            tmpFileName.Append(filePath) ;

                            tmpFileName.Append((*FileList)[0].iName) ;

                   

                            //get file modification time

                            sessionRFs.Modified(tmpFileName , tmpTime ) ;

     

                            if( tmpTime > tLastFileTime )

                            {

                                    tLastFileTime = tmpTime ;

                                    tLastFile.FillZ(KMaxFileName) ;

                                    tLastFile.Zero() ;

                                    tLastFile.Append(tmpFileName) ;

                            }

                    }

                    delete FileList ;

     

                    //dir

                    TInt nDirCount = dirList->Count() ;

                    for( int i = 0 ; i< nDirCount ; i++ )

                    {

                            tmpFileName.FillZ(KMaxFileName) ;

                            tmpFileName.Zero() ;

                            tmpFileName.Append(filePath) ;

                            tmpFileName.Append((*dirList)[i].iName) ;

                            tmpFileName.Append(_L("//")) ;

     

                            if( GetLastNewFile( tmpFileName , tmpTime ) == TRUE )

                            {

                                    if( tmpTime > tLastFileTime )

                                    {

                                            tLastFileTime = tmpTime ;

                                            tLastFile.FillZ(KMaxFileName) ;

                                            tLastFile.Zero() ;

                                            tLastFile.Append(tmpFileName) ;

                                    }

                            }               

                    }       

                    delete dirList;

     

                    //是否找到新的文件

                    if( tLastFileTime > TTime(0) )

                    {

                            filePath.FillZ(KMaxFileName) ;

                            filePath.Zero() ;

                            filePath.Append(tLastFile) ;

                            fileTime = tLastFileTime ;

                    }

                    else

                    {

                            sessionRFs.Close() ;

                            return FALSE ;

                    }

            }

     

            sessionRFs.Close() ;

     

            return TRUE ;

    }

     

    //KEntryAttNormal只查找目录中的文件

    TBool CLaunchCamera::GetLastNewFile(TFileName & filePath , TTime & fileTime)

    {

            RFs sessionRFs;

            User::LeaveIfError(sessionRFs.Connect());

     

            CDir* dirList;

     

            //读出文件夹下文件信息,并对所有的文件进行降序排列

            TInt nError = sessionRFs.GetDir(filePath,KEntryAttNormal, ESortByDate|EDescending,dirList);

            if( nError != KErrNone )

            {

                    sessionRFs.Close() ;

                    return FALSE;

            }       

            else if( dirList->Count() > 0 )

            {

                    //get filename

                    filePath.Append((*dirList)[0].iName) ;

     

                    //get file modification time

                    sessionRFs.Modified(filePath , fileTime ) ;                       

                    delete dirList;

            }

            else

            {

                    sessionRFs.Close() ;

                    return FALSE;

            }

     

            sessionRFs.Close() ;

     

            return TRUE ;

    }

      

    展开全文
  • 酒店摄像头怎么检查 1、开启手机照相功能 关闭房间的灯,拉上窗帘。让房间无一点光线,处于黑暗状态,越黑检查状态越佳!然后打开手机照相功能,围绕房间的转一圈,并检查房间的死角,天花板。电视,空调等等有...

      出行在外,如何检查房间是否被人安装有针孔、隐形摄像头监视,需要到什么工具来检测,如果没有专业工具的话,又有什么简便的方法来检测呢?接下来就为大家介绍关于酒店摄像头怎么检查的教程吧。

    df30d367caa9a4bd6ac23a59fa07611f.png

    酒店摄像头怎么检查

      1、开启手机照相功能

      关闭房间的灯,拉上窗帘。让房间无一点光线,处于黑暗状态,越黑检查状态越佳!然后打开手机照相功能,围绕房间的转一圈,并检查房间的死角,天花板。电视,空调等等有可能安装针孔摄像头的地方。如有针孔摄像头,那么手机上将看到,红点。有红点就是摄像头;

    dbcb5efb2fad8d76f4dcf5bbbec8eb78.png

      2、任何摄像头都需要把可见光采进来才能成像,因此可以根据镜头反射光线来寻找摄像头

      手电对着每一个看着像隐藏摄像头的小孔照,然后观察反射光。最好的练习就是手电筒对着笔记本电脑或者手机的前置摄像头照,来回晃动手电筒,如果看出这种一小点彩色反光,并且晃动手电筒时反射点,你就算入门了。这是通常相机的镜头反光;

    aff55626afb7bc7e4704078e28f5468b.png

      3、摄像头都有一个图像传感器(CCD/CMOS),传感器一般都是需要晶振产生一个时钟,逐像素(场时钟)逐行(行时钟)扫描成像。这些时钟的发生器会有相对比较固定频率的电磁波泄漏。行时钟一般在12MHz到30MHz,场时钟一般在15.625kHz(PAL),15.750kHz(NTSC)。前者可以用多波段收音机在短波波段检测到,如果一般没有电磁屏蔽的摄像头,可以在半米左右就能收听到时钟信号;

      以上就是关于酒店摄像头怎么检查的教程啦,希望可以帮助到大家。

    展开全文
  • 不按照 issue generator 来提交的会被关闭并 block,毕竟提醒每一个故意忽略(眼瞎、文盲或者缺少礼貌?)issue template的人也是件很浪费时间的事。 VUX 并不是大团队维护的项目,没有捐赠,纯靠热情,维护者有权...
  • 而是对本软件进行远程控制):当您不在电脑前时,您可以依据《说明书》中的指令说明,通过手机、电脑、ipad等一切设备(只要可以登上您设置的邮箱就行)对监控软件下达指令,如打开、关闭某个摄像头;要求某个摄像头...
  • 用户在使用APP时,如果首次进入用摄像头的地方,手机会提示是否允许该应用使用摄像头。有些用户小手一抖、或者压根就不想开启摄像头,咔擦,就给你关了,那好了。下回再进入该功能,就会出现APP一片黑,或者崩溃的...
  • 在网上查了很多开启闪光灯方法,很多都是以前EasyAR版本的。 现在使用EasyAR 3.0 很多API方法变了 我试了 很多网上的方法 导到手机上...接下来是我 基于Easy3.0实现 开启和关闭闪光灯功能 1.在 EasyAR文件夹里 ...
  • 在强大的本地监控录像的功能基础上,它还具有强大的摄像头远程监控功能,可以通过互联网实时查看当前监控画面,支持手机远程监控,支持浏览器远程监控。更加可以远程下载回放前面的录像内容。它可以设置成开机自动...
  • 杂牌机-其他安卓手机-无图纸修手机方法:1:手机平板解刨后是由:屏幕-外壳-排线-功能性器件(喇叭震动器按键摄像头电池等)-螺丝卡扣-和主板,构成!2:除了主板以外的所有手机平板组成部分都很容易识别。3:主板再...
  • *微方摄像头监控系统的拥有强大的远程监控功能,让您在上班或到外地出差时也可通过手机或电脑实时查看家中的一切,可以毫不夸张的说,无论您身在何处,您家里的一切尽在您的遥控中 *本软件只要一次注册,即可以终生...
  • 以华为P30W为例,手机图标突然变黑恢复的办法是:1、点击手机“设置”,进入“辅助功能”。2、点击“无障碍”。3、选择“颜色反转”,将其关闭即可。华为P30,是华为公司旗下一款手机手机搭载海思Kirin 980处理器...
  • 设置 — 通用 — 辅助功能 — LED闪烁以示提醒进行开启或关闭开启后,当你收到微信消息,短信以及电话的时候,摄像头上的闪光灯就会亮起来提醒你。特别是夜晚的时候,效果很炫酷,简直亮瞎眼。目前只有苹果手机有...
  • 设置 — 通用 — 辅助功能 — LED闪烁以示提醒 进行开启或关闭开启后,当你收到微信消息,短信以及电话的时候,摄像头上的闪光灯就会亮起来提醒你。特别是夜晚的时候,效果很炫酷,简直亮瞎眼。目前只有苹果手机有...
  • 一对一直播系统集视频、语音、动态、...视频功能详情:关闭或开启主播画面、关闭或开启主播声音、设置前置或者后置摄像头、礼物赠送、轮盘抽奖、礼物背包功能、美颜功能 小视频功能:小视频拍摄和上传、观看小视频、
  • ||摄像头查看 ||开启屏幕录像 ||关闭屏幕录像 ||系统运行记录 ||目标监控 ||关闭监控 ||远程控制 4.权限管理(+) ||开启系统管理 ||开启监控权限 ||开启文件管理 ||开启远程控制 ||关闭远程控制 ||...
  • 觉得麻烦可以后台关闭功能。 3.优化发言延迟问题,发言秒发。 4.前台皮肤可以自由更换。 5.后台可以增加会员。也可批量添加会员。 前台功能 在线聊天、海量在线客户显示,支持文字、表情、图片、主持人语音视频...
  • 那么软件会对其进行拍照(前提是有个能用的摄像头并预先摆好角度,呵呵)并关闭敏感数据并同时发送关键信息到你的手机和邮箱进行提醒。在任何能上网的地方就可以查看对方的照片。 最后,软件使用方法在软件的启动...
  • 2. 使用Camera.open(1)函数获取相机的实例,其中参数1代表前置摄像头。 3. 使用SurfaceHolder.Callback方法建立一个可以预览图像的类CameraPreview。 4. 在主布局文件中放置一个FrameLayout用来存放预览图像。 5. 在...
  • 2、图像处理IC与摄像头之间的信号: SEN_D0-SEN_D7:数据信号; SEN_SDA:数据与地址选择信号; SEN_CLK:时钟信号; SEN_CSB:片选信号; SEN_SCL:I2C总线中时钟信号; SEN_SDA:I2C总线中数据信号; SEN_VSYNC:垂直...
  •  以家庭电脑使用的摄像头手机随带摄像头作为监控的镜头,通过公网的中转服务器来解决设备ip变化的问题。  每一个设备端都使用相同的账户登录中转服务器,目前中转服务和登录校验服务分离,但是宿主同一服务器。...
  • 手表远程预览手机摄像头并控制其拍照 天气同步:自动同步天气设置:可设置为打开或关闭。当设置为打开,智能手表与智能手机连接,智能手机安装“smartwatch”应用程序并打开管理服务 手机/手表相互寻:当智能手表与智能...
  • 测试用例设计-电梯

    2020-10-26 21:07:04
    3)功能测试: 电梯按键(电梯内,电梯外按键,上下按键,楼层数字按键,关闭和打开按键)正常响应,且指示灯亮 电梯最底层是否有下行按钮,最顶层是否有上行按钮 报警装置是否可用,报警电话是否可以拨出,...
  • 图片加载动画

    2016-07-29 18:33:00
    项目中用到了调用前置摄像头功能,然后拍出来的照片需要处理后才能让人脸朝上。刚开始我用重力感应去判断手机当时的方向,效果很好,不管手机是横放还是竖放,拍出来的照片始终是头朝上的,然而有一部手机在测试的...
  • 5.通过手机微信平板电脑可聊天发信息、远程关机、加锁、解锁、查看控制电脑的屏幕图像和摄像头图像。 6.通过设置验证问答题,让小孩在使用电脑的同时达到学习知识之目的。 微家长控制电脑 v3.8.2 更新日志 1.增加...
  • 当中wp7手机上测试应用了照片选择器...所以如果想调试这些功能,要在Zune认出手机连接成功后,关闭Zune,代开SDK中带的小工具:WPConnect,路径: Program Files\Microsoft SDKs\Windows Phone\v7.1\Tools\WPConnect
  • 当中wp7手机上测试应用了...所以如果想调试这些功能,要在Zune认出手机连接成功后,关闭Zune,代开SDK中带的小工具:WPConnect,路径: Program Files\Microsoft SDKs\Windows Phone\v7.1\Tools\WPConnect 直接执...

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 129
精华内容 51
关键字:

关闭手机摄像头功能