android9 添加开机音乐
開機動畫
Android 開機總共會出現3個畫面:
原生開機動畫
\frameworks\base\cmds\bootanimation\BootAnimation.cpp
\frameworks\base\core\res\assets\images
可以看到設置了兩張圖片 android-logo-mask.png 和 android-logo-shine.png
bootanimation.zip
android 2.0之后,將制作好的 bootanimation.zip 放在系統的/system/media目錄中,或/data/local目錄中即可,兩個目錄下都存在時,優先使用/data/local下的,android 2.0之前,則需要修改源碼。
part0 和 part1 中放的是開機動畫每一幀的圖片,圖片名稱需要按編號命名,主要就是 desc.txt 文件
desc.txt:
- 第1行用來描述開機動畫在屏幕顯示的大小及速度,即為:開機動畫的寬度為1920個像素,高度為1080個像素,顯示頻率為每秒25幀,即每秒顯示25張圖片,即每張圖片顯示時間為1/25 = 0.04秒 = 40毫秒。
- 下面的每一行代表一個片段,顯示的時候會按照順序從上到下依次顯示。第一個字符為片段類型,有’c’和’p’兩種(注意:‘c’ 片段在Android 5.1后加入),第二個字段表示該片段重復顯示的次數(如果為0表示無限重復顯示),第三個字段表示兩個片段之間顯示的時間間隔(如果為10 則表示part0播放完會等待10*1/25 = 0.4秒 再播放part1片段中的動畫,即等待多少幀),第四個字段為該片段所在的文件夾
注意這里寫好desc.txt 文件后最好在最后一行敲個回車換行,不然可能會有奇怪的問題
制作完打包,注意是zip格式,壓縮方式為存儲模式(只是打包不壓縮),打包完放到指定的目錄即可
至于’c’ 片段嘛,當SurfaceFlinger服務要求bootanimation停止顯示動畫時,以‘p’標識的片段會停止,而以’c’標識的片段會繼續顯示(開機動畫會播放完在退出)
但我將p片段改成c片段,開機動畫直接不顯示了,黑屏直到進入launcher,后續在看吧
開機音樂
系統自帶
\frameworks\base\cmds\bootanimation\BootAnimation.cpp 文件中有實現
將開機音樂命名成 audio.wav 放入開機動畫文件的part0 文件夾中并打包,但不知為何我的 android 9 設備并沒有播放開機音樂,可能是和下面的問題一樣 media 服務沒有起來,起來后這個方法我就沒有實驗了
手動實現
目錄:\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:。。。。。。實現方法 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 設備的路徑,不是Android代碼倉庫的路徑,對應倉庫代碼路徑:\out\target\product\設備名稱\system\media
調用 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(); 方法之間調用才有效,否則在MediaPlayer prepare的時候會收不到系統發回的已經準備完成的消息
問題
到這里就已經添加完成了,但發現依然沒有開機音樂,方法是已經調用到了,最后發現是AudioSystem::initStreamVolume() 和
AudioSystem::setStreamVolumeIndex() 方法都失敗了,返回了一個BAD_VALUE。 AudioSystem::getStreamVolumeIndex() 方法獲得的index的值一直是0,猜測是media服務沒有啟動,就在網上找方法
BootAnimation是由surfaceflinger 啟動,在5.0以上系統中,由于BootAnimation 啟動的時候,Mediasever 還沒有完全啟動,在5.1 系統服務比4.4 多了一個電池統計服務,啟動較慢導致Mediasever 沒有啟動成功
將\frameworks\base\cmds\bootanimation\bootanim.rc 方法中的user graphics 更改成 user media 就可以了,這樣聲音是有了,但是開機動畫較長時,Android啟動后就直接進入launcher了,即播放到一半就退出進入Launcher了
加入 part.playUntilComplete = 1; 就可以等到開機動畫播完再退出進入Launcher了
更改資源下載:https://download.csdn.net/download/weixin_44128558/85563215
總結
以上是生活随笔為你收集整理的android9 添加开机音乐的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ssm毕设项目康健医药公司进销存管理22
- 下一篇: 受力分析软件_大赛作品 | 关于Z型路灯