androidmediascanner
Ⅰ android 圖庫刷新不了怎麼辦 手機內存卡裡面新放進的圖片,圖庫裡面顯示不出來,懷疑是刷新不了,怎麼辦
Android手機圖庫的圖片不顯示,刷新失敗等錯誤,多數情況下都是圖庫或者相冊這個應用由於某些原因導致出錯了,導致無法預覽,刷新。
以下是解決方法:
打開手機的圖庫,可以看見圖庫不顯示任何圖片,提示沒有圖片/視頻,只有一個大大的相機圖標
進入文件管理-SD卡-images以及其他存放有圖片的文件夾可以發現手機上的圖片都沒有損壞,可正常顯示
使用手機數據線將手機和電腦連接,選擇打開USB存儲
勾選顯示隱藏文件夾,找到一個叫做.nomedia的文件夾,刪除,部分第三方刷機包ROM可能內置這個文件夾,以此來保護用戶的隱私不顯示在手機上
關閉USB存儲,拔掉數據線,打開手機-設置-應用-全部-圖庫-清除數據
打開第三方安全軟體-自啟管家-系統組件-圖庫,如果圖庫的狀態是禁止自啟,請取消圖庫的禁止自啟狀態,恢復圖庫的自啟行為
重啟手機,圖庫的內容就可以正常顯示了
Ⅱ Android Framework media providers 隨筆
遇到一個問題是多媒體掃描失敗:
從logcat 中可以看到的時候 這個服務 com.android.providers.media/.MediaScannerService 啟動超時了
1、com.android.providers.media 和 com.android.providers.media/.MediaScannerService 到底是在哪裡定義聲明的?
2、Why com.android.providers.media/.MediaProvider is crashing?
帶著問題擴展開來學習,遇到什麼記錄什麼,慢慢搭建系統的體系
平台:Android 7.1
1、com.android.providers.media 與 MediaScannerService
看 frameworks.java 的構造方法和connect 方法, 其注釋和介面實現可以回答之前的疑問
如下介面通過
new ComponentName("com.android.providers.media",
"com.android.providers.media.MediaScannerService"));
而 MediaScannerService 我們只需要看如下文件中的注釋就對其流程有一個清晰的了解
frameworks.java
2、Why com.android.providers.media/.MediaProvider is crashing?
在
frameworks.java getContentProviderImpl函數中會對 OomAdj 優先順序進行調整,如果調整失敗和判斷進程不可活, 則調用 appDiedLocked kill 其進程
其實最後之所以把文章標題寫為隨筆,就是還有未完成的事情要做。
雖然把 1 的疑問找到地方了,但是其實是引出來了更多疑問,什麼時候調用,其他層邏輯實現
轉一篇文章看看 Android開發——MediaProvider源碼分析(1)
同樣2 也是,OomAdj 為什麼會調整失敗,調整失敗後怎麼做 等等...
這些都是會引發新的思考,並且跟自身已有的知識點聯系起來,所以系統知識技能需要不斷思考,實踐學習
Ⅲ Android來電鈴聲默認設置的實現方法與怎麼設置語音來電的默認鈴聲
Android來電鈴聲默認設置的實現方法與如何設置語音來電的默認鈴聲
一、Android來電鈴聲默認設置的實現方法
Andoird默認來電鈴聲的設置方法為修改build/target/proct/core.mk的ro.config.ringtone的值如
ro.config.ringtone=Backroad.ogg,該音樂文件必須於framework/base/data/sounds/Android.mk中加入音樂文件。
framework/base/media/java/android/media/MediaScanner.java中類的初始化時會設置默認鈴聲的文件名的變數mDefaultRingtoneFilename = SystemProperties.get(DEFAULT_RINGTONE_PROPERTY_PREFIX + Setting.System.RINGTONE);
MediaScanner該類會搜索音樂文件必插入資料庫中,搜索過程中檢查是否與設置的默認鈴聲相同,如果相同則設為默認鈴聲。
} else if (ringtones && mWasEmptyPriorToScan && !mDefaultRingtoneSet) {
if (TextUtils.isEmpty(mDefaultRingtoneFilename) ||
doesPathHaveFilename(entry.mPath, mDefaultRingtoneFilename)) {
setSettingIfNotSet(Settings.System.RINGTONE, tableUri, rowId);
setProfileSettings(AudioProfileManager.TYPE_RINGTONE, tableUri, rowId);
mDefaultRingtoneSet = true;
}
}
二、如何設置語音來電的默認鈴聲
首先在core.mk中新增ro.config.videocall=BentleyDubs.ogg。
在framework/base/media/java/android/media/MediaScanner.java類中新加兩個成員變數
private boolean mDefaultVideoCallSet;
private String mDefaultVideoCallFilename;
在setDefaultRingtoneFileNames()方法中加入以下代碼初始化默認鈴聲的文件名
mDefaultVideoCallFilename = SystemProperties.get(DEFAULT_RINGTONE_PROPERTY_PREFIX
+ Settings.System.VIDEO_CALL);
在endFile()方法中加入以下代碼設置語音來電的默認鈴聲
} else if (ringtones && mWasEmptyPriorToScan && !mDefaultVideoCallSet) {
if (TextUtils.isEmpty(mDefaultVideoCallFilename) ||
doesPathHaveFilename(entry.mPath, mDefaultVideoCallFilename)) {
setSettingIfNotSet(Settings.System.VIDEO_CALL, tableUri, rowId);
setProfileSettings(AudioProfileManager.TYPE_VIDEO_CALL, tableUri, rowId);
mDefaultVideoCallSet = true;
}
}
Ⅳ android 怎麼獲取手機內存里的音樂信息
Android自帶的音樂播放器中,在獲取音樂文件信息的時候是通過掃描得到相關信息的。掃描時使用掃描器MediaScanner完成。
Android系統提供了MediaScanner、MediaProvider、MediaStore等介面,並且提供了一套資料庫表格,通過Content Provider的方式提供給用戶。當手機開機或者有SD卡插拔等事件發生時,系統將會自動掃描SD卡和手機內存上的媒體文件,如audio、video、圖片等,將相應的信息放到定義好的資料庫表格中。在這個程序中,我們不需要關心如何去掃描手機中的文件,只要了解如何查詢和使用這些信息就可以了。
MediaStore中定義了一系列的數據表格,通過Android ContentResolver提供的查詢介面,我們可以得到各種需要的信息。下面我們重點介紹查詢SD卡上的音樂文件信息。
先來了解一下ContentResolver的查詢介面:
Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
Uri:指明要查詢的資料庫名稱加上表的名稱,從MediaStore中我們可以找到相應信息的參數。
Projection: 指定查詢資料庫表中的哪幾列,返回的游標中將包括相應的信息。Null則返回所有信息。
selection: 指定查詢條件
selectionArgs:參數selection里有 ?這個符號是,這里可以以實際值代替這個問號。如果selection這個沒有?的話,那麼這個String數組可以為null。
SortOrder:指定查詢結果的排列順序
下面的命令將返回所有在外部存儲卡上的音樂文件的信息:
Cursor cursor = query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null, MediaStore.Audio.Media.DEFAULT_SORT_ORDER);
得到cursor後,我們可以調用Cursor的相關方法具體的音樂信息:
歌曲ID:MediaStore.Audio.Media._ID
Int id = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media._ID));
歌曲的名稱:MediaStore.Audio.Media.TITLE
String tilte = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE));
歌曲的專輯名:MediaStore.Audio.Media.ALBUM
String album = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM));
歌曲的歌手名:MediaStore.Audio.Media.ARTIST
String artist = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST));
歌曲文件的路徑:MediaStore.Audio.Media.DATA
String url = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA));
歌曲的總播放時長:MediaStore.Audio.Media.DURATION
Int ration = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DURATION));
歌曲文件的大小:MediaStore.Audio.Media.SIZE
Int size = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.SIZE));