編輯:關於Android編程
Android中在StageFrightMediaScanner實現對多媒體文件的處理。
此外在StageFrightMediaScanner定義了支持的多媒體文件類型。
文件位置
frameworksavmedialibstagefrightStagefrightMediaScanner.cpp
編譯目標
libstagefright.so
processFile並沒有做什麼處理,主要是調用processFileInternal。
另外可以看到在processFile中調用MediaScannerClient的beginFile和endFile方法,時間上google並沒有實現beginFile和endFile方法。
(說實話Android5.0 真的很爛,很多功能根本就沒有開發完全)
MediaScanResult StagefrightMediaScanner::processFile(
const char *path, const char *mimeType,
MediaScannerClient &client) {
//MediaScannerClient根本就沒有實現,所以不用關心
client.setLocale(locale());
client.beginFile();
MediaScanResult result = processFileInternal(path, mimeType, client);
client.endFile();
return result;
}
processFileInternal可以說是MediaScanner處理多媒體文件最終節點
在此函數中通過調用MediaMetadataRetriever獲取多媒體信息。
調用MediaMetadataRetriever獲取媒體文件信息過程如下:
(1) MediaMetadataRetriever.setDataSource(file)
(2) MediaMetadataRetriever.extractMetadata(key)
MediaScanResult StagefrightMediaScanner::processFileInternal(
const char *path, const char * /* mimeType */,
MediaScannerClient &client) {
const char *extension = strrchr(path, '.');
///check file type
if (!extension) {
return MEDIA_SCAN_RESULT_SKIPPED;
}
if (!FileHasAcceptableExtension(extension)) {
return MEDIA_SCAN_RESULT_SKIPPED;
}
//----------------------------------------
///Init & setDataSource MediaMetadataRetriever
sp mRetriever(new MediaMetadataRetriever);
int fd = open(path, O_RDONLY | O_LARGEFILE);
status_t status;
if (fd < 0) {
// couldn't open it locally, maybe the media server can?
status = mRetriever->setDataSource(NULL /* httpService */, path);
} else {
status = mRetriever->setDataSource(fd, 0, 0x7ffffffffffffffL);
close(fd);
}
//----------------------------------------
///get MIMETYPE
const char *value;
if ((value = mRetriever->extractMetadata(
METADATA_KEY_MIMETYPE)) != NULL) {
status = client.setMimeType(value);
if (status) {
return MEDIA_SCAN_RESULT_ERROR;
}
}
//----------------------------------------
.........
///get metadata
for (size_t i = 0; i < kNumEntries; ++i) {
const char *value;
if ((value = mRetriever->extractMetadata(kKeyMap[i].key)) != NULL) {
status = client.addStringTag(kKeyMap[i].tag, value);
if (status != OK) {
return MEDIA_SCAN_RESULT_ERROR;
}
}
}
return MEDIA_SCAN_RESULT_OK;
}
很多時候,使用shape能夠實現的效果,你用一張圖片也能夠實現,但問題是一張圖片無論你怎麼壓縮,它都不可能比一個xml文件小,因此,為了獲得一個高性能的手機App,我們在
我們發現去哪兒網app的首頁做的win8風格的方塊,然後按壓方塊後悔發現,這個圖片不但有縮放效果,而且還有顯示指紋的效果,感覺跟真的手指按上去一樣,很高逼格。今天我們就
android中的上下文菜單類似於PC上的鼠標右鍵單擊,不同的是android上沒有鼠標這一概念,更談不上右鍵單擊,在android中,一般是長按某個View,調出上下文
概述作為一個android開發者,在開發應用時,隨著業務規模發展到一定程度,不斷地加入新功能、添加新的類庫,代碼在急劇的膨脹,相應的apk包的大小也急劇增加,