Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android 音樂播放器中顯示歌曲的信息 m

Android 音樂播放器中顯示歌曲的信息 m

編輯:關於Android編程

  首先,從database中獲取歌曲的信息. 然後,應用SimpleAdapter 在ListActivity中顯示這些信息。   在TrackBrowserActivity中長按一首歌曲,從ContextMenu中選擇METADATA_INFO,就會啟動MusicMetadataActivity,該Activity會顯示歌曲的信息。   具體步驟如下: 1, 在packages\apps\Music\AndroidManifest.xml中添加MusicMetadataActivity:         <activity android:name="com.android.music.MusicMetadataActivity" android:exported="false"             android:theme="@android:style/Theme.Holo"             android:configChanges="orientation|screenSize" />   2, 在packages\apps\Music\res\layout\中新建布局文件music_metadata.xml : <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"     android:layout_width="fill_parent"     android:layout_height="fill_parent"     android:orientation="vertical" >       <ListView         android:id="@android:id/list"         android:layout_width="match_parent"         android:layout_height="match_parent"         android:drawSelectorOnTop="false"         android:fastScrollEnabled="true"         android:scrollbars="none"/>         <TextView android:id="@+id/metadata_name"         android:layout_width="wrap_content"         android:layout_height="wrap_content"         android:textSize="22dip"         android:textStyle="bold"         android:paddingLeft="6dip"         android:paddingTop="3dip"         android:paddingBottom="1dip"         android:gravity="center_vertical"/>         <TextView android:id="@+id/metadata_content"         android:layout_width="wrap_content"         android:layout_height="wrap_content"         android:textSize="18dip"         android:textColor="@color/metadata_content"         android:paddingLeft="6dip"         android:paddingTop="1dip"         android:paddingBottom="1dip"         android:gravity="bottom"/>   </LinearLayout>   3, 在packages\apps\Music\res\values\colors.xml中添加顏色信息: <color name="metadata_content">#FF808080</color>   4, 在packages\apps\Music\res\values\mtk_strings.xml添加字串,並在各語言中添加對應的字串:     <string name="music_metadata_info">Music Info</string>     <string name="music_metadata_artist">Artist</string>     <string name="music_metadata_tile">Title</string>     <string name="music_metadata_album">Album</string>     <string name="music_metadata_duration">Duration</string>     <string name="music_metadata_genre">Genre</string>     <string name="music_metadata_recording_date">Recording Date</string>     <string name="music_metadata_number">Number</string>     <string name="music_metadata_format">Format</string>     <string name="music_metadata_size">Size</string>     <string name="music_metadata_emplacement">Emplacement</string>     <string name="music_metadata_info_unknown">Unknown</string>   5, 在packages\apps\Music\src\com\android\music\中創建MusicMetadataActivity.java: package com.android.music;   import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map;   import android.app.ActionBar; import android.app.ListActivity; import android.content.ContentUris; import android.content.Intent; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.provider.MediaStore; import android.view.MenuItem; import android.widget.SimpleAdapter;   public class MusicMetadataActivity extends ListActivity{        private static final String TAG = "MusicMetadata";          private static final String METADATA_NAME = "metadataName";        private static final String METADATA_CONTENT = "metadataContent";        private List<Map<String, String>> mListItems = new ArrayList<Map<String, String>>();        private String mSelectedId;        private Cursor mCursor;               //Column Index        private int mTitleIdx;        private int mArtistIdx;        private int mAlbumIdx;        private int mDurationIdx;        private int mGenreIdx;        private int mYearIdx;        private int mTrackNoIdx;        private int mMimeTypeIdx;        private int mSizeIdx;        private int mEmplacementIdx;          //meta data        private String mTitle;        private String mArtist;        private String mAlbum;        private String mDuration;        private String mGenre;        private String mYear;        private String mTrackNo;        private String mMimeType;        private String mSize;        private String mEmplacement;               public MusicMetadataActivity()     {     }       @Override     public void onCreate(Bundle icicle) {           MusicLogUtils.d(TAG, "onCreate");         super.onCreate(icicle);                 Intent intent = getIntent();         if (intent != null) {             mSelectedId = intent.getStringExtra("selected_id");         }               MusicLogUtils.d(TAG, "onCreate: selectedId = " + mSelectedId);                             ActionBar actionBar = getActionBar();         actionBar.setDisplayHomeAsUpEnabled(true);         actionBar.setHomeButtonEnabled(true);                       setContentView(R.layout.music_metadata);                 //cursor column               String[] cursorCols = new String[] {                      MediaStore.Audio.Media._ID,                MediaStore.Audio.Media.TITLE,                MediaStore.Audio.Media.ARTIST,                MediaStore.Audio.Media.ALBUM,                MediaStore.Audio.Media.DURATION,                MediaStore.Audio.Media.YEAR,                MediaStore.Audio.Media.TRACK,                MediaStore.Audio.Media.MIME_TYPE,                MediaStore.Audio.Media.SIZE,                MediaStore.Audio.Media.DATA            };                 Uri uri = ContentUris.withAppendedId(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, Long.valueOf(mSelectedId));               Cursor mCursor = MusicUtils.query(this, uri, cursorCols, null, null, null);                 getColumnIndicesFromDB(mCursor);               getMetadataFromDB(mCursor);               getGenre();                 getAdapterData();               setTitle(mTitle);         initAdapter();     }          @Override     public void onDestroy() {           MusicLogUtils.d(TAG, "onDestroy");           if(mCursor != null){                      mCursor.close();                      mCursor = null;               }           super.onDestroy();     }          @Override     public boolean onOptionsItemSelected(MenuItem item) {         switch (item.getItemId()) {             case android.R.id.home:                 /// M: Navigation button press back                 MusicLogUtils.d(TAG, "onOptionsItemSelected: Navigation button press back");                 finish();                 return true;               default:                 break;         }         return super.onOptionsItemSelected(item);     }          private void getColumnIndicesFromDB(Cursor cursor) {               MusicLogUtils.d(TAG, "getColumnIndices: cursor = " + cursor);               if(cursor != null){                      if(cursor.moveToFirst() && cursor.getCount() > 0){                             mTitleIdx = cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE);                             MusicLogUtils.d(TAG, "getColumnIndices: mTitleIdx = " + mTitleIdx);                             mArtistIdx = cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST);                             MusicLogUtils.d(TAG, "getColumnIndices: mArtistIdx = " + mArtistIdx);                             mAlbumIdx = cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM);                             MusicLogUtils.d(TAG, "getColumnIndices: mAlbumIdx = " + mAlbumIdx);                             mDurationIdx = cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DURATION);                             MusicLogUtils.d(TAG, "getColumnIndices: mDurationIdx = " + mDurationIdx);                             mYearIdx = cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.YEAR);                             MusicLogUtils.d(TAG, "getColumnIndices: mYearIdx = " + mYearIdx);                             mTrackNoIdx = cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.TRACK);                             MusicLogUtils.d(TAG, "getColumnIndices: mTrackNoIdx = " + mTrackNoIdx);                             mMimeTypeIdx = cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.MIME_TYPE);                             MusicLogUtils.d(TAG, "getColumnIndices: mMimeTypeIdx = " + mMimeTypeIdx);                             mSizeIdx = cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.SIZE);                             MusicLogUtils.d(TAG, "getColumnIndices: mSizeIdx = " + mSizeIdx);                             mEmplacementIdx = cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA);                             MusicLogUtils.d(TAG, "getColumnIndices: mEmplacementIdx = " + mEmplacementIdx);                      }               }        }          private void getMetadataFromDB(Cursor cursor) {               MusicLogUtils.d(TAG, "getMetadataFromDB: cursor = " + cursor);               if(cursor != null){                      if(cursor.moveToFirst() && cursor.getCount() > 0){                             mTitle = cursor.getString(mTitleIdx);                             MusicLogUtils.d(TAG, "getColumnIndices: mTitle = " + mTitle);                                                         String artist = cursor.getString(mArtistIdx);                             MusicLogUtils.d(TAG, "getColumnIndices: artist = " + artist);                             if(MediaStore.UNKNOWN_STRING.equals(artist)){                                    artist = getString(R.string.unknown_artist_name);                                    MusicLogUtils.d(TAG, "getColumnIndices: artist = " + artist);                             }                             mArtist = artist;                                                         String album = cursor.getString(mAlbumIdx);                             MusicLogUtils.d(TAG, "getColumnIndices: album = " + album);                             if(MediaStore.UNKNOWN_STRING.equals(album)){                                    album = getString(R.string.unknown_album_name);                                    MusicLogUtils.d(TAG, "getColumnIndices: album = " + album);                             }                             mAlbum = album;                                                         long duration = cursor.getLong(mDurationIdx);                             final int secondToMs = 1000;                             MusicLogUtils.d(TAG, "getColumnIndices: duration = " + duration);                             mDuration = MusicUtils.makeTimeString(this, duration / secondToMs);                                                         int year = cursor.getInt(mYearIdx);                             MusicLogUtils.d(TAG, "getColumnIndices: year = " + year);                             if(year == 0){                                    mYear = getString(R.string.music_metadata_info_unknown);                             }else{                                    mYear = String.valueOf(year);                             }                             MusicLogUtils.d(TAG, "getColumnIndices: mYear = " + mYear);                               int trackNo = cursor.getInt(mTrackNoIdx);                             MusicLogUtils.d(TAG, "getColumnIndices: trackNo = " + trackNo);                             mTrackNo = String.valueOf(trackNo);                                                         mMimeType = cursor.getString(mMimeTypeIdx);                             MusicLogUtils.d(TAG, "getColumnIndices: mMimeType = " + mMimeType);                                                         long size = cursor.getLong(mSizeIdx);                             MusicLogUtils.d(TAG, "getColumnIndices: size = " + size);                             mSize = MusicUtils.makeSizeString(size);                             MusicLogUtils.d(TAG, "getColumnIndices: mSize = " + mSize);                                                         mEmplacement = cursor.getString(mEmplacementIdx);                             MusicLogUtils.d(TAG, "getColumnIndices: mEmplacement = " + mEmplacement);                      }               }        }          private void getGenre(){               MusicLogUtils.d(TAG, "getGenre");               String[] cursorGenreCols = new String[]{                      MediaStore.Audio.Genres._ID,                      MediaStore.Audio.Genres.NAME               };                             Uri uri = MediaStore.Audio.Genres.getContentUriForAudioId("external", Integer.valueOf(mSelectedId));               MusicLogUtils.d(TAG, "getGenre: uri = " + uri);                 String genre = null;               Cursor genreCursor = MusicUtils.query(this, uri, cursorGenreCols, null, null, null);               MusicLogUtils.d(TAG, "getGenre: genreCursor = " + genreCursor);                 if(genreCursor != null){                      if(genreCursor.moveToFirst() && genreCursor.getCount() > 0){                             int genreIdx = genreCursor.getColumnIndexOrThrow(MediaStore.Audio.Genres.NAME);                             MusicLogUtils.d(TAG, "getGenre: nameIdx = " + genreIdx);                             genre = genreCursor.getString(genreIdx);                             MusicLogUtils.d(TAG, "getGenre: genre = " + genre);                      }                      genreCursor.close();                      genreCursor = null;               }               MusicLogUtils.d(TAG, "getGenre: genreCursor");               if(genre == null){                      mGenre = getString(R.string.music_metadata_info_unknown);               }else{                      mGenre = genre;               }               MusicLogUtils.d(TAG, "getGenre: mGenre = " + mGenre);        }          private void getAdapterData(){               MusicLogUtils.d(TAG, "getAdapterData");                 //metadata name string id               int[] metadataName = new int[]{                      R.string.music_metadata_tile,                      R.string.music_metadata_artist,                      R.string.music_metadata_album,                      R.string.music_metadata_duration,                      R.string.music_metadata_genre,                      R.string.music_metadata_recording_date,                      R.string.music_metadata_number,                      R.string.music_metadata_format,                      R.string.music_metadata_size,                      R.string.music_metadata_emplacement               };                             //metadata content string               String[] metadataContent = new String[]{                      mTitle,                      mArtist,                      mAlbum,                      mDuration,                      mGenre,                      mYear,                      mTrackNo,                      mMimeType,                      mSize,                      mEmplacement               };                 for(int i = 0; i < metadataName.length; i++){              Map<String, String> listItem = new HashMap<String, String>();              listItem.put(METADATA_NAME, getString(metadataName[i]));              listItem.put(METADATA_CONTENT, metadataContent[i]);              mListItems.add(listItem);         }        }          private void initAdapter(){               MusicLogUtils.d(TAG, "initAdapter");               String[] from = new String[]{METADATA_NAME, METADATA_CONTENT};               int[] to = new int[]{R.id.metadata_name, R.id.metadata_content};               SimpleAdapter simpleAdapter = new SimpleAdapter(this, mListItems, R.layout.music_metadata, from, to);                      setListAdapter(simpleAdapter);        } }   6, 在packages\apps\Music\src\com\android\music\ MusicUtils.java中添加轉換時間格式的方法:     public static final String UNIT_B = "B";     public static final String UNIT_KB = "KB";     public static final String UNIT_MB = "MB";     public static final String UNIT_GB = "GB";     public static final String UNIT_TB = "TB";     private static final int UNIT_INTERVAL = 1024;     private static final double ROUNDING_OFF = 0.005;     private static final int DECIMAL_NUMBER = 100;               /**      * This method converts a size to a string      *      * @param size the size of a file      * @return the string represents the size      */     public static String makeSizeString(long size) {         String unit = UNIT_B;         if (size < DECIMAL_NUMBER) {             MusicLogUtils.d(TAG, "makeSizeString(),size = " + size);             return Long.toString(size) + " " + unit;         }                 unit = UNIT_KB;         double sizeDouble = (double) size / (double) UNIT_INTERVAL;         if (sizeDouble > UNIT_INTERVAL) {             sizeDouble = (double) sizeDouble / (double) UNIT_INTERVAL;             unit = UNIT_MB;         }         if (sizeDouble > UNIT_INTERVAL) {             sizeDouble = (double) sizeDouble / (double) UNIT_INTERVAL;             unit = UNIT_GB;         }         if (sizeDouble > UNIT_INTERVAL) {             sizeDouble = (double) sizeDouble / (double) UNIT_INTERVAL;             unit = UNIT_TB;         }           // Add 0.005 for rounding-off.         long sizeInt = (long) ((sizeDouble + ROUNDING_OFF) * DECIMAL_NUMBER); // strict to two         // decimal places         double formatedSize = ((double) sizeInt) / DECIMAL_NUMBER;         MusicLogUtils.d(TAG, "makeSizeString(): " + formatedSize + unit);           if (formatedSize == 0) {             return "0" + " " + unit;         } else {             return Double.toString(formatedSize) + " " + unit;         }     }   7, 在packages\apps\Music\src\com\android\music\ TrackBrowserActivity.java中添加啟動MusicMetadataActivity的入口: a, 定義啟動MusicMetadataActivity的menu item:        private static final int METADATA_INFO = CHILD_MENU_BASE + 10;   b, 在onCreateContextMenu()中添加該menu item:               menu.add(0, METADATA_INFO, 0, R.string.music_metadata_info);   c, 在onContextItemSelected()執行啟動MusicMetadataActivity的操作:                      case METADATA_INFO:                 Intent intent = new Intent();                             intent.setClass(this, MusicMetadataActivity.class);                             intent.putExtra("selected_id", String.valueOf(mSelectedId));                             MusicLogUtils.d(TAG, "METADATA_INFO: mSelectedPosition = " + mSelectedPosition);                             MusicLogUtils.d(TAG, "METADATA_INFO: mSelectedId = " + mSelectedId);                 startActivityForResult(intent, -1);                 return true;     首先,從database中獲取歌曲的信息. 然後,應用SimpleAdapter 在ListActivity中顯示這些信息。   在TrackBrowserActivity中長按一首歌曲,從ContextMenu中選擇METADATA_INFO,就會啟動MusicMetadataActivity,該Activity會顯示歌曲的信息。   具體步驟如下: 1, 在packages\apps\Music\AndroidManifest.xml中添加MusicMetadataActivity:         <activity android:name="com.android.music.MusicMetadataActivity" android:exported="false"             android:theme="@android:style/Theme.Holo"             android:configChanges="orientation|screenSize" />   2, 在packages\apps\Music\res\layout\中新建布局文件music_metadata.xml : <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"     android:layout_width="fill_parent"     android:layout_height="fill_parent"     android:orientation="vertical" >       <ListView         android:id="@android:id/list"         android:layout_width="match_parent"         android:layout_height="match_parent"         android:drawSelectorOnTop="false"         android:fastScrollEnabled="true"         android:scrollbars="none"/>         <TextView android:id="@+id/metadata_name"         android:layout_width="wrap_content"         android:layout_height="wrap_content"         android:textSize="22dip"         android:textStyle="bold"         android:paddingLeft="6dip"         android:paddingTop="3dip"         android:paddingBottom="1dip"         android:gravity="center_vertical"/>         <TextView android:id="@+id/metadata_content"         android:layout_width="wrap_content"         android:layout_height="wrap_content"         android:textSize="18dip"         android:textColor="@color/metadata_content"         android:paddingLeft="6dip"         android:paddingTop="1dip"         android:paddingBottom="1dip"         android:gravity="bottom"/>   </LinearLayout>   3, 在packages\apps\Music\res\values\colors.xml中添加顏色信息: <color name="metadata_content">#FF808080</color>   4, 在packages\apps\Music\res\values\mtk_strings.xml添加字串,並在各語言中添加對應的字串:     <string name="music_metadata_info">Music Info</string>     <string name="music_metadata_artist">Artist</string>     <string name="music_metadata_tile">Title</string>     <string name="music_metadata_album">Album</string>     <string name="music_metadata_duration">Duration</string>     <string name="music_metadata_genre">Genre</string>     <string name="music_metadata_recording_date">Recording Date</string>     <string name="music_metadata_number">Number</string>     <string name="music_metadata_format">Format</string>     <string name="music_metadata_size">Size</string>     <string name="music_metadata_emplacement">Emplacement</string>     <string name="music_metadata_info_unknown">Unknown</string>   5, 在packages\apps\Music\src\com\android\music\中創建MusicMetadataActivity.java: package com.android.music;   import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map;   import android.app.ActionBar; import android.app.ListActivity; import android.content.ContentUris; import android.content.Intent; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.provider.MediaStore; import android.view.MenuItem; import android.widget.SimpleAdapter;   public class MusicMetadataActivity extends ListActivity{        private static final String TAG = "MusicMetadata";          private static final String METADATA_NAME = "metadataName";        private static final String METADATA_CONTENT = "metadataContent";        private List<Map<String, String>> mListItems = new ArrayList<Map<String, String>>();        private String mSelectedId;        private Cursor mCursor;               //Column Index        private int mTitleIdx;        private int mArtistIdx;        private int mAlbumIdx;        private int mDurationIdx;        private int mGenreIdx;        private int mYearIdx;        private int mTrackNoIdx;        private int mMimeTypeIdx;        private int mSizeIdx;        private int mEmplacementIdx;          //meta data        private String mTitle;        private String mArtist;        private String mAlbum;        private String mDuration;        private String mGenre;        private String mYear;        private String mTrackNo;        private String mMimeType;        private String mSize;        private String mEmplacement;               public MusicMetadataActivity()     {     }       @Override     public void onCreate(Bundle icicle) {           MusicLogUtils.d(TAG, "onCreate");         super.onCreate(icicle);                 Intent intent = getIntent();         if (intent != null) {             mSelectedId = intent.getStringExtra("selected_id");         }               MusicLogUtils.d(TAG, "onCreate: selectedId = " + mSelectedId);                             ActionBar actionBar = getActionBar();         actionBar.setDisplayHomeAsUpEnabled(true);         actionBar.setHomeButtonEnabled(true);                       setContentView(R.layout.music_metadata);                 //cursor column               String[] cursorCols = new String[] {                      MediaStore.Audio.Media._ID,                MediaStore.Audio.Media.TITLE,                MediaStore.Audio.Media.ARTIST,                MediaStore.Audio.Media.ALBUM,                MediaStore.Audio.Media.DURATION,                MediaStore.Audio.Media.YEAR,                MediaStore.Audio.Media.TRACK,                MediaStore.Audio.Media.MIME_TYPE,                MediaStore.Audio.Media.SIZE,                MediaStore.Audio.Media.DATA            };                 Uri uri = ContentUris.withAppendedId(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, Long.valueOf(mSelectedId));               Cursor mCursor = MusicUtils.query(this, uri, cursorCols, null, null, null);                 getColumnIndicesFromDB(mCursor);               getMetadataFromDB(mCursor);               getGenre();                 getAdapterData();               setTitle(mTitle);         initAdapter();     }          @Override     public void onDestroy() {           MusicLogUtils.d(TAG, "onDestroy");           if(mCursor != null){                      mCursor.close();                      mCursor = null;               }           super.onDestroy();     }          @Override     public boolean onOptionsItemSelected(MenuItem item) {         switch (item.getItemId()) {             case android.R.id.home:                 /// M: Navigation button press back                 MusicLogUtils.d(TAG, "onOptionsItemSelected: Navigation button press back");                 finish();                 return true;               default:                 break;         }         return super.onOptionsItemSelected(item);     }          private void getColumnIndicesFromDB(Cursor cursor) {               MusicLogUtils.d(TAG, "getColumnIndices: cursor = " + cursor);               if(cursor != null){                      if(cursor.moveToFirst() && cursor.getCount() > 0){                             mTitleIdx = cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE);                             MusicLogUtils.d(TAG, "getColumnIndices: mTitleIdx = " + mTitleIdx);                             mArtistIdx = cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST);                             MusicLogUtils.d(TAG, "getColumnIndices: mArtistIdx = " + mArtistIdx);                             mAlbumIdx = cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM);                             MusicLogUtils.d(TAG, "getColumnIndices: mAlbumIdx = " + mAlbumIdx);                             mDurationIdx = cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DURATION);                             MusicLogUtils.d(TAG, "getColumnIndices: mDurationIdx = " + mDurationIdx);                             mYearIdx = cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.YEAR);                             MusicLogUtils.d(TAG, "getColumnIndices: mYearIdx = " + mYearIdx);                             mTrackNoIdx = cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.TRACK);                             MusicLogUtils.d(TAG, "getColumnIndices: mTrackNoIdx = " + mTrackNoIdx);                             mMimeTypeIdx = cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.MIME_TYPE);                             MusicLogUtils.d(TAG, "getColumnIndices: mMimeTypeIdx = " + mMimeTypeIdx);                             mSizeIdx = cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.SIZE);                             MusicLogUtils.d(TAG, "getColumnIndices: mSizeIdx = " + mSizeIdx);                             mEmplacementIdx = cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA);                             MusicLogUtils.d(TAG, "getColumnIndices: mEmplacementIdx = " + mEmplacementIdx);                      }               }        }          private void getMetadataFromDB(Cursor cursor) {               MusicLogUtils.d(TAG, "getMetadataFromDB: cursor = " + cursor);               if(cursor != null){                      if(cursor.moveToFirst() && cursor.getCount() > 0){                             mTitle = cursor.getString(mTitleIdx);                             MusicLogUtils.d(TAG, "getColumnIndices: mTitle = " + mTitle);                                                         String artist = cursor.getString(mArtistIdx);                             MusicLogUtils.d(TAG, "getColumnIndices: artist = " + artist);                             if(MediaStore.UNKNOWN_STRING.equals(artist)){                                    artist = getString(R.string.unknown_artist_name);                                    MusicLogUtils.d(TAG, "getColumnIndices: artist = " + artist);                             }                             mArtist = artist;                                                         String album = cursor.getString(mAlbumIdx);                             MusicLogUtils.d(TAG, "getColumnIndices: album = " + album);                             if(MediaStore.UNKNOWN_STRING.equals(album)){                                    album = getString(R.string.unknown_album_name);                                    MusicLogUtils.d(TAG, "getColumnIndices: album = " + album);                             }                             mAlbum = album;                                                         long duration = cursor.getLong(mDurationIdx);                             final int secondToMs = 1000;                             MusicLogUtils.d(TAG, "getColumnIndices: duration = " + duration);                             mDuration = MusicUtils.makeTimeString(this, duration / secondToMs);                                                         int year = cursor.getInt(mYearIdx);                             MusicLogUtils.d(TAG, "getColumnIndices: year = " + year);                             if(year == 0){                                    mYear = getString(R.string.music_metadata_info_unknown);                             }else{                                    mYear = String.valueOf(year);                             }                             MusicLogUtils.d(TAG, "getColumnIndices: mYear = " + mYear);                               int trackNo = cursor.getInt(mTrackNoIdx);                             MusicLogUtils.d(TAG, "getColumnIndices: trackNo = " + trackNo);                             mTrackNo = String.valueOf(trackNo);                                                         mMimeType = cursor.getString(mMimeTypeIdx);                             MusicLogUtils.d(TAG, "getColumnIndices: mMimeType = " + mMimeType);                                                         long size = cursor.getLong(mSizeIdx);                             MusicLogUtils.d(TAG, "getColumnIndices: size = " + size);                             mSize = MusicUtils.makeSizeString(size);                             MusicLogUtils.d(TAG, "getColumnIndices: mSize = " + mSize);                                                         mEmplacement = cursor.getString(mEmplacementIdx);                             MusicLogUtils.d(TAG, "getColumnIndices: mEmplacement = " + mEmplacement);                      }               }        }          private void getGenre(){               MusicLogUtils.d(TAG, "getGenre");               String[] cursorGenreCols = new String[]{                      MediaStore.Audio.Genres._ID,                      MediaStore.Audio.Genres.NAME               };                             Uri uri = MediaStore.Audio.Genres.getContentUriForAudioId("external", Integer.valueOf(mSelectedId));               MusicLogUtils.d(TAG, "getGenre: uri = " + uri);                 String genre = null;               Cursor genreCursor = MusicUtils.query(this, uri, cursorGenreCols, null, null, null);               MusicLogUtils.d(TAG, "getGenre: genreCursor = " + genreCursor);                 if(genreCursor != null){                      if(genreCursor.moveToFirst() && genreCursor.getCount() > 0){                             int genreIdx = genreCursor.getColumnIndexOrThrow(MediaStore.Audio.Genres.NAME);                             MusicLogUtils.d(TAG, "getGenre: nameIdx = " + genreIdx);                             genre = genreCursor.getString(genreIdx);                             MusicLogUtils.d(TAG, "getGenre: genre = " + genre);                      }                      genreCursor.close();                      genreCursor = null;               }               MusicLogUtils.d(TAG, "getGenre: genreCursor");               if(genre == null){                      mGenre = getString(R.string.music_metadata_info_unknown);               }else{                      mGenre = genre;               }               MusicLogUtils.d(TAG, "getGenre: mGenre = " + mGenre);        }          private void getAdapterData(){               MusicLogUtils.d(TAG, "getAdapterData");                 //metadata name string id               int[] metadataName = new int[]{                      R.string.music_metadata_tile,                      R.string.music_metadata_artist,                      R.string.music_metadata_album,                      R.string.music_metadata_duration,                      R.string.music_metadata_genre,                      R.string.music_metadata_recording_date,                      R.string.music_metadata_number,                      R.string.music_metadata_format,                      R.string.music_metadata_size,                      R.string.music_metadata_emplacement               };                             //metadata content string               String[] metadataContent = new String[]{                      mTitle,                      mArtist,                      mAlbum,                      mDuration,                      mGenre,                      mYear,                      mTrackNo,                      mMimeType,                      mSize,                      mEmplacement               };                 for(int i = 0; i < metadataName.length; i++){              Map<String, String> listItem = new HashMap<String, String>();              listItem.put(METADATA_NAME, getString(metadataName[i]));              listItem.put(METADATA_CONTENT, metadataContent[i]);              mListItems.add(listItem);         }        }          private void initAdapter(){               MusicLogUtils.d(TAG, "initAdapter");               String[] from = new String[]{METADATA_NAME, METADATA_CONTENT};               int[] to = new int[]{R.id.metadata_name, R.id.metadata_content};               SimpleAdapter simpleAdapter = new SimpleAdapter(this, mListItems, R.layout.music_metadata, from, to);                      setListAdapter(simpleAdapter);        } }   6, 在packages\apps\Music\src\com\android\music\ MusicUtils.java中添加轉換時間格式的方法:     public static final String UNIT_B = "B";     public static final String UNIT_KB = "KB";     public static final String UNIT_MB = "MB";     public static final String UNIT_GB = "GB";     public static final String UNIT_TB = "TB";     private static final int UNIT_INTERVAL = 1024;     private static final double ROUNDING_OFF = 0.005;     private static final int DECIMAL_NUMBER = 100;               /**      * This method converts a size to a string      *      * @param size the size of a file      * @return the string represents the size      */     public static String makeSizeString(long size) {         String unit = UNIT_B;         if (size < DECIMAL_NUMBER) {             MusicLogUtils.d(TAG, "makeSizeString(),size = " + size);             return Long.toString(size) + " " + unit;         }                 unit = UNIT_KB;         double sizeDouble = (double) size / (double) UNIT_INTERVAL;         if (sizeDouble > UNIT_INTERVAL) {             sizeDouble = (double) sizeDouble / (double) UNIT_INTERVAL;             unit = UNIT_MB;         }         if (sizeDouble > UNIT_INTERVAL) {             sizeDouble = (double) sizeDouble / (double) UNIT_INTERVAL;             unit = UNIT_GB;         }         if (sizeDouble > UNIT_INTERVAL) {             sizeDouble = (double) sizeDouble / (double) UNIT_INTERVAL;             unit = UNIT_TB;         }           // Add 0.005 for rounding-off.         long sizeInt = (long) ((sizeDouble + ROUNDING_OFF) * DECIMAL_NUMBER); // strict to two         // decimal places         double formatedSize = ((double) sizeInt) / DECIMAL_NUMBER;         MusicLogUtils.d(TAG, "makeSizeString(): " + formatedSize + unit);           if (formatedSize == 0) {             return "0" + " " + unit;         } else {             return Double.toString(formatedSize) + " " + unit;         }     }   7, 在packages\apps\Music\src\com\android\music\ TrackBrowserActivity.java中添加啟動MusicMetadataActivity的入口: a, 定義啟動MusicMetadataActivity的menu item:        private static final int METADATA_INFO = CHILD_MENU_BASE + 10;   b, 在onCreateContextMenu()中添加該menu item:               menu.add(0, METADATA_INFO, 0, R.string.music_metadata_info);   c, 在onContextItemSelected()執行啟動MusicMetadataActivity的操作:                      case METADATA_INFO:                 Intent intent = new Intent();                             intent.setClass(this, MusicMetadataActivity.class);                             intent.putExtra("selected_id", String.valueOf(mSelectedId));                             MusicLogUtils.d(TAG, "METADATA_INFO: mSelectedPosition = " + mSelectedPosition);                             MusicLogUtils.d(TAG, "METADATA_INFO: mSelectedId = " + mSelectedId);                 startActivityForResult(intent, -1);                 return true;  
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved