西安兵器博物馆:FootStep 40、如何调用S60的系统摄像头功能进行拍照与摄像? - AlwaysO...

来源:百度文库 编辑:九乡新闻网 时间:2024/07/14 03:45:51
您还未登录!|登录|注册|帮助
CSDN首页 资讯 论坛 博客 下载 搜索 更多CTO俱乐部
学生大本营
培训充电
移动开发
软件研发
云计算
程序员
TUP
AlwaysOnline的专栏
迈向技术大师的路……
条新通知 登录 注册 欢迎 退出 我的博客 配置 写文章 文章管理 博客首页   全站 当前博客  空间 博客 好友 相册 留言 用户操作
[留言]  [发消息]  [加为好友] 
笑笑ID:AlwaysOnline共55806次访问,排名3163,好友0人,关注者3人。
","qq":"
笑笑的文章
原创 28 篇
翻译 0 篇
转载 1 篇
评论 14 篇
订阅我的博客
    
 
 
 
[编辑]AlwaysOnline的公告
[编辑]文章分类
0、blog动态
1、Brew开发技术
2、Symbian开发技术
3、windows开发
4、技术术语详解
5、音视频编解码
6、Linux开发
Symbian技术
[编辑]大师Blog
潘爱民的专栏
[编辑]链接收藏
[编辑]社区Blog
《CSDN社区电子杂志——C/C++杂志》官方blog
《程序员》官方BLOG
CSDN Blog开发组
[编辑]我的Blog系列
【我的杂谈】
【我的相册】
[编辑]我的朋友
俊俊的共享空间
牛阿牛的blog
[编辑]移动开发
存档
2010年03月(1)
2008年05月(1)
2007年09月(1)
2007年08月(1)
2006年10月(1)
2006年09月(2)
2006年06月(1)
2006年04月(15)
2006年03月(4)
2006年02月(2)
公告: Bambook达人赛CSDN提交作品的来登记哦! [意见反馈][官方博客]   FootStep 40、如何调用S60的系统摄像头功能进行拍照与摄像? 收藏
在nokia的论坛上提供了调用S60系统摄像头的示例代码,但在使用中我们发现,(1)需要指定系统摄像头app的UID,因为不同型号的S60手机系统摄像头app的UID可能不同,就需要开发者跟据不同手机的摄像头ID进行适配;(2)没有提供拍照后的文件信息,当完成拍照或录像后没法知道所对应的影像文件;(3)完成摄像后没有关闭摄像头,这样在某些手机上(如N70)无法第二次启动摄像头;针对存在的这三个问题,我们做了如下工作:Ø        自动查找摄像头app的UID;Ø        打开摄像头Ø        查找完成操作后的相关影像文件;Ø        关闭摄像头的系统调用; 一、自动查找摄像头app的UID
     通过RApaLsSession的GetAllApps接口可以得到所有系统上应用程序的信息,包括UID,Full path name,Caption ,在其中一一比对系统摄像头所在的文件路径,找到其UID。 具体代码见附录二中的CLaunchCamera::FindCamera  其中对KCameraAppString定义说明如下:1、KCameraAppString定义了系统摄像头在设备上的路径模拟器及大部分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:查找文件选项,这里使用KEntryAttNormalanEntrySortKey:查找结果的排序选项,这里使用ESortByDate|EDescending,即按时间进行降序排序anEntryList:查找到的文件例表;aDirList:查找到的文件目录例表; 具体查找代码见附录二中的CLaunchCamera::GetLastFile与LaunchCamera::GetLastNewFile 四:关闭摄像头的系统调用
 
   在使用完摄像头后要调用CEikProcess的DestroyDocument接口,删除对系统摄像头的调用,否则在有些手机上无法第二次调用摄像,但要注意的时DestroyDocument接口不能在回调通知函数NotifyExit中调用,否则程序会crash,我们的变通方法是CLaunchCamera的外部调用启动一下timer,在timer中轮询调用EnableCloseCamera来判断当前的摄像头是否可以关闭。 附录一:CLaunchCamera的类定义: #include
#include //for MApaEmbeddedDocObserver
#include //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 //for CEikProcess#include //for CEikProcess#include //for PathInfo#include   //for RApaLsSession#include   // 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 FALSETBool 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 aModevoid 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 ;}
发表于 @ 2006年09月26日 14:50:00 | 评论( 3 ) | 编辑| 举报| 收藏 旧一篇:做项目,很久没有更新blog啦! | 新一篇:FootStep 41、symbian编程的几点注意(未完)
查看最新精华文章 请访问博客首页相关文章
好玩的Nokia 6220Nokia手机的S40系列对j2me等的支持如何调用S60的系统摄像头功能进行拍照与摄像?zz让你看了,你也许后怕....我的V360i手机软件、游戏以及手机网站等上周六 手机拍照试验 上在mobile上调用SHCameraCapture接口进行拍照用于建档、报名的摄像软件aid007 发表于2007年9月10日 10:33:39  IP:举报回复删除
我想调用系统的camera,但我寻找了很久都没有找到这方面的演示程序,你的文章是第一个。当然,我也到NOKIA和SYMBIAN上找了,没有结果。不知道你方便将这个演示程序发给我一份吗。我的油箱是aid007@tom.com。谢谢。AlwaysOnline 发表于2007年9月10日 23:28:36  IP:举报回复删除
回复 aid007:文章里不是已给出了源码了嘛,你在用到的地方创建一个实例,然后调用OpenCamera就可以啦,呵呵
zdoublej4 发表于2009年9月17日 16:22:14  IP:举报回复删除
你的 MCameraEvenCallBack 类 虚函数没实现 zdoublej4 发表于2009年9月17日 16:43:41  IP:举报回复删除
没认真看 是不是 得到了照片或视频的路径 后在 MCameraEvenCallBack ::Camera_HandleFile() 在这个函数中处理 视频或照片?发表评论 表 情:           评论内容:  用 户 名: 登录 注册 匿名评论 匿名用户验 证 码:   重新获得验证码    热门招聘职位【UC优视】UC浏览器,聘技术经理、高级工程师、产品经理【DeNA China】10K~30K月薪诚聘Android开发工程师【成都奥毕】诚聘软件开发工程师,高薪+奖金+优厚福利邀您共同发展【Red/SAFI】北京公司诚聘开发人员.net iPhone等【Google背景公司】年薪10万到30万急聘(C++linux、产品经理、java、UI设计)有期权!【上海博天】热聘JAVA网站客户端研发人员【中国领先手机游戏索乐公司】诚聘英才【上海杰图】诚聘中高级C++人才,待遇优、环境好、邀你共创美好未来!【北京东方国信】年薪4到25万诚聘JAVA程序员(初级、中级、高级、主管、部门经理)【诺姆四达EHR】高薪诚聘软件系统工程师、JAVA工程师、数据库工程师、测试工程师【E人E本】热招各类开发人才(Android、java、PHP),更多职位,点击进入【中国知网】高薪诚聘精英技术人才 【UC优视】UC浏览器,聘技术经理、高级工程师、产品经理【DeNA China】10K~30K月薪诚聘Android开发工程师【成都奥毕】诚聘软件开发工程师,高薪+奖金+优厚福利邀您共同发展【Red/SAFI】北京公司诚聘开发人员.net iPhone等【Google背景公司】年薪10万到30万急聘(C++linux、产品经理、java、UI设计)有期权!【上海博天】热聘JAVA网站客户端研发人员【中国领先手机游戏索乐公司】诚聘英才【上海杰图】诚聘中高级C++人才,待遇优、环境好、邀你共创美好未来!【北京东方国信】年薪4到25万诚聘JAVA程序员(初级、中级、高级、主管、部门经理)【诺姆四达EHR】高薪诚聘软件系统工程师、JAVA工程师、数据库工程师、测试工程师【E人E本】热招各类开发人才(Android、java、PHP),更多职位,点击进入【中国知网】高薪诚聘精英技术人才  公司简介|招贤纳士|广告服务|银行汇款帐号|联系方式|版权声明|法律顾问|问题报告
北京创新乐知信息技术有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
江苏乐知网络技术有限公司 提供商务支持
 Email:webmaster@csdn.net
Copyright © 1999-2010, CSDN.NET, All Rights Reserved
  本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/alwaysonline/archive/2006/09/26/1287665.aspx