一.S40中只能调用系统的浏览器,而且调用后需要将j2me程序关闭掉,否则浏览器出不来:
platformRequest("http://www.baidu.com");
Thread.sleep(1000);
notifyDestroyed();
二.S60中调用系统浏览器:
void OpenBrower(HBufC* aUrl)
{
HBufC* param = HBufC::NewLC (aUrl->Length ()+ 4);
param->Des().Copy ( _L( "4 " ));
const TInt KBrowserUid = 0x10008D39;
TUid id( TUid::Uid ( KBrowserUid));
TApaTaskList taskList( CEikonEnv::Static()->WsSession ());
TApaTask task = taskList.FindApp ( id);
param->Des().Append (aUrl->Des ());
if ( task.Exists ())
{
RWsSession WsSession = CCoeEnv::Static()->WsSession ();
TInt ForegroundWinGroup = WsSession.GetFocusWindowGroup ();
HBufC8* param8 = HBufC8::NewLC ( param->Length ());
param8->Des().Append (*param);
task.SendMessage (TUid::Uid ( 0), *param8); // Uid is not used
if ( task.WgId () != ForegroundWinGroup) //If the native camera application is on the foreground
{
task.BringToForeground ();
}
CleanupStack::PopAndDestroy ();
}
else
{
RApaLsSession appArcSession;
User::LeaveIfError (appArcSession.Connect ()); // connect to AppArc server
TThreadId id;
appArcSession.StartDocument (*param, TUid::Uid ( KBrowserUid), id);
appArcSession.Close ();
}
CleanupStack::PopAndDestroy (); // param
}
以上两个方法都是从网上Copy过来的,在实际的项目中通过测试,笔记一下。
由于不能自由DIY,也懒得深入,重点来看看Symbian中的浏览器控件。
项目需要S60 2nd,那就从2nd入手了。
由于以前没有接触过浏览器控件,虽然做过几个项目,也没有认真地看过Symbian的帮助文档,感觉如果不是真需要了解什么东西而去看文档的话,是很枯燥的。
人懒最喜欢的就是google了,一搜就可以得到想要的代码。
第一搜:浏览器控件需要CBrCtlInterface,嗯,顺藤摸瓜继续搜。
第二搜:Series_60_Browser_Control_API_Developer_Guide_v2_0_en.pdf
这个文档说明是需要3rd的,这个简单再搜一个V1不就得了,可搜过来搜过去就没找到V1的,
(其实在2nd的帮助文档Developer Guides->Browser Control API Developer's Guide 下可以找到这个文档:)
看来搜到此结束了,看看V2里面都有什么,3rd居然有例子。
果然S60_3rd_MR/S60Ex/BrCtlSampleApp目录下面有很多源代码。
一堆observer,有些糊涂了,管它3rd、2nd,能用就是好代码。
先创建一个2nd的工程,
先在mmp文件中加库文件
LIBRARY BrowserEngine.lib
后面还有用到两个:
LIBRARY apmime.lib apgrfx.lib
下来重点改Container文件了,先include两个头文件
#include <brctlinterface.h>
#include <brctldefs.h>
追加接口以及方法:
class CTestBrowserContainer : public CCoeControl, MCoeControlObserver, MBrCtlDataLoadSupplier
private:
void HandleControlEventL(CCoeControl *aControl, TCoeEvent aEventType);
void CancelLoad();
不知道这两个接口是干嘛的,那就写两个空方法:
void CTestBrowserContainer::HandleControlEventL(CCoeControl *aControl, TCoeEvent aEventType)
{
}
void CTestBrowserContainer::CancelLoad()
{
}
一般来说,开头第一步总是最难的,其它的不写了,build一下看看。
果然编译错误,找不到variant.h文件,3rd里也没有找到,晕啊。
看来又得google了,终于搜出一篇论坛文章,说是自己写一个 variant.h就可以了,
于是建了一个空文件,再编译,果然过了,那就继续GO:
在头文件中添加变量:
private:
TInt iCommandBase;
TInt iBrCtlCapabilities;
CBrCtlInterface* iBrCtlInterface;
有指针当然得释放了,呵呵,虽然还没有创建,delete先:
CTestBrowserContainer::~CTestBrowserContainer()
{
if (iBrCtlInterface)
{
delete iBrCtlInterface;
}
}
创建一个最简单的CBrCtlInterface:
void CTestBrowserContainer::ConstructL(
...
iCommandBase = TBrCtlDefs::ECommandIdBase;
iBrCtlCapabilities = TBrCtlDefs::ECapabilityDisplayScrollBar
| TBrCtlDefs::ECapabilityLoadHttpFw
| TBrCtlDefs::ECapabilityClientNotifyURL
| TBrCtlDefs::ECapabilityClientResolveEmbeddedURL;
TRect rect(Position(), Size());
iBrCtlInterface = CreateBrowserControlL( this,
rect,
iBrCtlCapabilities,
iCommandBase,
NULL,
NULL,
NULL,
NULL,
NULL);
_LIT(KUrl, "http://www.baidu.com");
iBrCtlInterface->LoadUrlL( KUrl );
}
开头第一步总是最难的,先运行一下看看效果,