新聞中心
智能手機(jī)的開機(jī)畫面一般是由一幀靜態(tài)圖片或者一組靜態(tài)圖片組成。一組動(dòng)態(tài)圖片可以在代碼中實(shí)現(xiàn)開機(jī)動(dòng)畫的效果。為了豐富開機(jī)界面的形式,百變開機(jī)畫面補(bǔ)充了這樣的需求。
可以實(shí)現(xiàn)開機(jī)播放自定義視頻,又可以兼容開機(jī)播放靜態(tài)圖片的功能。
該功能主要由兩個(gè)bin服務(wù)實(shí)現(xiàn)
Counter服務(wù)是屬于系統(tǒng)bin服務(wù),位置在/system/bin/counter,擁有系統(tǒng)權(quán)限,可以讀寫系統(tǒng)file,實(shí)現(xiàn)開機(jī)畫面的倒計(jì)時(shí)功能與開機(jī)靜態(tài)圖片的展示。
Play服務(wù)是屬于系統(tǒng)bin服務(wù),位置在/system/bin/counter,擁有系統(tǒng)權(quán)限,可以讀寫系統(tǒng)file,實(shí)現(xiàn)開機(jī)自定義視頻功能,可以支持mp4,ts等常見視頻格式
類Counte實(shí)現(xiàn)counter.cpp是一個(gè)顯性的倒計(jì)時(shí)提示,在用戶自定義的開機(jī)視頻和開機(jī)畫面上顯示剩余秒數(shù)提示用戶,同時(shí)如果有靜態(tài)圖片,背景顯示圖片。
1.?????? Counter是系統(tǒng)bin服務(wù),通過createSurface創(chuàng)建實(shí)例作為圖層:
status_t Counter::readyToRun() {
//獲取內(nèi)建顯示設(shè)備
sp
ISurfaceComposer::eDisplayIdMain));
DisplayInfo dinfo;
//獲取默認(rèn)的Display對(duì)象參數(shù)
status_t status = SurfaceComposerClient::getDisplayInfo(dtoken, &dinfo);
if (status)
return -1;
// 創(chuàng)建native SurfaceView
sp
dinfo.w, dinfo.h, PIXEL_FORMAT_RGBA_8888, 0);
//操作SurfaceComposeClient,并設(shè)置圖層優(yōu)先級(jí)
SurfaceComposerClient::openGlobalTransaction();
control->setLayer(0x40000002);
SurfaceComposerClient::closeGlobalTransaction();
sp
// 初始化 opengl 和 egl引擎參數(shù)
const EGLint attribs[] = {
EGL_RED_SIZE,?? 8,
EGL_GREEN_SIZE, 8,
EGL_BLUE_SIZE,? 8,
EGL_ALPHA_SIZE, 8,
EGL_DEPTH_SIZE, 0,
EGL_NONE
};
2.?????? 加載系統(tǒng)默認(rèn)UI資源,通過decodeImage來解碼圖片,并顯示在SurfaceLayer之上。
status_t Counter::initTexture(Texture* texture, AssetManager& assets,
const char* name) {
//聲明bitmap對(duì)象
SkBitmap bitmap;
//通過sk庫函數(shù)對(duì)圖片進(jìn)行decode
SkImageDecoder::DecodeMemory(asset->getBuffer(false), asset->getLength(),
&bitmap, kUnknown_SkColorType, SkImageDecoder::kDecodePixels_Mode);
//assert對(duì)象關(guān)閉,釋放資源
asset->close();
delete asset;
……
}
Player.cpp是檢查data目錄下是否有視頻文件,通過在開機(jī)界面繪制surfaceview來播放視頻。
在surfacelinger服務(wù)初始化完成后,啟動(dòng)Player服務(wù),創(chuàng)建surface示例并設(shè)置初始化view參數(shù)。這部分與初始化Counter過程一樣,需要?jiǎng)?chuàng)建Native Surface。
檢測(cè)目錄下視頻文件后,開始調(diào)用MediaPlayer播放視頻,獲取視頻時(shí)長,格式,設(shè)置倒計(jì)時(shí)服務(wù),直到播放結(jié)束后進(jìn)入系統(tǒng)。
播放視頻相關(guān)代碼流程:
int main(int argc, char **argv) {
android::ProcessState::self()->startThreadPool();
//初始化SurfaceComposerClient
sp
//獲取內(nèi)建顯示設(shè)備
sp
??????????ISurfaceComposer::eDisplayIdMain));
//創(chuàng)建Surface,初始化相關(guān)參數(shù)
sp
composerClient->createSurface(
???? String8("A Surface"),
???? displayWidth,
???? displayHeight,
???? PIXEL_FORMAT_RGB_565,
???? 0);
SurfaceComposerClient::closeGlobalTransaction();
//創(chuàng)建MediaPlayer實(shí)例
sp
service->create(client, AUDIO_SESSION_ALLOCATE);
//設(shè)置播放源目標(biāo)
if (player != NULL && player->setDataSource(source) == NO_ERROR) {
//設(shè)置播放Video的SurfaceTexture,用于顯示播放視頻流
player->setVideoSurfaceTexture(surface->getIGraphicBufferProducer());
//開始播放文件
player->start();
client->waitForEOS();
//播放停止
player->stop();
} else {
?fprintf(stderr, "failed to instantiate player.\n");
}
//關(guān)閉composerClient
composerClient->dispose();
}
播放自定義視頻流程
在init.rc中添加counter與advert服務(wù),user權(quán)限聲明為root,初次啟動(dòng)設(shè)置為disabled,需要主動(dòng)調(diào)起。
service connter /system/bin/counter
class core
??user root
group graphics audio
disabled
oneshot
service player /system/bin/player
class core
user root
group graphics audio
disabled
oneshot
分享題目:Wireshark工具介紹-創(chuàng)新互聯(lián)
轉(zhuǎn)載來于:http://fisionsoft.com.cn/article/eesid.html