JamesMusic浅读--------6,补全欢迎界面,音乐文件数据库
来源:互联网 发布:oracle导入数据库 编辑:程序博客网 时间:2024/06/06 03:13
前面我们实现了文件夹的操作,解下来就是从文件夹里面的音乐引入到音乐列表。由于音乐文件搜索在最后一个界面, 那我们就先实现最后一个welcom界面。
public class ReadyToScanFragment extends Fragment { private Context mContext; private TextView welcomeHeader; private TextView welcomeText1; private TextView swipeLeftToContinue; @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { mContext = getActivity().getApplication(); View rootView = (View)inflater.inflate(R.layout.fragment_welcome_screen_6,container, false); return rootView; }}
将这个类的对象添加到WelcomePagerAdapter,这样我们就可以显示这个界面了。
在WecomActivity中进入这个界面时候,会启用搜索文件的异步任务。
在这之前是一个动画效果,我们先忽略这个效果直接实现文件搜索。通过一个Service实现,并将其设置为前台任务及其后台进程。
/** * Created by kankan on 2016/5/29. */public class BuildMusicLibraryService extends Service implements AsyncBuildLibraryTask.OnBuildLibraryProgressUpdate { private Context mContext; private NotificationCompat.Builder mBuilder; private Notification mNotification; private NotificationManager mNotifyManager; public static int mNotificationId = 92713; @Nullable @Override public IBinder onBind(Intent intent) { return null; } @Override public void onCreate() { super.onCreate(); mContext = this.getApplicationContext(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { /* */ mBuilder = new NotificationCompat.Builder(mContext); mBuilder.setSmallIcon(android.support.design.R.id.split_action_bar); mBuilder.setContentTitle(getResources().getString(R.string.building_music_library)); mBuilder.setTicker(getResources().getString(R.string.building_music_library)); mBuilder.setContentText("123"); mBuilder.setProgress(0, 0, true); mNotifyManager =(NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE); mNotification = mBuilder.build(); mNotification.flags |= Notification.FLAG_INSISTENT|Notification.FLAG_NO_CLEAR; startForeground(mNotificationId, mNotification); AsyncBuildLibraryTask task = new AsyncBuildLibraryTask(mContext, this); task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); return START_STICKY; } @Override public void onStartBuildingLibrary() { } @Override public void onProgressUpdate(AsyncBuildLibraryTask task, String mCurrentTask, int overallProgress, int maxProgress, boolean mediaStoreTransferDone) { } @Override public void onFinishBuildingLibrary(AsyncBuildLibraryTask task) { }}这个服务,第一是把自己变成前台任务,第二启动一个异步任务,用来将音乐文件的信息存入数据库。
我们看一下这个任务。
/** * Created by kankan on 2016/5/29. */public class AsyncBuildLibraryTask extends AsyncTask<Void, Void, String>{ private String TAG =this.getClass().getSimpleName(); private Context mContext; private Common mApp; private BuildMusicLibraryService mService; private String mCurrentTask = ""; private int mOverallProgress = 0; private Date date = new Date(); private String mMediaStoreSelection = null; private HashMap<String, String> mGenresHashMap = new HashMap<String, String>(); private HashMap<String, Integer> mGenresSongCountHashMap = new HashMap<String, Integer>(); private HashMap<String, Integer> mAlbumsCountMap = new HashMap<String, Integer>(); private HashMap<String, Integer> mSongsCountMap = new HashMap<String, Integer>(); private HashMap<String, Uri> mMediaStoreAlbumArtMap = new HashMap<String, Uri>(); private HashMap<String, String> mFolderArtHashMap = new HashMap<String, String>(); public AsyncBuildLibraryTask(Context mContext, BuildMusicLibraryService mService) { this.mContext = mContext; this.mApp = (Common) mContext; this.mService = mService; // TODO: 2016/5/29 } /** * Provides callback methods that expose this * AsyncTask's progress. * * @author Saravan Pantham */ public interface OnBuildLibraryProgressUpdate { /** * Called when this AsyncTask begins executing * its doInBackground() method. */ public void onStartBuildingLibrary(); /** * Called whenever mOverall Progress has been updated. */ public void onProgressUpdate(AsyncBuildLibraryTask task, String mCurrentTask, int overallProgress, int maxProgress, boolean mediaStoreTransferDone); /** * Called when this AsyncTask finishes executing * its onPostExecute() method. */ public void onFinishBuildingLibrary(AsyncBuildLibraryTask task); } @Override protected void onPreExecute() { super.onPreExecute(); } @Override protected String doInBackground(Void... params) { mCurrentTask = mContext.getResources().getString(R.string.building_music_library); Cursor mediaStoreCursor = getSongsFromMediaStore(); if(mediaStoreCursor != null){ saveMediaStoreDataToDB(mediaStoreCursor); } return null; } void saveMediaStoreDataToDB(Cursor mediaStoreCursor ){ try{ mApp.getDBAccessHelper().getWritableDatabase().beginTransaction(); //clear out the table mApp.getDBAccessHelper() .getWritableDatabase() .delete(DBAccessHelper.MUSIC_LIBRARY_TABLE, null, null); //Tracks the progress of this method. int subProgress = 0; if(mediaStoreCursor.getCount() !=0){ subProgress = 250000/(mediaStoreCursor.getCount()); }else { subProgress = 250000/1; } buildGenresLibrary(); buildArtistsLibrary();; buildAlbumsLibrary();; buildMediaStoreAlbumArtHash(); final int titleColIndex = mediaStoreCursor.getColumnIndex(MediaStore.Audio.Media.TITLE); final int artistColIndex = mediaStoreCursor.getColumnIndex(MediaStore.Audio.Media.ARTIST); final int albumColIndex = mediaStoreCursor.getColumnIndex(MediaStore.Audio.Media.ALBUM); final int albumIdColIndex = mediaStoreCursor.getColumnIndex(MediaStore.Audio.Media.ALBUM_ID); final int durationColIndex = mediaStoreCursor.getColumnIndex(MediaStore.Audio.Media.DURATION); final int trackColIndex = mediaStoreCursor.getColumnIndex(MediaStore.Audio.Media.TRACK); final int yearColIndex = mediaStoreCursor.getColumnIndex(MediaStore.Audio.Media.YEAR); final int dateAddedColIndex = mediaStoreCursor.getColumnIndex(MediaStore.Audio.Media.DATE_ADDED); final int dateModifiedColIndex = mediaStoreCursor.getColumnIndex(MediaStore.Audio.Media.DATE_MODIFIED); final int filePathColIndex = mediaStoreCursor.getColumnIndex(MediaStore.Audio.Media.DATA); final int idColIndex = mediaStoreCursor.getColumnIndex(MediaStore.Audio.Media._ID); int albumArtistColIndex = mediaStoreCursor.getColumnIndex(MediaStoreAccessHelper.ALBUM_ARTIST); if(albumArtistColIndex == -1){ albumArtistColIndex = artistColIndex; } Log.i(TAG, "media store cursor "+ mediaStoreCursor.getCount()); for(int i = 0 ;i < mediaStoreCursor.getCount(); i++) { mediaStoreCursor.moveToPosition(i); mOverallProgress += subProgress; publishProgress(); Log.i(TAG, "progress " +i); String songTitle = mediaStoreCursor.getColumnName(titleColIndex); String songArtist = mediaStoreCursor.getString(artistColIndex); String songAlbum = mediaStoreCursor.getString(albumColIndex); String songAlbumId = mediaStoreCursor.getString(albumIdColIndex); String songAlbumArtist = mediaStoreCursor.getString(albumArtistColIndex); String songFilePath = mediaStoreCursor.getString(filePathColIndex); String songGenre = getSongGenre(songFilePath); String songDuration = mediaStoreCursor.getString(durationColIndex); String songTrackNumber = mediaStoreCursor.getString(trackColIndex); String songYear = mediaStoreCursor.getString(yearColIndex); String songDateAdded = mediaStoreCursor.getString(dateAddedColIndex); String songDateModified = mediaStoreCursor.getString(dateModifiedColIndex); String songId = mediaStoreCursor.getString(idColIndex); String numberOfAlbums = "" + mAlbumsCountMap.get(songArtist); String numberOfTracks = "" + mSongsCountMap.get(songAlbum + songArtist); String numberOfSongsInGenre = "" + getGenreSongsCount(songGenre); String songSource = DBAccessHelper.LOCAL; String songSavedPosition = "-1"; String songAlbumArtPath = ""; if (mMediaStoreAlbumArtMap.get(songAlbum) != null) { songAlbumArtPath = mMediaStoreAlbumArtMap.get(songAlbumId).toString(); } if (numberOfAlbums.equals("1")) numberOfAlbums += " " + mContext.getResources().getString(R.string.album_small); else numberOfAlbums += " " + mContext.getResources().getString(R.string.albums_small); if (numberOfTracks.equals("1")) numberOfTracks += " " + mContext.getResources().getString(R.string.song_small); else numberOfTracks += " " + mContext.getResources().getString(R.string.songs_small); if (numberOfSongsInGenre.equals("1")) numberOfSongsInGenre += " " + mContext.getResources().getString(R.string.song_small); else numberOfSongsInGenre += " " + mContext.getResources().getString(R.string.songs_small);//Check if any of the other tags were empty/null and set them to "Unknown xxx" values. if (songArtist == null || songArtist.isEmpty()) { songArtist = mContext.getResources().getString(R.string.unknown_artist); } if (songAlbumArtist == null || songAlbumArtist.isEmpty()) { if (songArtist != null && !songArtist.isEmpty()) { songAlbumArtist = songArtist; } else { songAlbumArtist = mContext.getResources().getString(R.string.unknown_album_artist); } } if (songAlbum == null || songAlbum.isEmpty()) { songAlbum = mContext.getResources().getString(R.string.unknown_album); ; } if (songGenre == null || songGenre.isEmpty()) { songGenre = mContext.getResources().getString(R.string.unknown_genre); } //Filter out track numbers and remove any bogus values. if (songTrackNumber != null) { if (songTrackNumber.contains("/")) { int index = songTrackNumber.lastIndexOf("/"); songTrackNumber = songTrackNumber.substring(0, index); } try { if (Integer.parseInt(songTrackNumber) <= 0) { songTrackNumber = ""; } } catch (Exception e) { e.printStackTrace(); songTrackNumber = ""; } } long durationLong = 0; try { durationLong = Long.parseLong(songDuration); } catch (Exception e) { e.printStackTrace(); } ContentValues values = new ContentValues(); values.put(DBAccessHelper.SONG_TITLE, songTitle); values.put(DBAccessHelper.SONG_ARTIST, songArtist); values.put(DBAccessHelper.SONG_ALBUM, songAlbum); values.put(DBAccessHelper.SONG_ALBUM_ARTIST, songAlbumArtist); values.put(DBAccessHelper.SONG_DURATION, convertMillisToMinsSecs(durationLong)); values.put(DBAccessHelper.SONG_FILE_PATH, songFilePath); values.put(DBAccessHelper.SONG_TRACK_NUMBER, songTrackNumber); values.put(DBAccessHelper.SONG_GENRE, songGenre); values.put(DBAccessHelper.SONG_YEAR, songYear); values.put(DBAccessHelper.SONG_ALBUM_ART_PATH, songAlbumArtPath); values.put(DBAccessHelper.SONG_LAST_MODIFIED, songDateModified); values.put(DBAccessHelper.SONG_ALBUM_ART_PATH, songAlbumArtPath); values.put(DBAccessHelper.BLACKLIST_STATUS, false); values.put(DBAccessHelper.ADDED_TIMESTAMP, date.getTime()); values.put(DBAccessHelper.RATING, 0); values.put(DBAccessHelper.LAST_PLAYED_TIMESTAMP, songDateModified); values.put(DBAccessHelper.SONG_SOURCE, songSource); values.put(DBAccessHelper.SONG_ID, songId); values.put(DBAccessHelper.SAVED_POSITION, songSavedPosition); values.put(DBAccessHelper.ALBUMS_COUNT, numberOfAlbums); values.put(DBAccessHelper.SONGS_COUNT, numberOfTracks); values.put(DBAccessHelper.GENRE_SONG_COUNT, numberOfSongsInGenre); //Add all the entries to the database to build the songs library. mApp.getDBAccessHelper().getWritableDatabase().insert(DBAccessHelper.MUSIC_LIBRARY_TABLE, null, values); } } catch (Exception e){ e.printStackTrace(); }finally { mApp.getDBAccessHelper().getWritableDatabase().setTransactionSuccessful(); mApp.getDBAccessHelper().getWritableDatabase().endTransaction(); } } private String getSongGenre(String filePath){ if(mGenresHashMap != null){ return mGenresHashMap.get(filePath); }else { return mContext.getResources().getString(R.string.unknown_genre); } } private int getGenreSongsCount(String genre){ if(mGenresSongCountHashMap != null){ if(genre !=null){ return mGenresSongCountHashMap.get(genre); }else { return 0; } }else{ if(mGenresSongCountHashMap.get(mContext.getResources().getString(R.string.unknown_genre))!= null) return mGenresSongCountHashMap.get(mContext.getResources().getString(R.string.unknown_genre)); else return 0; } } private void buildGenresLibrary(){ //Get a cursor of all genres in MediaStore // Cursor generesCursor = mContext.getContentResolver() Cursor genersCursor = mContext.getContentResolver().query(MediaStore.Audio.Genres.EXTERNAL_CONTENT_URI, new String[] {MediaStore.Audio.Genres._ID, MediaStore.Audio.Genres.NAME}, null, null, null); //Iterate thru all generes in MediaStore for(genersCursor.moveToFirst(); !genersCursor.isAfterLast(); genersCursor.moveToNext()){ String genreId = genersCursor.getString(0); String genreName = genersCursor.getString(1); Log.i(TAG, "genresId "+genreId+"genreName "+ genreName); if (genreName==null || genreName.isEmpty() || genreName.equals(" ") || genreName.equals(" ") || genreName.equals(" ")) genreName = mContext.getResources().getString(R.string.unknown_genre); Cursor cursor = mContext.getContentResolver().query(makeGenreUri(genreId), new String[]{MediaStore.Audio.Media.DATA}, mMediaStoreSelection, null, null); if(cursor != null){ for(int i= 0; i< cursor.getCount() ; i++){ cursor.moveToPosition(i); mGenresHashMap.put(cursor.getString(0), genreName); mGenresSongCountHashMap.put(genreName, cursor.getCount()); } cursor.close(); } } if(genersCursor != null){ genersCursor.close(); } } private Uri makeGenreUri(String genreId){ String CONTENTDIR = MediaStore.Audio.Genres.Members.CONTENT_DIRECTORY; return Uri.parse(new StringBuilder().append(MediaStore.Audio.Genres.EXTERNAL_CONTENT_URI.toString()) .append("/") .append(genreId) .append("/") .append(CONTENTDIR) .toString()); } /** * "" * **/ private Cursor getSongsFromMediaStore(){ Cursor musicFolderCursor = mApp.getDBAccessHelper().getAllMusicFolderPaths(); Cursor mediaStoreCursor = null; String sortOrder = null; String projection[]={ MediaStore.Audio.Media.TITLE, MediaStore.Audio.Media.ARTIST, MediaStore.Audio.Media.ALBUM, MediaStore.Audio.Media.ALBUM_ID, MediaStore.Audio.Media.DURATION, MediaStore.Audio.Media.TRACK, MediaStore.Audio.Media.YEAR, MediaStore.Audio.Media.DATA, MediaStore.Audio.Media.DATE_ADDED, MediaStore.Audio.Media.DATE_MODIFIED, MediaStore.Audio.Media._ID, MediaStoreAccessHelper.ALBUM_ARTIST }; if(musicFolderCursor == null || musicFolderCursor.getCount() <1){ // TODO: 2016/5/29 }else{ mMediaStoreSelection = buildMusicFoldersSelection(musicFolderCursor); mediaStoreCursor = MediaStoreAccessHelper.getAllSongsWithSelection(mContext, mMediaStoreSelection, projection, sortOrder); musicFolderCursor.close(); } return mediaStoreCursor; } /*** * */ private String buildMusicFoldersSelection(Cursor musicFoldersCursor){ String mediaStoreSelection = MediaStore.Audio.Media.IS_MUSIC+ "!=0 AND ("; int folderPathColIndex = musicFoldersCursor.getColumnIndex(DBAccessHelper.FOLDER_PATH); int includeColIndex = musicFoldersCursor.getColumnIndex(DBAccessHelper.INCLUDE); for(int i =0; i<musicFoldersCursor.getCount(); i++){ musicFoldersCursor.moveToPosition(i); boolean include = musicFoldersCursor.getInt(includeColIndex) > 0; String likeClause; if(include) likeClause = " LIKE"; else likeClause = " NOT LIKE"; if(i != 0 && !include) mediaStoreSelection +=" AND "; else if (i!=0 && include ) mediaStoreSelection += " OR "; mediaStoreSelection += MediaStore.Audio.Media.DATA + likeClause + "'%" + musicFoldersCursor.getString(folderPathColIndex) +"/%'"; } mediaStoreSelection +=")"; Log.i(TAG, "mediaStoreSelection is :" + mediaStoreSelection); return mediaStoreSelection; } /** * Builds a HashMap of all songs and their genres. */ private void buildArtistsLibrary(){ Cursor artistsCursor = mContext.getContentResolver().query(MediaStore.Audio.Artists.EXTERNAL_CONTENT_URI, new String[]{MediaStore.Audio.Artists.ARTIST, MediaStore.Audio.Artists.NUMBER_OF_ALBUMS}, null, null, null); if(artistsCursor == null){ return; } for(int i= 0; i< artistsCursor.getCount(); i++){ artistsCursor.moveToPosition(i); mAlbumsCountMap.put(artistsCursor.getString(0), artistsCursor .getInt(1)); } artistsCursor.close(); } private void buildAlbumsLibrary(){ Cursor albumsCursor = mContext. getContentResolver().query(MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI, new String[]{MediaStore.Audio.Albums.ALBUM, MediaStore.Audio.Albums.ARTIST, MediaStore.Audio.Albums.NUMBER_OF_SONGS}, null, null, null); if(albumsCursor == null){ return; } for(int i=0; i < albumsCursor.getCount(); i++){ albumsCursor.moveToPosition(i); mSongsCountMap.put(albumsCursor.getString(0)+albumsCursor.getString(1), albumsCursor.getInt(2)); } albumsCursor.close(); } private void buildMediaStoreAlbumArtHash(){ Cursor albumsCursor = mContext.getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, new String[]{MediaStore.Audio.Media.ALBUM_ID}, MediaStore.Audio.Media.IS_ALARM+"=1", null, null); final Uri ART_CONTENT_URI = Uri.parse("content://media/external/audio/albumart"); if(albumsCursor == null){ return; } for (int i = 0; i< albumsCursor.getCount(); i++){ albumsCursor.moveToPosition(i); Uri albumArtUri = ContentUris.withAppendedId(ART_CONTENT_URI, albumsCursor.getLong(0)); mMediaStoreAlbumArtMap.put(albumsCursor.getString(0), albumArtUri); } albumsCursor.close(); } /** * Convert millisseconds to hh:mm:ss format. * * @param milliseconds The input time in milliseconds to format. * @return The formatted time string. */ private String convertMillisToMinsSecs(long milliseconds) { int secondsValue = (int) (milliseconds / 1000) % 60; int minutesValue = (int) ((milliseconds / (1000*60)) % 60); int hoursValue = (int) ((milliseconds / (1000*60*60)) % 24); String seconds = ""; String minutes = ""; String hours = ""; if (secondsValue < 10) { seconds = "0" + secondsValue; } else { seconds = "" + secondsValue; } minutes = "" + minutesValue; hours = "" + hoursValue; String output = ""; if (hoursValue!=0) { minutes = "0" + minutesValue; hours = "" + hoursValue; output = hours + ":" + minutes + ":" + seconds; } else { minutes = "" + minutesValue; hours = "" + hoursValue; output = minutes + ":" + seconds; } return output; }}
这个类很大,但做的事情却不多,就是将文件夹中的音乐文件从AudioStore里面读取信息,这里面有ContentProvider来提供。
0 0
- JamesMusic浅读--------6,补全欢迎界面,音乐文件数据库
- JamesMusic浅读--------3,欢迎界面。
- JamesMusic浅读--------8,音乐文件播放
- JamesMusic浅读--------4,文件选择系统界面
- JamesMusic浅读--------7,音乐列表界面显示
- JamesMusic浅读--------2,ListViewCardsAdapter和数据库初显
- JamesMusic浅读--------5,文件选择系统的数据库绑定
- JamesMusic浅读--------9,播放界面初显及播放类完善
- JamesMusic浅读--------1,先显示playlist
- App开发 打包 签名 申请 应用市场 欢迎补全
- mysql命令行自动补全数据库,表,字段名称
- 纯javascript 自动补全,不涉及数据库
- jquery autocomplete实现读取sql数据库自动补全TextBox
- AJAX autocomplete 动态补全从数据库加载数据
- Android应用欢迎界面动态效果设置(补间动画)
- 自动补全和菜单补全
- Terminal方向键不可用,tab无法补全命令,且界面无颜色
- 使用Android获取的音乐文件数据库
- uva 10286 Trouble with a Pentagon
- python中if __name__ == '__main__': 的解析
- 编程练习3 1010
- hdoj2099整除的尾数(数学)
- 实习记录(一)
- JamesMusic浅读--------6,补全欢迎界面,音乐文件数据库
- hibernate+struts2学生信息管理系统简单整合
- java线程操作 sleep wait start wait 等
- poj1163The Triangle(DP)
- hdu2005第几天?
- JAVA 继承、方法重写、多态学习笔记
- 新闻发布网页-1
- 天梯匹配系统 - 简单实现
- S6720 核心交换配置实战