android9 添加开机音乐
開機(jī)動(dòng)畫
Android 開機(jī)總共會(huì)出現(xiàn)3個(gè)畫面:
原生開機(jī)動(dòng)畫
\frameworks\base\cmds\bootanimation\BootAnimation.cpp
\frameworks\base\core\res\assets\images
可以看到設(shè)置了兩張圖片 android-logo-mask.png 和 android-logo-shine.png
bootanimation.zip
android 2.0之后,將制作好的 bootanimation.zip 放在系統(tǒng)的/system/media目錄中,或/data/local目錄中即可,兩個(gè)目錄下都存在時(shí),優(yōu)先使用/data/local下的,android 2.0之前,則需要修改源碼。
part0 和 part1 中放的是開機(jī)動(dòng)畫每一幀的圖片,圖片名稱需要按編號(hào)命名,主要就是 desc.txt 文件
desc.txt:
- 第1行用來描述開機(jī)動(dòng)畫在屏幕顯示的大小及速度,即為:開機(jī)動(dòng)畫的寬度為1920個(gè)像素,高度為1080個(gè)像素,顯示頻率為每秒25幀,即每秒顯示25張圖片,即每張圖片顯示時(shí)間為1/25 = 0.04秒 = 40毫秒。
- 下面的每一行代表一個(gè)片段,顯示的時(shí)候會(huì)按照順序從上到下依次顯示。第一個(gè)字符為片段類型,有’c’和’p’兩種(注意:‘c’ 片段在Android 5.1后加入),第二個(gè)字段表示該片段重復(fù)顯示的次數(shù)(如果為0表示無限重復(fù)顯示),第三個(gè)字段表示兩個(gè)片段之間顯示的時(shí)間間隔(如果為10 則表示part0播放完會(huì)等待10*1/25 = 0.4秒 再播放part1片段中的動(dòng)畫,即等待多少幀),第四個(gè)字段為該片段所在的文件夾
注意這里寫好desc.txt 文件后最好在最后一行敲個(gè)回車換行,不然可能會(huì)有奇怪的問題
制作完打包,注意是zip格式,壓縮方式為存儲(chǔ)模式(只是打包不壓縮),打包完放到指定的目錄即可
至于’c’ 片段嘛,當(dāng)SurfaceFlinger服務(wù)要求bootanimation停止顯示動(dòng)畫時(shí),以‘p’標(biāo)識(shí)的片段會(huì)停止,而以’c’標(biāo)識(shí)的片段會(huì)繼續(xù)顯示(開機(jī)動(dòng)畫會(huì)播放完在退出)
但我將p片段改成c片段,開機(jī)動(dòng)畫直接不顯示了,黑屏直到進(jìn)入launcher,后續(xù)在看吧
開機(jī)音樂
系統(tǒng)自帶
\frameworks\base\cmds\bootanimation\BootAnimation.cpp 文件中有實(shí)現(xiàn)
將開機(jī)音樂命名成 audio.wav 放入開機(jī)動(dòng)畫文件的part0 文件夾中并打包,但不知為何我的 android 9 設(shè)備并沒有播放開機(jī)音樂,可能是和下面的問題一樣 media 服務(wù)沒有起來,起來后這個(gè)方法我就沒有實(shí)驗(yàn)了
手動(dòng)實(shí)現(xiàn)
目錄:\frameworks\base\cmds\bootanimation
添加依賴庫 Android.mk
libmedia \
libaudioclient
引用 BootAnimation.h
#include <EGL/egl.h> #include <GLES/gl.h>// 2022 include audio head #include <media/AudioSystem.h> #include <media/mediaplayer.h> // 2022 include audio headclass SkBitmap;namespace android { 。。。。。。 public:。。。。。。// 2022 bootMusic void bootMusic();private:。。。。。。實(shí)現(xiàn)方法 BootAnimation.cpp
void BootAnimation::bootMusic(){ALOGE("start bootMusic");int index = 7;const char *fileName = "/system/media/poweron.wav";MediaPlayer* mp=new MediaPlayer();if (mp->setDataSource(open(fileName, O_RDONLY), 0, 0x7ffffffffffffffL)== NO_ERROR){mp->setAudioStreamType(AUDIO_STREAM_ENFORCED_AUDIBLE);mp->prepare();}//AUDIO_STREAM_ENFORCED_AUDIBLEaudio_devices_t device = AudioSystem::getDevicesForStream(AUDIO_STREAM_ENFORCED_AUDIBLE);AudioSystem::initStreamVolume(AUDIO_STREAM_ENFORCED_AUDIBLE, 0, 7);AudioSystem::setStreamVolumeIndex(AUDIO_STREAM_ENFORCED_AUDIBLE, 7, device);// if(NO_ERROR != AudioSystem::setStreamVolumeIndex(AUDIO_STREAM_ENFORCED_AUDIBLE, 7, device)){// ALOGE("22222setStreamVolumeIndex ERROR");// }AudioSystem::getStreamVolumeIndex(AUDIO_STREAM_ENFORCED_AUDIBLE, &index, device);// if(NO_ERROR != AudioSystem::getStreamVolumeIndex(AUDIO_STREAM_ENFORCED_AUDIBLE, &index, device)){// ALOGE("33333getStreamVolumeIndex ERROR");// }ALOGE("bootMusic:::index:::%d", index);if (index !=0){//mp->setVolume(0.4f, 0.4f);mp->seekTo(0);mp->start();} }const char *fileName = “/system/media/poweron.wav”; 路徑是自己定義的,這里的路徑是Android 設(shè)備的路徑,不是Android代碼倉庫的路徑,對(duì)應(yīng)倉庫代碼路徑:\out\target\product\設(shè)備名稱\system\media
調(diào)用 bootanimation_main.cpp
int main() {。。。。。。。ProcessState::self()->startThreadPool();waitForSurfaceFlinger();// create the boot animation objectsp<BootAnimation> boot = new BootAnimation(new AudioAnimationCallbacks());ALOGV("Boot animation set up. Joining pool.");// 2022 play boot music startBootAnimation *bootMusic = new BootAnimation(new AudioAnimationCallbacks());bootMusic->bootMusic();// 2022 play boot music endIPCThreadState::self()->joinThreadPool();}。。。。。。。 }注意需要在ProcessState::self()->startThreadPool(); 和 IPCThreadState::self()->joinThreadPool(); 方法之間調(diào)用才有效,否則在MediaPlayer prepare的時(shí)候會(huì)收不到系統(tǒng)發(fā)回的已經(jīng)準(zhǔn)備完成的消息
問題
到這里就已經(jīng)添加完成了,但發(fā)現(xiàn)依然沒有開機(jī)音樂,方法是已經(jīng)調(diào)用到了,最后發(fā)現(xiàn)是AudioSystem::initStreamVolume() 和
AudioSystem::setStreamVolumeIndex() 方法都失敗了,返回了一個(gè)BAD_VALUE。 AudioSystem::getStreamVolumeIndex() 方法獲得的index的值一直是0,猜測是media服務(wù)沒有啟動(dòng),就在網(wǎng)上找方法
BootAnimation是由surfaceflinger 啟動(dòng),在5.0以上系統(tǒng)中,由于BootAnimation 啟動(dòng)的時(shí)候,Mediasever 還沒有完全啟動(dòng),在5.1 系統(tǒng)服務(wù)比4.4 多了一個(gè)電池統(tǒng)計(jì)服務(wù),啟動(dòng)較慢導(dǎo)致Mediasever 沒有啟動(dòng)成功
將\frameworks\base\cmds\bootanimation\bootanim.rc 方法中的user graphics 更改成 user media 就可以了,這樣聲音是有了,但是開機(jī)動(dòng)畫較長時(shí),Android啟動(dòng)后就直接進(jìn)入launcher了,即播放到一半就退出進(jìn)入Launcher了
加入 part.playUntilComplete = 1; 就可以等到開機(jī)動(dòng)畫播完再退出進(jìn)入Launcher了
更改資源下載:https://download.csdn.net/download/weixin_44128558/85563215
總結(jié)
以上是生活随笔為你收集整理的android9 添加开机音乐的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ssm毕设项目康健医药公司进销存管理22
- 下一篇: 受力分析软件_大赛作品 | 关于Z型路灯