• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            franksunny的個(gè)人技術(shù)空間
            獲得人生中的成功需要的專(zhuān)注與堅(jiān)持不懈多過(guò)天才與機(jī)會(huì)。 ——C.W. Wendte

            做好產(chǎn)品

            ——《Facebook效應(yīng)》讀后

            全書(shū)概括

            這一陣子匆匆看完了一遍大衛(wèi)的《Facebook效應(yīng)》,從書(shū)中我們可以一窺Facebook這個(gè)傳奇產(chǎn)品的啟動(dòng)和發(fā)展歷程。整本書(shū)差不多是按照時(shí)間順序來(lái)展開(kāi)的,書(shū)的架構(gòu)大致可以分為:

            前面十一章主要記敘了Facebook這個(gè)產(chǎn)品和公司從無(wú)到有的發(fā)展歷程;

            十二、十三兩章主要描述Facebook最大的盈利來(lái)源廣告的來(lái)歷及其廣告形式;

            十四、十五章重點(diǎn)描述了Facebook的全球化和饋贈(zèng)型經(jīng)濟(jì)理念;

            十六章概述了2009年一年中Facebook的發(fā)展;

            十七章重點(diǎn)描述了馬克和Facebook貫穿始終的產(chǎn)品理念。

            以上劃分僅僅是我粗讀一遍的小結(jié),本非大衛(wèi)的官方說(shuō)法,為此僅供參考。

            產(chǎn)品的三條線(xiàn)

            閱讀這本書(shū),可以讓我這個(gè)從來(lái)沒(méi)有用過(guò)Facebook的人大致了解Facebook公司和產(chǎn)品的三條線(xiàn):產(chǎn)品線(xiàn)、運(yùn)營(yíng)線(xiàn)和融資線(xiàn)(價(jià)值線(xiàn))。

            產(chǎn)品線(xiàn)脈絡(luò)

            2004年2月4日第一次上線(xiàn)產(chǎn)品,功能僅包含照片、簡(jiǎn)介,添加好友和捅人;

            2004年9月,增加留言墻和群組功能;

            2005年夏,開(kāi)放高中生注冊(cè),但獨(dú)立運(yùn)營(yíng),與大學(xué)部不互通;

            2005年11月左右,上線(xiàn)圖片功能;

            2006年2月,高中部和大學(xué)部互聯(lián);

            2006年5月,職場(chǎng)網(wǎng)絡(luò)首次登場(chǎng),遭遇冷場(chǎng);

            2006年9月5日,上線(xiàn)動(dòng)態(tài)新聞和涂鴉墻;

            2006年9月26日,面向全世界開(kāi)放注冊(cè);

            2007年5月24日F8大會(huì)的舉辦,意味著開(kāi)放平臺(tái)的上線(xiàn)(6個(gè)月后,注冊(cè)的開(kāi)發(fā)者達(dá)到25萬(wàn),運(yùn)行的應(yīng)用程序達(dá)到了2萬(wàn)5千個(gè));

            2007年11月6日,燈塔和自助在線(xiàn)廣告項(xiàng)目上線(xiàn);

            2008年末,facebook聯(lián)誼會(huì)啟動(dòng);

            2009年3月,開(kāi)始仿Twitter;

            2009年4月,開(kāi)放信息流API(stream API),意味著Facebook的發(fā)展,將逐漸走出Facebook網(wǎng)站(按我的理解,已經(jīng)上升到產(chǎn)品精神階段)。

            運(yùn)營(yíng)線(xiàn)脈絡(luò)

            2004年2月4日在哈佛上線(xiàn),其后逐步分批地在常春藤院校中鋪開(kāi),在第一批用戶(hù)的發(fā)展上做得相當(dāng)成功(產(chǎn)品運(yùn)營(yíng)6月后,剛滿(mǎn)20歲的馬克,就有風(fēng)投愿意估值1000萬(wàn)美元,不過(guò)也只是意向而已);

            2004年,在面臨眾多校園同類(lèi)產(chǎn)品時(shí),馬克采用了“包圍策略”;

            2004年11月30日,運(yùn)營(yíng)10個(gè)月后迎來(lái)百萬(wàn)注冊(cè)用戶(hù);

            2004年12月,蘋(píng)果公司折扣推廣廣告活動(dòng),為公司初期帶來(lái)了穩(wěn)定的大額營(yíng)收;

            2005年夏,公司總裁帕克被解職,意味著Facebook的運(yùn)營(yíng)將走向更加職業(yè)化(這是我自己的理解);

            2005年10月,注冊(cè)用戶(hù)達(dá)到500萬(wàn);

            2005年,達(dá)到500萬(wàn)之后幾個(gè)星期,團(tuán)隊(duì)從用戶(hù)們頻繁更改簡(jiǎn)介圖片,引發(fā)圖片功能上線(xiàn)(起初扎克伯格并未同意,但最終被說(shuō)服,到2009年末,facebook擁有300億張圖片,成為擁有最多圖片的網(wǎng)站);

            2006年9月5日上線(xiàn)動(dòng)態(tài)新聞和涂鴉墻(圖片功能的成功,讓他們挖掘成功的原因,借鑒RSS,構(gòu)建了全新的動(dòng)態(tài)新聞,不過(guò)后來(lái)遭遇了危機(jī),甚至游行,扎克伯格等人看到了動(dòng)態(tài)新聞的轟動(dòng)效應(yīng),更加堅(jiān)定了動(dòng)態(tài)新聞的正確性,并且48小時(shí)內(nèi)攻堅(jiān)增加了隱私控制功能以讓用戶(hù)設(shè)定哪些動(dòng)態(tài)可以發(fā)布出去);

            2006年9月26日,在平息動(dòng)態(tài)新聞后,開(kāi)放注冊(cè),意味著對(duì)除了大學(xué)、高中和職場(chǎng)后,面向全社會(huì)開(kāi)放;

            2006年10月,每日注冊(cè)數(shù)達(dá)5萬(wàn),注冊(cè)用戶(hù)達(dá)到了1000萬(wàn)(12月份,活躍用戶(hù)為1200萬(wàn));

            2007年5月24日,活躍用戶(hù)達(dá)2400萬(wàn),每天有15萬(wàn)人加入(一年后,這個(gè)數(shù)據(jù)達(dá)到了7000萬(wàn));

            2007年11月6日上線(xiàn)的燈塔災(zāi)難,沒(méi)有被及時(shí)處理,直到11月29日才改進(jìn)產(chǎn)品,但顯然為時(shí)已晚了,該事件最終導(dǎo)致首席運(yùn)營(yíng)官在2008年3月由謝麗爾替代范,這一高管變動(dòng),使Facebook走上了強(qiáng)勁的廣告和盈利之路,并一舉邁入了;

            2008年8月,活躍用戶(hù)達(dá)1.45億;

            2009年2月份的新服務(wù)條款事件,從起初的反對(duì)到最后演變成贊許;

            2009年8月,F(xiàn)aceBook花5000萬(wàn)美元收購(gòu)Friendfeed(一家由google前明星級(jí)程序員員工開(kāi)發(fā)的產(chǎn)品);同時(shí)當(dāng)月的活躍用戶(hù)達(dá)到2.75億;

            2010年7月,活躍用戶(hù)數(shù)為5億。

            融資(價(jià)值)線(xiàn)脈絡(luò)

            起初學(xué)院派的融資,馬克和薩維林各投入1萬(wàn)美元運(yùn)作,2004年夏由于薩維林的凍結(jié)賬戶(hù),馬克后來(lái)借債自掏腰包近10萬(wàn)用于運(yùn)作;

            2004年秋季開(kāi)學(xué)前,被泰爾等估值500萬(wàn)美元,泰爾等人注資60萬(wàn)美元;

            2005年5月前后,被阿克塞爾合伙公司估值1億美元,吉姆.布雷耶聯(lián)合公司投資1370萬(wàn)美元;

            2006年4月,被估值5億美元,接受了2750萬(wàn)美元的第三輪投資,從而緩解了當(dāng)時(shí)五六月份被維亞康姆8億美元收購(gòu)的可能,不過(guò)由于進(jìn)軍職場(chǎng)網(wǎng)絡(luò)的失意,在10億美元售出的決定中搖擺,很可惜雅虎在馬克等人猶豫不決時(shí)沒(méi)有一鼓作氣拿下);

            2007年10月24日,被估值150億美元,微軟投入2.4億美元購(gòu)得1.6%股份,李嘉誠(chéng)投入6000萬(wàn)美元購(gòu)得0.4%股權(quán),后來(lái),李嘉誠(chéng)追加了6000萬(wàn)美元的投資,再加上其他的投資,這一輪融資達(dá)到3.75億美元,為Facebook后來(lái)迎接08年開(kāi)始的次貸危機(jī)引發(fā)的經(jīng)濟(jì)蕭條中積累了大量資源。

            書(shū)中咸少提到盈利,一方面Facebook前期發(fā)展還是主要靠融資而非盈利,二來(lái)我覺(jué)得融資和盈利都是反應(yīng)產(chǎn)品價(jià)值線(xiàn)方向的東西,所以就沒(méi)做梳理。另外由于成書(shū)在2010年,所以Facebook飛速發(fā)展的最近兩年都沒(méi)有囊括進(jìn)去,我也比較懶,不想去詳細(xì)追求一些近來(lái)的數(shù)據(jù)追加到這三條線(xiàn)的后面,不過(guò)從書(shū)中所敘述,已經(jīng)詳盡地展示了Facebook從無(wú)到有,從小到大的發(fā)展歷程,對(duì)于我們了解Facebook的產(chǎn)品發(fā)展,已經(jīng)足夠了。

            小品

            通過(guò)這本書(shū),讓我感悟到產(chǎn)品與產(chǎn)品經(jīng)理的一些東西:

            Facebook這個(gè)產(chǎn)品的成功,跟其一直有馬克主導(dǎo)有關(guān)系,相比較與其它很多大公司收購(gòu)一些成功的產(chǎn)品,最后都走向衰退甚至銷(xiāo)聲匿跡(諸如雅虎曾經(jīng)收購(gòu)的很多新穎的產(chǎn)品,以及本書(shū)中提到的MySpace的收購(gòu))。產(chǎn)品的主將或者產(chǎn)品主將的思想或者夢(mèng)想很重要,自己從事軟件開(kāi)發(fā)也有很長(zhǎng)一段時(shí)間了,接觸過(guò)很多產(chǎn)品的開(kāi)發(fā),特別是在網(wǎng)易的經(jīng)歷,讓我更加深信一個(gè)好的產(chǎn)品,必須要有一個(gè)一以貫之的理念或思想,否則很容易跑題或者成為一個(gè)四不像,一個(gè)起初很不錯(cuò)的最小產(chǎn)品,最后都會(huì)迭代成一個(gè)用戶(hù)壓根不想用的臃腫產(chǎn)品。

            產(chǎn)品的立意要明確而深遠(yuǎn),產(chǎn)品的執(zhí)行要循序漸進(jìn)。Facebook起初的功能很少,很多同類(lèi)產(chǎn)品可能做的比Facebook還要早還要好,但是Facebook之所以能夠超越別的產(chǎn)品,后來(lái)者居上,與馬克堅(jiān)持的“做最好的、最簡(jiǎn)單的、讓用戶(hù)以最方便的方式分享信息的產(chǎn)品”的明確立意和Facebook一步一步扎實(shí)地在大學(xué)院校擴(kuò)展到全世界有著必然的關(guān)系。作為一個(gè)人呢難免會(huì)動(dòng)搖意志,特別是在遭遇困難和利誘時(shí),F(xiàn)acebook就曾經(jīng)差點(diǎn)被賣(mài)給雅虎,當(dāng)時(shí)具有長(zhǎng)遠(yuǎn)夢(mèng)想的馬克也屈服了,但是命運(yùn)之神還是眷顧馬克,讓彼時(shí)的雅虎遭遇了下挫折,如果那個(gè)時(shí)候Facebook真的賣(mài)給了雅虎,或許現(xiàn)在的Facebook就沒(méi)有那么成功了。另外馬克還有一個(gè)夢(mèng)想,就是期許Facebook能夠達(dá)到“教人從善”和“讓FaceBook成為使世界變得更小的工具”,這個(gè)夢(mèng)想遠(yuǎn)遠(yuǎn)超過(guò)了其盈利和開(kāi)辦一家企業(yè)的動(dòng)力,成為Facebook這個(gè)產(chǎn)品生生不息的產(chǎn)品精神。

            本書(shū)十二、十三兩章,重點(diǎn)描述謝麗爾加入Facebook后在廣告方面的方案,這兩章提到了很多諸如條幅廣告、對(duì)接式廣告、交互式廣告、滿(mǎn)足需求的廣告、產(chǎn)生需求的廣告和在線(xiàn)自助廣告等等廣告概念的提出,讓我這個(gè)同樣厭惡廣告的人,也對(duì)廣告產(chǎn)生了興趣,讓我相信其實(shí)廣告作為一種信息也是可以達(dá)到雙贏的效果,而并非以前看電視劇時(shí)那么反感廣告了(但是很多廣告方面的知識(shí)真的匱乏,希望有人能夠指點(diǎn)一下,或者介紹些資料)。

            本書(shū)雖然并非小說(shuō),但是讓人看起來(lái)就像是看小說(shuō)一樣,很多人物,諸如馬克、莫斯科維茨、肖恩、吉姆和泰爾等等人物都很豐滿(mǎn),對(duì)我留下深刻影響的還是肖恩,作為一個(gè)爭(zhēng)議人士,正是由于他的杰出工作,幫助馬克他們團(tuán)隊(duì)真正從小打小鬧,邁向了企業(yè)化進(jìn)程,肖恩這個(gè)角色扮演的絕對(duì)是Facebook發(fā)展歷程中使得校園產(chǎn)品脫穎而出的基石。

            目前就暫時(shí)小品到這里吧,這本書(shū)還是相當(dāng)不錯(cuò)的,感謝火花網(wǎng)提供電子版本。

            posted @ 2012-05-28 02:33 frank.sunny 閱讀(610) | 評(píng)論 (0)編輯 收藏

            由于黏貼后原有圖片顯示不出來(lái),感興趣的可以下載word文檔,詳見(jiàn)如下 http://m.shnenglu.com/Files/franksunny/Using%20internal%20and%20hide%20api.rar

            使用internal(com.android.internal)和hidden(@hide)APIs

            Part One

            原文路徑:http://devmaze.wordpress.com/2011/01/18/using-com-android-internal-part-1-introduction/

            Android有兩種類(lèi)型的API是不能經(jīng)由SDK訪(fǎng)問(wèn)的。

            第一種是位于com.android.internal包中的API。我將稱(chēng)之為internal API。第二種API類(lèi)型是一系列被標(biāo)記為@hide屬性的類(lèi)和方法。從嚴(yán)格意義上來(lái)講,這不是一個(gè)單一的API,而是一組小的被隱藏的API,但我仍將其假設(shè)為一種API,并稱(chēng)之為hidden API。

            Hidden API 例子

            你可以查看一下android的源碼,并能找到一些變量、函數(shù)和類(lèi)等,都被@hide屬性標(biāo)記了。

            下面的例子就是在WifiManager(API 10源碼)中隱藏的變量。

            image_thumb13_thumb

            另一個(gè)例子是在WifiManager(API 10源碼)中隱藏了setWifiApEnabled函數(shù)。

            image_thumb15_thumb

            因此,只要你看到@hide屬性,那你看到的就是hidden API。

            Internalhidden API的區(qū)別

            Hidden API之所以被隱藏,是想阻止開(kāi)發(fā)者使用SDK中那些未完成或不穩(wěn)定的部分(接口或架構(gòu))。舉個(gè)例子,Bluetooth API在API 5(Android 2.0)上才開(kāi)放;在API 3 和4上都是用@hide屬性隱藏了。當(dāng)這些API被驗(yàn)證和清理后,Google的開(kāi)發(fā)者會(huì)移除@hide屬性,并讓其在API 5官方化。很多地方在API 4 和5之間發(fā)生了變化。如果你的程序依賴(lài)某些隱藏的API,當(dāng)其部署到新的平臺(tái)上時(shí),就有可能陷入困境。

            對(duì)于internal API來(lái)說(shuō),從來(lái)都沒(méi)有計(jì)劃將其開(kāi)放出來(lái)。它就是Android的“內(nèi)部廚房”,對(duì)開(kāi)發(fā)者來(lái)說(shuō),應(yīng)該將其視作黑盒。凡事都會(huì)有變化的。如果你依賴(lài)某些internal API,也有可能在新的Android release上,這些internal API發(fā)生變化,從而令你失望。

            總結(jié)一下區(qū)別:

            Hidden API = 進(jìn)行中的工作;

            Internal API = 黑盒;

            Internalhidden API的編譯時(shí) vs. 運(yùn)行時(shí)

            當(dāng)你使用Android SDK進(jìn)行開(kāi)發(fā)的時(shí)候,你引用了一個(gè)非常重要的jar文件——android.jar。它位于Android SDK平臺(tái)的文件夾中(SDK_DIR/platforms/platform-X/android.jar,其中,X表示API等級(jí))。這個(gè)android.jar移掉了com.android.internal包中所有的類(lèi),也移掉了所有標(biāo)記有@hide的類(lèi),枚舉,字段和方法。

            但當(dāng)你在設(shè)備上啟動(dòng)應(yīng)用程序時(shí),它將加載framework.jar(簡(jiǎn)單來(lái)說(shuō),它和android.jar等同),而其未移掉internal API和hidden API。(但它對(duì)開(kāi)發(fā)者來(lái)說(shuō),并不能友好地訪(fǎng)問(wèn),因此,我將向大家展示不通過(guò)反射如何使用這些API)。

            關(guān)于internal API,還有一件事需要說(shuō)明。Eclipse的ADT插件增加了一個(gè)額外的規(guī)則,那就是禁止使用com.android.internal包中的任何東西。所以,即便是我們可以拿到最原始的android.jar(未刪減版),也沒(méi)有輕松的辦法通過(guò)Eclipse使用這些internal API。

            你可以親自檢查一下。創(chuàng)建一個(gè)新的Android工程(或者使用已有的)。查看一下它引用的類(lèi)庫(kù)(右擊project Properties –> Java Build Path –> Libraries)。

            image_thumb30_thumb

            image_thumb29_thumb

            重要的總結(jié):internal和hidden API在SDK中是按照一樣的方式處理的(都從android.jar中移除了),但internal API更慘的是,還被Eclipse的ADT插件顯式禁止了。

            不通過(guò)反射使用internalhidden API

            這些文章的終極目標(biāo)是讓開(kāi)發(fā)者能夠不通過(guò)反射使用Internal和Hidden API。如果你完成了接下來(lái)部分中描述的步驟,你將能使用這些Internal和Hidden API,如同公開(kāi)的API。你不再需要使用反射。

            注:如果你正在使用這些非公開(kāi)的API,你必須知道,你的程序有著極大的風(fēng)險(xiǎn)?;旧?,無(wú)法保證在下一次的Android OS更新時(shí),這些API不被破壞,也無(wú)法保證不同的運(yùn)營(yíng)商有著一致的行為。你自己決定吧。

            接下來(lái)有三個(gè)場(chǎng)景:

            1. Internal 和hidden API都可用(場(chǎng)景A)

            2. 只Hidden API可用(場(chǎng)景B)

            3. 只Internal API可用(場(chǎng)景C)

            場(chǎng)景A是B、C的總和。場(chǎng)景B是最簡(jiǎn)單的一個(gè)(不需要對(duì)Eclipse的ADT修改)。

            場(chǎng)景A:閱讀Part1, 2, 3, 4, 5

            場(chǎng)景B:閱讀Part1, 2, 3, 5

            場(chǎng)景C:閱讀Part1, 2, 3, 4, 5

            Part 2

            原文路徑:http://devmaze.wordpress.com/2011/01/18/using-com-android-internal-part-2-hacking-around/

            在上一篇中,我解釋了為什么我們不通過(guò)反射就會(huì)很難使用internal和hidden API。這是因?yàn)閍ndroid.jar中就沒(méi)包含這些API,因此,沒(méi)人能夠在編譯時(shí)引用這些類(lèi)。

            這篇文章將描述如何還原最初的android.jar。這將允許我們像使用公開(kāi)的API那樣使用internal和hidden API。

            如何得到原版android.jar?

            我們需要修改android.jar,這樣它才能包含所有的*.class文件(包括internal和hidden API類(lèi))。有兩種辦法:

            1) Android是一個(gè)開(kāi)源工程。我們可以下載源碼并搭建編譯環(huán)境,這樣它就不能移除那些internal和hidden的類(lèi)了。這個(gè)辦法比較困難;

            2) 每個(gè)模擬器或真機(jī)在運(yùn)行時(shí)都會(huì)有一個(gè)等同android.jar的東西。我們可以從這里拿到j(luò)ar文件,提取出原始的.class文件,并拷貝到Android SDK的android.jar中。

            我將采用方案2。它易于開(kāi)始,還不需要搭建Linux環(huán)境及編譯環(huán)境等。

            從設(shè)備上獲取framework.jar

            你可以使用命令行(adb pull)從模擬器或設(shè)備上下載文件,或者使用DDMS(借助Eclipse或SDK中的應(yīng)用)。

            注意:模擬器通常在.dex文件中包含代碼,而真機(jī)一般在優(yōu)化版的dex文件中包含代碼——odex文件。操作odex文件比較困難,這也是為什么我選擇模擬器的原因。

            與Android SDK中的android.jar等同的文件是framework.jar。這個(gè)文件位于設(shè)備的:/system/framework/framework.jar

            adb pull /system/framework/framework.jar

            image當(dāng)framework.jar從設(shè)備上下下來(lái)之后,重命名為framework.zip并解壓到獨(dú)立的文件夾中,看起來(lái)是這個(gè)樣子的:

             

            classes.dex正是我們需要的。

            創(chuàng)建framework-classes.zip

            首先,我們需要把.dex文件轉(zhuǎn)換成.jar格式。你可以使用通用的工具dex2jar。只需要運(yùn)行:

            dev2jar classes.dex

            當(dāng)轉(zhuǎn)換結(jié)束時(shí),你應(yīng)該得到了classes.dex.dex2jar.jar文件。重命名為framework-classes.zip。使用zip查看器,進(jìn)入到framework-classes.zip/com/android/internal/:

            image

            恭喜你,你已經(jīng)擁有了所有的.class文件,包括internal和hidden API(盡管截圖只確認(rèn)了internal部分)。

            創(chuàng)建original-android.jar

            Android SDK的android.jar位于ANDROID_SDK/platforms/android-X/android.jar(X表示API等級(jí))。

            拷貝android.jar成custom-android.jar。解壓至custom-android文件夾。將framework-classes.zip中所有的.class文件拷貝到custom-android文件夾中(你需要覆蓋所有已經(jīng)存在的.class文件)。

            然后,壓縮custom-android文件成original-android.zip。重命名為original-android.jar。

            步驟總結(jié)

            1. 選擇你的目標(biāo)平臺(tái)X

            2. 創(chuàng)建目標(biāo)平臺(tái)X的模擬器

            3. 啟動(dòng)模擬器,下載/system/framework/framework.jar

            4. 重命名framework.jar -> framework.zip

            5. 從framework.zip中抽取classes.dex

            6. 使用dex2jar工具,將其轉(zhuǎn)換成classes.jar

            7. 重命名classes.jar -> framework-classes.zip

            8. 拷貝android.jar –> custom-android.zip

            9. 解壓custom-android.zip至custom-android文件夾

            10. 將framework-classes.zip中所有文件拷貝至custom-android文件夾(覆蓋存在的文件)

            11. 壓縮custom-android文件夾成original-android.zip

            12. 重命名original-android.zip -> original-android.jar

            打完收功。

            總結(jié)

            我們還原了android.jar,使其包含所有的internal和hidden API的.class文件。這只是第一步。下一步將創(chuàng)建定制的android平臺(tái),使其使用未刪節(jié)版的android.jar,并將其添加到Android SDK platforms文件夾中。

            Part 3

            原文路徑:http://devmaze.wordpress.com/2011/01/18/using-com-android-internal-part-3-custom-android-platform/

            在上一篇中,我已經(jīng)展示了如何創(chuàng)建一個(gè)包含所有internal和hidden API的original-android.jar。

            接下來(lái)的工作就是要修改已經(jīng)存在的Android平臺(tái)(SDK_DIR/platforms/platform-X/android.jar,X表示API等級(jí))。你可以直接使用Part2中創(chuàng)建的original-android.jar替換android.jar。但這樣的話(huà),你的所有工程都將直接使用internal和hidden API而沒(méi)有任何限制。這不夠方便,因?yàn)樵诙鄶?shù)的工程中你不希望這樣。甚至,你可能更希望禁止這些API(ADT/android.jar的默認(rèn)行為)。但對(duì)于一些特定的工程,你希望能夠使用這些internal和hidden API。

            為了達(dá)到這樣的靈活性,你需要?jiǎng)?chuàng)建一個(gè)新的自定義的Android平臺(tái)。當(dāng)不需要訪(fǎng)問(wèn)internal和hidden API時(shí),你只需使用原有的Android平臺(tái)。當(dāng)你使用這些API時(shí),你使用自定義的Android平臺(tái)。

            Android SDK文件夾結(jié)構(gòu)

            讓我們看一下Android SDK樹(shù)是如何組織的:

            image

            我們需要“platforms”文件夾。看一下里面:

            image

            這里列出了支持的Android平臺(tái)。

            現(xiàn)在,我們看一下它是如何與Eclipse設(shè)定關(guān)聯(lián)的。選擇你的工程,右擊–> Properties –> Android。你將會(huì)看到一組支持的Android平臺(tái)(與…/platforms/folder相似)。下面是截圖:

            image

            創(chuàng)建新的平臺(tái)

            為了創(chuàng)建一個(gè)新的平臺(tái),我們需要拷貝android-9文件夾 -> android-9-internals。讓我們做一些修正:

            1. 刪除其中的android.jar

            2. 拷貝original-android.jar,并改名為android.jar

            3. 修改build.prop文件:

            ro.build.version.sdk=9 -> ro.build.version.sdk=-9

            ro.build.version.release=2.3 -> ro.build.version.release=2.3.extended

            重啟Eclipse。并確認(rèn)你能看到新的平臺(tái)。下面是我所看到的:

            image

            為什么我選擇API等級(jí)為-9?這是因?yàn)樗仨毷且粋€(gè)數(shù)字,而且它不能是9(或者其它已經(jīng)存在的API等級(jí))。否則,你自定義的平臺(tái)將不能被使用(它在列表里可見(jiàn),但選中后也不能正常工作,編譯時(shí)仍然使用相應(yīng)API等級(jí)的原始平臺(tái))。

            下面是引用類(lèi)庫(kù)的截圖(當(dāng)前工程選中了自定義的平臺(tái)):

            image

            總結(jié)

            在上一篇中,我已經(jīng)告訴你如何創(chuàng)建一個(gè)未刪節(jié)版的android.jar。在這一篇中,我向你展示了如何創(chuàng)建一個(gè)自定義的Android平臺(tái),并在其中使用original-android.jar。這對(duì)于hidden API來(lái)說(shuō)已經(jīng)足夠了。但對(duì)于internal API來(lái)說(shuō),還需要另一步。這是因?yàn)锳DT仍然不允許使用com.android.internal包中的類(lèi)(參見(jiàn)上圖中的“forbidden”訪(fǎng)問(wèn)規(guī)則)。下一節(jié)我將向你展示如何定制ADT來(lái)允許使用internal包中的類(lèi)。

            ============華麗的分割線(xiàn)=============

            在實(shí)際的操作過(guò)程中,我創(chuàng)建的自定義的android.jar(API 10)不能被Eclipse成功加載,會(huì)出現(xiàn)以下的錯(cuò)誤框,如同網(wǎng)站上其它人操作的結(jié)果一樣,期待解決方案。

            clip_image012

            不過(guò),作者提供了可用的自定義的android.jar,如果不想自己嘗試的話(huà),可以直接從網(wǎng)站下載,地址將在Part5中給出,稍等。

            Part 4

            原文路徑:http://devmaze.wordpress.com/2011/01/18/using-com-android-internal-part-4-customizing-adt/

            在上一篇文章里,我描述了如何創(chuàng)建一個(gè)自定義的original-android.jar,以及如何創(chuàng)建一個(gè)自定義的Android平臺(tái)來(lái)使用這個(gè)original-android.jar。這對(duì)Hidden API來(lái)說(shuō)足夠了。但對(duì)Internal API來(lái)說(shuō),仍然還有一個(gè)包袱:Eclipse的ADT插件。它限制使用com.android.internal包中的任何類(lèi)。

            有幾種方法可以解決這個(gè)訪(fǎng)問(wèn)限制。

            1) ADT源碼可以下載。因此,刪除/修改代碼中的某些代碼,從而編譯出一個(gè)新的ADT是可以的。麻煩的是你需要搭建64位Linux系統(tǒng),下載源碼,編譯等。它需要花費(fèi)一些時(shí)間。當(dāng)有新的ADT版本時(shí),你需要重來(lái)一遍。

            2) 另外的方法就是修改ADT的字節(jié)碼。用一個(gè)類(lèi)似于“com/android/internax/**”的字符串替換“com/android/internal/**”。

            第二種方法可以用腳本實(shí)現(xiàn)。并且不需要訪(fǎng)問(wèn)源碼以及可在Windows上操作。這也是為什么我在這篇中選用第二種解決方案的原因。

            修改ADT的字節(jié)碼

            進(jìn)入Eclipse的plugins文件夾。找到文件名看起來(lái)像“com.android.ide.eclipse.adt_*.jar”的文件。備份一下這個(gè)文件(以防中間有錯(cuò)誤發(fā)生)。并拷貝這個(gè)文件到一個(gè)“experimental”文件夾,在這里,我們要完成對(duì)其字節(jié)碼的修改。

            重命名*.jar為*.zip。解壓這個(gè)文件到單獨(dú)的文件夾。參看以下圖片:

            image

            現(xiàn)在,進(jìn)入到com/android/ide/eclipse/adt/internal/project子文件夾。

            找到AndroidClasspathContainerInitializer.class文件。

            image

            這個(gè)文件包含“com/android/internal/**”字符串。接下來(lái)就是要替換這個(gè)字符串,例如“com/android/internax/**”。改變字符串的長(zhǎng)度理論上是安全的,但最好還是替換其中的一個(gè)字母,并保持長(zhǎng)度一致。

            我使用notepad++修改的,它支持非可印刷字符,因此在對(duì)其修改時(shí),不要觸碰修改非可印刷字符。

            image

            當(dāng)做完這個(gè),保存文件。壓縮這個(gè)文件夾,保證文件名與原始文件一模一樣。在我這里,文件名是:com.android.ide.eclipse.adt_8.0.1.v201012062107-82219.zip。

            注意:確保壓縮文件的正確性。比較原始文件和修改文件的根文件結(jié)構(gòu)。

            現(xiàn)在,用修改后的版本替換原來(lái)的ADT的*.jar文件。然后,啟動(dòng)Eclipse。

            在使用庫(kù)窗口,你應(yīng)該看到下面的樣子,一切都變得那么的美好:

            image

            步驟總結(jié)

            1. 關(guān)閉Eclipse

            2. 從Eclipse的plugin文件夾中拷貝出ADT插件的jar文件

            3. 重命名.jar -> .zip,然后解壓至獨(dú)立的文件夾

            4. 找到com/android/ide/eclipse/adt/internal/project/AndroidClasspathContainerInitializer.class文件

            5. 用“com/android/internax/**”替換“com/android/internal/**”

            6. 壓縮這個(gè)文件夾

            7. 重命名 .zip -> .jar

            8. 用修改后的jar替換原始的ADT jar文件

            9. 啟動(dòng)Eclipse

            結(jié)論

            這是不使用反射也能使用Internal API的最后一步。

            Part 5

             

            原文路徑:https://devmaze.wordpress.com/2011/01/19/using-com-android-internal-part-5-summary-and-example/

            為了能夠使用Internal和Hidden API,你需要:

            1. 創(chuàng)建自定義的original-android.jar,包含所有的.class文件

            2. 創(chuàng)建自定義的Android平臺(tái)來(lái)使用original-android.jar

            3. 修改ADT插件,允許使用com.android.internal包(只為Internal API)

            4. 創(chuàng)建新的工程,引用自定義的Android平臺(tái)(本文中的例子)

            在本文中,我將向你們展示如何使用那些Internal和Hidden API。

            此外,在本文的結(jié)尾,我列出了一些自定義的Android平臺(tái),它們都包含Internal和Hidden API。我附帶了它們,是為了可能你不想花太多時(shí)間在這方面,但又想快速的嘗試什么。

            例子

            創(chuàng)建一個(gè)新工程,選擇2.3.extender平臺(tái):

            下面是代碼:

            這個(gè)代碼使用了Internal API(PowerProfile)和Hidden API(isWifiApEnabled)。我不用使用反射就能編譯并運(yùn)行這些代碼。

            自定義平臺(tái)

            下面有些平臺(tái),是我為自己創(chuàng)建的。只用拷貝它們到SDK_DIR\platforms文件夾下。這只是讓Hidden API可用。對(duì)于Internal API,你需要修改你的ADT插件。

            API 3:http://www.megaupload.com/?d=S1F2MKYZ

            API 4:http://www.megaupload.com/?d=VUCTRI3Y

            API 7:http://www.megaupload.com/?d=7ITNILBK

            API 8:http://www.megaupload.com/?d=EXT5FKKT

            API 9:http://www.megaupload.com/?d=EXT5FKKT

            API 10:http://www.megaupload.com/?d=FCV78A9M

            ==============華麗的分割線(xiàn)=============

            我嘗試了其中的幾個(gè)自定義平臺(tái),發(fā)現(xiàn),internal 和hidden API真的是可用了,但也有一些意外的問(wèn)題,如AlertDialog.Builder(Context context)居然說(shuō)Context參數(shù)是多余的。。

            沒(méi)花時(shí)間去研究為什么會(huì)這樣,如果哪位童鞋知道原因,告訴我哈~~

             

            @import url(http://m.shnenglu.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
            posted @ 2011-09-26 17:52 frank.sunny 閱讀(3289) | 評(píng)論 (3)編輯 收藏
                 摘要: 在Symbian S60平臺(tái)上動(dòng)態(tài)加載ttf字體  閱讀全文
            posted @ 2011-02-21 10:28 frank.sunny 閱讀(3062) | 評(píng)論 (0)編輯 收藏
                 摘要: 使用SHBrowseForFolder函數(shù)打開(kāi)文件目錄對(duì)話(huà)框  閱讀全文
            posted @ 2010-12-30 18:35 frank.sunny 閱讀(18796) | 評(píng)論 (0)編輯 收藏

             完整文檔下載地址http://m.shnenglu.com/Files/franksunny/RNotifier.7z

            如何在S60UI框架程序中彈提示信息

             

            在非依賴(lài)于UIS60程序中,也就是不建立在控件環(huán)境基礎(chǔ)上的程序,比如控制臺(tái)應(yīng)用程序,獨(dú)立的線(xiàn)程等。在這些程序中需要彈提示信息的時(shí)候,就不能直接用基于CCoeControl的任何UI類(lèi)了,因?yàn)檫@些程序中沒(méi)有供養(yǎng)CCoeControl生存的CCoeEnv環(huán)境,當(dāng)然不嫌繁瑣,在程序的main函數(shù)中像自己創(chuàng)建活動(dòng)規(guī)劃器一樣去創(chuàng)建CCoeEnv環(huán)境也是一個(gè)可行的方法,但是這超出本文的涉及范圍,本文提出的是不創(chuàng)建CCoeEnv環(huán)境情況下,通過(guò)RNotifierRNotifier的派生類(lèi)來(lái)實(shí)現(xiàn)彈提示信息。

            RNotifier簡(jiǎn)單應(yīng)用

            其實(shí)RNotifierRFs一樣都是派生自RSessionBase,所以使用起來(lái)也是類(lèi)似的,下面給出一個(gè)最簡(jiǎn)單的例子代碼

                   RNotifier vNotifier;

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

                   CleanupClosePushL(vNotifier);

             

                   //title and context

                   TBuf<256> title;

                   TBuf<256> context;

                   title.Copy(_L("info"));

                   context.Copy(_L("data"));

             

                   // Button text

                   _LIT(KYesButton, "Yes");

                   _LIT(KNoButton, "No");

             

                   // Display the dialog

                   TInt button;

                   TRequestStatus status;

                   vNotifier.Notify(title, context, KYesButton, KNoButton, button, status);

                   User::WaitForRequest(status);

             

                   // destroy notifier

                   CleanupStack::PopAndDestroy();

            運(yùn)行上述代碼可以得到如下的對(duì)話(huà)框提示

            RNotifier本身和RFs是基于Symbian OS的,而非專(zhuān)屬于S60平臺(tái)的,所以在UIQ等平臺(tái)上繼續(xù)可以使用RNotifier,這在跨平臺(tái)開(kāi)發(fā)上相當(dāng)?shù)谋憷?,省去了移植的苦惱?/span>

            RNotify復(fù)雜應(yīng)用

            上面例子代碼是最簡(jiǎn)單的一種RNotifier的應(yīng)用,為了開(kāi)發(fā)的方便和提高開(kāi)發(fā)效率,S60封裝了一套CAknGlobal*RAknKeyLock等的類(lèi)供第三方開(kāi)發(fā)者使用,由于在UIQ平臺(tái)上我沒(méi)有涉及過(guò),而且目前借助S60的開(kāi)源代碼,我就拿一個(gè)S60中的相關(guān)類(lèi)CAknGlobalConfirmationQuery來(lái)說(shuō)明下吧,在源代碼sf\mw\classicui\uifw\AvKon\notifsrc路徑下面有多個(gè)類(lèi)似類(lèi)的源代碼。其實(shí)CAknGlobalConfirmationQuery除了二階段構(gòu)造外,最主要的就是ShowConfirmationQueryL、UpdateConfirmationQuery、CancelConfirmationQuery三個(gè)函數(shù),這三個(gè)函數(shù)的代碼羅列如下

                    /**

                    * Shows global Confirmation query synchronously

                    *

                    * @param    aStatus         TRequestStatus which will be completed when user

                    *                               selects one item from the list query.

                    * @param    aPrompt         Prompt text

                    * @param    aSoftkeys       Softkey resource

                    * @param    aAnimation      Animation resource

                    * @param    aTone           Tone id

                    * @param    aDismissWithAllKeys If set ETrue the query gets dismissed with all

                    *                                   keypresses

                    */

            EXPORT_C void CAknGlobalConfirmationQuery::ShowConfirmationQueryL(

                TRequestStatus& aStatus,

                const TDesC& aPrompt,

                TInt aSoftkeys,

                TInt aAnimation,

                const TDesC& aImageFile,

                TInt aImageId,

                TInt aImageMaskId,

                CAknQueryDialog::TTone aTone,

                TBool aDismissWithAllKeys )

            {

                delete iBuffer;

                iBuffer = NULL;

                iBuffer = CBufFlat::NewL(KBufferGranularity);

             

                RBufWriteStream bufStream;

                bufStream.Open(*iBuffer);

             

                CleanupClosePushL(bufStream);

             

                bufStream.WriteInt32L(KAKNNOTIFIERSIGNATURE);

             

                if ( aDismissWithAllKeys )

                {

                    bufStream.WriteInt8L( ETrue );

                }

                else

                {

                    bufStream.WriteInt8L( EFalse );

                }

             

                bufStream.WriteInt32L(aSoftkeys);

                bufStream.WriteInt32L(aAnimation);

                bufStream.WriteInt16L(aImageId);

                bufStream.WriteInt16L(aImageMaskId);

                bufStream.WriteInt16L(aTone);

                bufStream.WriteInt16L(aPrompt.Length());

                bufStream << aPrompt;

                bufStream.WriteInt16L(aImageFile.Length());

                if (aImageFile.Length())

                {

                    bufStream << aImageFile;

                }

             

                bufStream.WriteInt32L(iSkinsMajorId);

                bufStream.WriteInt32L(iSkinsMinorId);

             

                if (iAknSDData)

                {

                    bufStream.WriteInt8L(ETrue);

                    bufStream << *iAknSDData;       

                }

                else

                {

                    bufStream.WriteInt8L(EFalse);           

                }

             

                iBufferPtr.Set(iBuffer->Ptr(0));

                iNotify.StartNotifierAndGetResponse(aStatus, KAknGlobalConfirmationQueryUid,

                    iBufferPtr, iResultBuf);

             

                CleanupStack::PopAndDestroy();  // bufStream

            }

            該函數(shù)用于顯示對(duì)話(huà)框。其主要的實(shí)現(xiàn)就是調(diào)用RNotifierStartNotifierAndGetResponse函數(shù)。

            EXPORT_C void CAknGlobalConfirmationQuery::UpdateConfirmationQuery( TInt aSoftkeys )

            {

                iSoftkeys = aSoftkeys;

                iCmd = EAknUpdateGlobalQuery;

                TPckgBuf<SAknNotifierPackage<SAknGlobalMsgQueryParams> > pckg;

                pckg().iParamData.iCmd = iCmd;

                pckg().iParamData.iSoftkeys = iSoftkeys;

             

                TPckgBuf<TInt> ret;

                iNotify.UpdateNotifier( KAknGlobalConfirmationQueryUid, pckg, ret);

            }

            該函數(shù)用于對(duì)話(huà)框產(chǎn)生后更新對(duì)話(huà)框,其功能就是使用函數(shù)RNotifier::UpdateNotifier

            EXPORT_C void CAknGlobalConfirmationQuery::CancelConfirmationQuery()

            {

                if (iBuffer)

                {

                    iNotify.CancelNotifier(KAknGlobalConfirmationQueryUid);

                    delete iBuffer;

                    iBuffer = 0;

                }

            }

            該函數(shù)用于對(duì)話(huà)框產(chǎn)生后程序取消對(duì)話(huà)框,其功能就是使用函數(shù)RNotifier::CancelNotifier

            RNotifier的實(shí)現(xiàn)跟蹤

            通過(guò)以上兩個(gè)代碼,我們差不多對(duì)RNotifier類(lèi)的使用了解了,但是這個(gè)RNotifier到底是如何實(shí)現(xiàn)彈出一個(gè)對(duì)話(huà)框呢?

            其實(shí)RNotifier的真正實(shí)現(xiàn)是通過(guò)Symbian OSC/S架構(gòu)來(lái)實(shí)現(xiàn)的,這個(gè)在文章開(kāi)篇提到RNotifierRFs一樣派生自RSessionBase就已經(jīng)埋下了伏筆。

            RNotifier的源代碼實(shí)現(xiàn)位于sf\os\kernelhwsrv\kernel\eka\euser\us_ksvr.cpp,這個(gè)代碼中還有RChunk、RDeviceRHandleBase等等基礎(chǔ)類(lèi)的實(shí)現(xiàn)代碼。

            RNotifier的服務(wù)器類(lèi)CNotifierServer和服務(wù)器會(huì)話(huà)通道類(lèi)CNotifierSession以及相關(guān)的其他類(lèi)則位于sf\os\kernelhwsrv\kernel\eka\ewsrv\ws_main.cpp中。這些類(lèi)的聲明則位于sf\os\kernelhwsrv\kernel\eka\include\twintnotifier.h文件中。

            再深入進(jìn)去,就會(huì)了解到RConsole類(lèi),這個(gè)類(lèi)的聲明位于sf\os\kernelhwsrv\kernel\eka\include\e32twin.h中,代碼實(shí)現(xiàn)位于sf\os\kernelhwsrv\kernel\eka\ewsrv\co_cli.cpp中。搞了半天又遇到一個(gè)C/S架構(gòu),這個(gè)ClientServerCWsServer,其通道為CWsSession,在CWsSession內(nèi)最主要的類(lèi)是CWsWindow,這幾個(gè)類(lèi)的聲明位于sf\os\kernelhwsrv\kernel\eka\include\ws_std.h,而這幾個(gè)類(lèi)的實(shí)現(xiàn)代碼則又繞回到sf\os\kernelhwsrv\kernel\eka\ewsrv\ws_main.cp中去了。

            好了,自己暫時(shí)只能走到這一步了,上面只是簡(jiǎn)單給出一些源代碼的路徑,有興趣的同學(xué)可以去一探究竟,我才疏學(xué)淺就只能點(diǎn)到為止了。

            歡迎對(duì)其有更深入挖掘的同學(xué)能夠發(fā)布新的小結(jié),到時(shí)記得分享到我的郵箱frank.sunny@163.com,當(dāng)然假如我文中有什么錯(cuò)誤也希望能夠告知我一下,謝謝。

             

             

            posted @ 2010-12-17 21:26 frank.sunny 閱讀(2009) | 評(píng)論 (0)編輯 收藏

             

            關(guān)于監(jiān)控?cái)z像頭拍照與攝像

             

            由于工作中需要用到類(lèi)似于像新浪微薄一樣,監(jiān)控拍照后彈出照片是否上傳分享的要求,為此就小試了下監(jiān)控拍照和攝像。

            一開(kāi)始沒(méi)有頭緒,都不知道搜索什么關(guān)鍵字,茫無(wú)目的下居然發(fā)現(xiàn)論壇有人推薦陳子騰寫(xiě)的wiki,具體wiki鏈接如下

            檢測(cè)內(nèi)置相機(jī)應(yīng)用程序新拍攝的照片和視頻片段

            其實(shí)參考陳子騰的方法很容易就做好一個(gè)監(jiān)控功能了,在這里就不多說(shuō)。

            之所以想小寫(xiě)下博文,是因?yàn)檫@種方式實(shí)際上涉及到Symbian OS提供的Publish&Subscribe這一特殊的進(jìn)程間通信機(jī)制,我之前使用的進(jìn)程間通信除了C/SRMsgQue之外,就是使用AppUi框架通過(guò)TApaTask::SendMessage的方法來(lái)實(shí)現(xiàn),至于RProcess::SetParameter不能在進(jìn)程間實(shí)時(shí)的傳輸消息,只能是開(kāi)啟進(jìn)程時(shí)傳遞一些信息(比如同步用的信號(hào)量等)。這次總算是接觸了下PS進(jìn)程間通信,就自己也嘗試了這種方式。

            SDK中的描述是

            Publish & Subscribe is a new API provided by the real-time kernel (EKA2). It allows publisher processes to define and update a set of properties; other processes, called subscribers, can listen for changes to a property, and get property values. The process that defines a property can specify access rights for both reading and writing. Rights can be defined in terms of either requiring a particular security capability, by a process SID, or by a process VID. Publish & Subscribe replaces System Agent and the usage of temporary Shared Data keys.

            也就是說(shuō)發(fā)布者定義或更新一套屬性,然后訂閱者開(kāi)啟監(jiān)聽(tīng)的情況下就能接受到更新,然后可以去獲取屬性值的更改。

            定義屬性

            在這里最主要的是在發(fā)布者定義屬性時(shí),一定要用發(fā)布者程序的SID也就是UID3,否則會(huì)報(bào)-46的錯(cuò)誤,也即下面代碼

            RProperty::Define(KPSUidCameraCfg, KCameraCfgModify, RProperty::EInt);

            KPSUidCameraCfg必須是你發(fā)布程序的UID3或者你另外在mmp中定義的SID值,至于后面的KCameraCfgModify屬性和類(lèi)型值就根據(jù)要求來(lái)設(shè)置了。

            監(jiān)控屬性

            監(jiān)控屬性需要綁定到具體的屬性然后開(kāi)啟一個(gè)Subscribe的異步方法

            iProperty.Attach(KPSUidCameraCfg, KCameraCfgModify);

            iProperty.Subscribe(iStatus);

            SetActive(); // Tell scheduler a request is active

            通常監(jiān)控屬性是一個(gè)異步過(guò)程,所以我們會(huì)為其專(zhuān)門(mén)寫(xiě)一個(gè)活動(dòng)對(duì)象類(lèi),用以異步監(jiān)控

            修改屬性

            雖然屬性定義是有安全性要求,但是更新屬性,就沒(méi)那么嚴(yán)格了,可以直接通過(guò)RProperty的靜態(tài)方法來(lái)修改

            RProperty::Set(KPSUidCameraCfg, KCameraCfgModify, 1 );

            讀取屬性

            訂閱者當(dāng)收到屬性有更改時(shí),也可以直接通過(guò)RProperty的靜態(tài)方法來(lái)讀取

            RProperty::Get(KPSUidCameraCfg, KCameraCfgModify, val);

            刪除屬性

            由于屬性值在手機(jī)重啟前會(huì)一直存在,所以屬性沒(méi)有用時(shí),我們要求將其刪除,刪除也可以通過(guò)RProperty的靜態(tài)方法簡(jiǎn)單實(shí)現(xiàn),具體如下

            RProperty::Delete(KPSUidCameraCfg, KCameraCfgModify);

             

            結(jié)合PS這一進(jìn)程間通訊的方法和系統(tǒng)攝像頭應(yīng)用程序中的使用,我們可以顯然知道,該方法適用于開(kāi)發(fā)一些通用的底層控件,可以給第三方開(kāi)發(fā)者需要時(shí)監(jiān)控用,發(fā)布者類(lèi)似于一個(gè)廣播系統(tǒng)。

            感覺(jué)不是很復(fù)雜,就簡(jiǎn)單小結(jié)如上吧,以后使用遇到問(wèn)題再更新。

             

            posted @ 2010-12-10 19:58 frank.sunny 閱讀(3126) | 評(píng)論 (1)編輯 收藏
                 摘要: 做為Symbian開(kāi)源的新平臺(tái),Symbian ^3發(fā)布已經(jīng)有一陣子了,N8和C7推向市場(chǎng)也有些日子,但是目前諾基亞基于這個(gè)平臺(tái)的SDK才出到了0.9,可以說(shuō)還沒(méi)有出正式版本啊,不過(guò)看到好多人都在用新的SDK了,我也小小嘗下鮮,將嘗鮮結(jié)果匯聚在下面,以備后用。  閱讀全文
            posted @ 2010-11-04 15:33 frank.sunny 閱讀(2083) | 評(píng)論 (0)編輯 收藏
                 摘要:  文檔中涉及到貼圖,懶得搞,就附帶一份word文檔吧,需要的可以下下 http://m.shnenglu.com/Files/franksunny/camera.rar 攝像頭編程預(yù)研 目前使用攝像頭編程,網(wǎng)上用的最多的都是直接調(diào)用手機(jī)自帶的照相/攝像程序來(lái)完成,不過(guò)使用這種方式,可控性就顯得弱一些,為此近期對(duì)直接使用ECAM API進(jìn)行了下簡(jiǎn)單預(yù)研。 照相流程 因?yàn)楸敬晤A(yù)研主...  閱讀全文
            posted @ 2010-11-03 14:55 frank.sunny 閱讀(2818) | 評(píng)論 (0)編輯 收藏
                 摘要:   獲取手機(jī)短信和彩信號(hào)碼的方法 短信號(hào)碼的提取 之前寫(xiě)了一篇Symbian端彩信讀取初探,將過(guò)多的期望放在了未知的CMmsHeaders上面,最近需要將系統(tǒng)收件箱、發(fā)件箱和草稿箱內(nèi)部的數(shù)據(jù)統(tǒng)統(tǒng)備份出來(lái),突然遇到瓶頸了。最后問(wèn)題得以解決之后發(fā)現(xiàn)其實(shí)系統(tǒng)已經(jīng)提供了豐富的API,以下就是羅列了一種獲取系統(tǒng)收件箱、發(fā)件箱和草稿箱里面短信和彩信號(hào)碼的方法。 我們先看一段短信讀取號(hào)碼的代碼...  閱讀全文
            posted @ 2010-09-25 17:44 frank.sunny 閱讀(3482) | 評(píng)論 (3)編輯 收藏
                 摘要:   Symbian端彩信讀取初探   上周由于項(xiàng)目需要對(duì)彩信讀取進(jìn)行了預(yù)研,雖然并未涉及彩信的攔截,只是對(duì)Symbian S60手機(jī)收件箱中的彩信和彩信通知的內(nèi)容進(jìn)行提取并分析,但是也算是趟了下之前一直沒(méi)有搞過(guò)的彩信這渾水,小結(jié)一下。為了體現(xiàn)分析過(guò)程的邏輯性,下文并非是由簡(jiǎn)入繁,而是采用由已知到未知的說(shuō)明過(guò)程來(lái)進(jìn)行。 彩信和彩信通知的區(qū)別 正如前面博文《Symbian...  閱讀全文
            posted @ 2010-07-28 21:16 frank.sunny 閱讀(2559) | 評(píng)論 (0)編輯 收藏
            僅列出標(biāo)題
            共7頁(yè): 1 2 3 4 5 6 7 

            常用鏈接

            留言簿(13)

            隨筆分類(lèi)

            個(gè)人其它博客

            基礎(chǔ)知識(shí)鏈接

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            欧美久久久久久午夜精品| 亚洲AV日韩精品久久久久久久| 漂亮人妻被黑人久久精品| 久久综合日本熟妇| 伊人久久综合成人网| 少妇无套内谢久久久久| 久久国产成人亚洲精品影院| 热99RE久久精品这里都是精品免费| 精品久久一区二区| 亚洲国产精品无码久久九九| 色综合久久精品中文字幕首页| 久久无码av三级| 91麻豆国产精品91久久久| 性欧美大战久久久久久久久| 久久久一本精品99久久精品88| 亚洲精品美女久久777777| 色欲久久久天天天综合网精品 | 久久国产精品国产自线拍免费| 欧美熟妇另类久久久久久不卡| 久久96国产精品久久久| 久久人妻少妇嫩草AV无码蜜桃| 精品久久久久久久国产潘金莲| 精品国产VA久久久久久久冰 | 国产精品久久久久久久人人看| 日产精品久久久久久久| 欧洲精品久久久av无码电影 | 国产精品久久久久久久app| 国产产无码乱码精品久久鸭| 久久精品国产免费| 久久久久久久久无码精品亚洲日韩| 狠狠色伊人久久精品综合网| 久久国产成人午夜AV影院| 久久精品aⅴ无码中文字字幕重口 久久精品a亚洲国产v高清不卡 | 久久久久综合中文字幕| 久久综合精品国产二区无码| 久久精品国产精品国产精品污| 99精品久久久久久久婷婷| 久久精品国产亚洲7777| 99久久精品国内| 91精品国产色综久久| 久久精品国产第一区二区三区|