把你的舊手機改造成車載導航

如果你手頭有一個淘汰下來的智能安卓機,想把它廢物利用變成一個方便使用的車載導航,那麼本文可能會對你有所幫助。

先放一個效果視頻,不要在意視頻中手機的位置,這位置有點太遠了,只是臨時擺在那示意一下。

https://www.zhihu.com/video/959911825115086848

正文開始。

我現在手頭有一台淘汰下來的小米2S,當年非常好用的機器,直到現在,很多批量註冊賬號刷安裝量或者微商群控搖一搖等還是會用這款手機。打算把它改造成車載導航,雖然屏幕不大,但基本上也就聽個聲音看個大致方向,屏幕小點沒有特別大的問題。

車載導航要如何才能方便使用,自然是隨車啟動自動開機,隨車熄火自動關機。那麼我們要實現的全自動化流程無非就是兩個:1、車輛啟動->手機開機->啟動導航軟體,2、車輛熄火->手機關機。

上來就是最難的,就是手機隨車輛啟動而自動啟動。唯一的判斷方式就是把手機插在車輛USB或者點煙器介面上,車輛啟動的時候會自動開始給手機充電。手機充電的時候讓它自動啟動。手頭這個小米2S,可以關機狀態下充電,而不是自動啟動,我們需要改造一下。

第一步:充電自動開機

首先,先線刷了小米2S最新的開發版系統,並且在其安全中心開啟ROOT,這是為後來實現自動關機等方便。自動關機的等會再說。記住,所有在電腦端操作的時候,電腦要盡量退出所有程序,尤其是殺毒軟體和安全軟體一類的,而那些手機助手,更是刪掉最好,以免干擾。

ROOT成功之後,我們需要改造系統boot.img中的一個文件init.rc,這個文件裡面包含了控制關機充電的代碼。這裡先說一個大坑,我之前試了好多次,就是從下載的ROM里直接提取出boot.img文件,然後修改,再刷入手機。這樣問題就來了,這樣刷出來的手機會失去ROOT,並且WIFI也無法正常開啟,一堆怪現象都會出來,就是因為這個文件其實在ROOT過程中應該是有過修改的。懵逼了很久之後,我想到一個電子,直接從已經ROOT完的手機里,提取出這個文件,然後修改再刷回去,這樣就可以保證修改的是最新的正確版本了。

boot.img說是一個文件,你也可以理解為是個ghost鏡像,是手機里一個叫做boot的分區的鏡像。我們操作的第一步就是從手機里把這個boot的分區備份一個鏡像出來。我們要用到的工具是Google提供的ADB和Fastboot。Windows版下載地址:

dl.google.com/android/r

上面那個鏈接不用單獨下,之後我會把所有用到的東西打包在一起給大家。

ADB和Fastboot不用安裝,直接解壓就可以用。這裡再說一個坑,Google提供的Windows版本會有一個問題,就是運行的時候總是彈出adb.exe已停止工作的提示。網上找了很多原因和解決辦法,多數都是退出XX程序,卸載XX程序,都沒什麼效果,更何況我之前說有可能有干擾的軟體我們都關掉甚至卸載了。最後找到的原因竟然是因為Windows下adb有個最大連接限制是64個。解決方法也很簡單,找個大神修改過的adb.exe覆蓋掉就好了。

搞定了adb.exe的問題之後,開始用它連接手機,手機先打開開發者選項,並且開啟USB調試,數據線連上電腦。按住Shift在adb.exe所在的文件夾空白處點擊右鍵,選擇「在此處打開命令窗口」,即可進入當前目錄下的CMD窗口。

在CMD窗口中輸入「adb devices」來檢測一下鏈接狀況。如果出現了「ADB server didnt ACK」的字樣,那麼恭喜你,你又掉進另一個坑裡了。因為你的電腦上還是有別的程序在佔用ADB的埠。如果你的電腦沒有這個問題,可直接跳過下面的步驟,開始備份boot分區。

「ADB server didnt ACK」這種問題怎麼解決呢?首先檢查埠綁定信息,輸入「adb nodaemon server」回車,一般會提示「cannot bind tcp:5037」。這時候我們要來查一下5037埠是誰佔用了,輸入「netstat -ano | findstr "5037"」回車。看第一行那個後面有「LISTRNING」字樣的數字,我這裡是「892」。

然後我們查查這個892是誰,輸入「tasklist /fi "pid eq 892"」,答案出來了,原來是「shuame_helper.exe」這個進程,這個進程是我安裝的刷機精靈帶的,雖然軟體沒啟動,但這個進程依然會啟動,對我們的操作進行干擾。去任務管理器結束掉這個進程就可以了。

下面我們再次回到剛才的CMD窗口,重新輸入「adb devices」,這次返回了正確的狀態。

剛才沒有遇到「ADB server didnt ACK」的同學可以從這裡繼續看了。輸入「adb shell」,回車,再輸入「su」回車,這注意看,提示符應該已經從$符號變成了#號。最後輸入「ls -al /dev/block/platform/msm_sdcc.1/by-name」回車。

這時候我們找到boot對應的名字是mmcblk0p17。好的記下它,我們開始備份。輸入「dd if=/dev/block/mmcblk0p17 of=/sdcard/boot.img」,這裡的mmcblk0p17就是剛才記下的名字。

稍等幾秒鐘,就會看到如上提示,表明你的boot.img已經備份完成了。從手機里把boot.img這個文件剪切到電腦中。這裡還有一個小坑,就是不知道為什麼,我備份完了,手機里用ES文件瀏覽器分明可以看到這個文件,但連載電腦上卻看不到。重啟了一下手機後就好了。

下一步就是解包這個boot.img,需要用到的工具是bootimg.exe這個解包軟體。

把boot.img和bootimg.exe放在相同目錄下。最好單獨建個目錄,把這兩個文件放進去,因為後續會產生很多文件,以免混亂。用剛才說過的按Shift鍵的方式在此目錄進入CMD。

輸入「bootimg --unpack-bootimg」回車。

解包成功後,目錄中會出現幾個文件和一個initrd文件夾,在initrd文件夾中,我們找到init.rc,需要編輯的文件就是它。

打開編輯軟體UltraEdit,然後把init.rc拖進去。找到「on late-init」這一行,它表示系統初始化晚期會出發的東西。我們把它後面的那段內容複製。

然後找到「on charger」這一行,它後面的部分表示關機充電時候它觸發的內容。我們用剛才複製的內容替換掉這部分內容。也就在系統判斷關機狀態下開始充電的時候,不去執行顯示充電圖標等動畫內容,而是執行正常開機的內容,這樣我們的目標就達到了。

好,保存文件。關掉UltraEdit。

我們需要把修改的文件重新打包成boot.img。還是回到剛才的cmd窗口。輸入「bootimg --repack-bootimg」回車。程序會自動把文件打包回去。現在目錄下就會變成3個文件,一個程序bootimg.exe,一個原始文件boot-old.img,一個新生成的文件boot-new.img。

只改動了幾行文字,你可能會驚訝新的文件比老文件小很多。如圖,我這裡老文件有30M,新文件只有不到8M。這是很正常的。因為老文件是純粹備份出來,重新打包的文件則是文件實際的大小,不要在意就好了。

下面,我們把boot-new.img拷貝到adb.exe所在的目錄,並且重命名為boot.img,在此目錄打開命令窗口。同時要把手機進入到fastboot的狀態。關機,同時按住音量減和電源鍵。這時你的手機會進入fastboot的狀態,準備開始寫入boot.img。

在命令窗口輸入「fastboot flash boot boot.img」回車,開始刷寫boot.img。因為文件很小,不到一秒鐘就提示完成了。

輸入「fastboot reboot」回車,可以直接重啟手機。這時,你的手機已經可以實現充電自動開機了。

第二步:自動啟動導航

解決了手機充電自動開機的問題之後,對手機系統底層的修改就已經結束了,剩下所有的問題都有比較簡單的操作界面了。

手機開機後自動啟動一個軟體,有很多方法可以實現,這裡我們使用一個神器:Tasker。Tasker是個可以實現非常多自動化操作的軟體,如果你用熟練了,可能會幫你解決很多問題。不過我們不探討太多,只說幾個我們用的上的功能。

導航軟體我選擇的是高德地圖車機版。最早我想用車鏡版的,高德地圖的車機版和車鏡版的功能幾乎一致,車鏡版可以把畫面變成精簡導航模式,挺有意思的。其實車鏡版還可以支持語音控制,不過需要語音助手調用高德的API,而後裝的語音助手類軟體貌似都沒有支持高德車鏡版的API,所以這個暫時用不了。而車機版則多了實實在在的3D界面,可以讓橫屏狀態下看的視野更加寬廣。如果你喜歡豎屏,也可以直接用高德地圖的普通手機版本。我不喜歡手機版本那麼多的功能那麼多的按鍵,更喜歡簡單一些的界面。至於為什麼不選擇百度地圖或者凱立德等,那還用問么?當然是因為志玲姐姐的聲音了。雖然現在高德的志玲姐姐已經是殘次品的聲音了,但還是比別的聲音順耳得多。

下載地址:

高德地圖車機版

在手機上安裝好中文版Tasker,給到它Root許可權和自啟動許可權。然後在任務里建立一個新的任務,起名「啟動導航」。任務里添加一個操作「程序」-「啟動應用」-「高德地圖」。然後建立一個配置文件,選擇添加事件「系統」-「設備啟動」,任務選擇剛剛建立的「啟動導航」。把這一切保存好,就實現了開機自動啟動高德地圖。

注意,第一次用Tasker啟動高德地圖可能會有個確認提示,允許後以後不會出現。同樣,高德車機版第一次啟動也會有需要你同意的提示,選中不再提示就可以了。

第三步:斷電自動關機

實現斷電自動關機這事,也同樣是使用Tasker這個神器,不過因為我的需求會讓這個操作稍微複雜點。

我不希望手機一斷電就立刻關機,希望有個提示,最好是語音提示,並且延遲幾秒鐘再關機,這幾秒鐘之內,如果檢測到電源恢復連接的話,就不關機了。這樣可以避免使用中途偶爾介面鬆動或者拔錯充電線的情況導致突然關機。如果那樣重新開機可能需要挺長時間的。

好下面我們來操作。首先在Tasker的變數里,新建一個變數,起名為%DYZT,用這個來記錄當時電源狀態是否為連接,默認值設置為0。我們把連接狀態定義為0,斷開狀態定義為1。

然後在剛才編輯好的啟動導航任務中,增加一個操作「變數」-「變數設置」,名稱選擇%DYZT,發往輸入0。這裡吐槽一下翻譯,這個翻譯讓我理解了很久,後來終於明白,所謂XX變數發往YY的意思就是把YY賦值給XX。這翻譯簡直……

這樣操作就讓手機開機的時候把這個變數的值設定成0,因為手機剛開機的時候,肯定你的電源是連接狀態的。

然後我們建立一個新的任務,起名「斷電關機」,裡面添加如下圖片的幾個動作。

然後我們再建立一個新的任務,起名「取消關機」,裡面添加如下圖片的幾個動作。

這裡稍微解釋一下這個流程的意思。首先斷開電源的情況,觸發「斷點關機」任務,%DYZT賦值為1,然後系統發出語音提示「電源斷開」,等待10秒後判斷%DYZT值是否仍然為1,如果是就關機。這10秒鐘內,如果電源重新連接上,觸發「取消關機」任務,判斷%DYZT是否等於1,如果等於就發出語音提示「電源恢復」,同時吧%DYZT賦值為0。

然後我們在「配置文件」中添加一個「狀態」-「電源」-「電源」,選中「反轉」,任務選擇剛剛建立的「斷電關機」,完成後把這個配置重命名為「電源斷開」。

同樣,再添加一個「狀態」-「電源」-「電源」,這回不要選中「反轉」,任務選擇「取消關機」,完成後重命名為「電源連接」。

保存一切之後,你就完成了所有步驟。你的手機已經可以實現自動開機、自動打開高德地圖、自動關機的功能了。

當然,用Tasker來實現斷電關機的功能還是稍微有點麻煩的,我還會提供一個斷電關機的APP來給喜歡簡單粗暴的朋友們來用。傻瓜版本,直接裝上就可以用了,不用設置。

工具軟體

本文中所提到的工具軟體打包放到了百度雲上。下載地址:

pan.baidu.com/s/1B372Rq

說在最後

這一篇寫的非常基礎,幾乎可以無腦按流程操作。寫這篇的原因就是網上有一些教程教你怎麼實現關機充電,卻很少有反過來實現充電開機的。這讓很多想要讓老舊手機變成導航發揮餘熱的人很困難。本著節約精神寫了這麼多,希望對大家有一點用處。

延伸一點,通過自動開機,然後自動啟動不同軟體,大家也可以實現一些不同的功能,比如自動啟動電子狗軟體、音樂軟體、行車記錄儀軟體、無線倒車攝像頭軟體等等。

Tasker的部分,其實有很多更好的解決方法,不過文中的設定已經滿足了我的需要,就沒再改進,大家也可以提出你的想法改造成你想要的樣子。更多Tasker的用法還可以參看:

你是如何使用tasker的?

如有疏漏,也請大家指出。

推薦閱讀:

為什麼 iOS 在不開源的情況會如此的成功?
2016年發布的安卓手機,你最喜歡哪一款?
Android Studio每日小技巧
為什麼與 Android 相比,Windows Phone 應用能遵循設計規範?
在Android應用中任意位置執行代碼彈出Dialog有什麼優雅的實現方案?

TAG:車載導航儀 | 手機 | Android |