android一個很簡單很簡單的音樂播放器
這是一個亂七八糟的主介面
偷懶直接把所有操作都也在了MainActivity上面,主要是學習是怎麼執行的,之後滿滿完善吧。這裡的操作包括上下曲,播放暫停,隨機開關,列表跳轉播放。UI十分十分簡單。
public class MainActivity extends Activity implements OnClickListener { private MediaPlayer mediaPlayer; private MusicInfo musicInfo; private Button mButton, mPre, mPlay, mNext, mRandom; private SeekBar mSeekBar; private boolean Random = false; private TextView mName, mCurtime, mAllTime, mCount; private int location = 0; MusicAdapater adapater; Cursor mCursor; int musicCount; int curplaytime; String title; int id; private boolean isPause = true; Handler handler = new Handler() { }; Runnable runnable = new Runnable() { @Override public void run() { if (mediaPlayer != null) { title = musicInfo.getTitle(); mName.setText(title); if (title != null) { if (Random == false) { mRandom.setText(getResources().getString( R.string.randomon)); } else if (Random == true) { mRandom.setText(getResources().getString( R.string.randomoff)); } int time = new Long(musicInfo.getTime()).intValue(); mAllTime.setText(MusicAdapater.Format(musicInfo.getTime())); mSeekBar.setMax(time); mSeekBar.setProgress(mediaPlayer.getCurrentPosition()); mCurtime.setText(MusicAdapater.Format(mediaPlayer .getCurrentPosition())); mCount.setText(musicInfo.getId() + "/" + musicCount); } } handler.postDelayed(this, 1000); } }; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.i(TAG, "onCreate()"); requestWindowFeature(Window.FEATURE_NO_TITLE); initView(); musicCount = MusicList.getMusicInfos(this).size(); handler.postDelayed(runnable, 1000); } private void initView() { setContentView(R.layout.main_activity); mediaPlayer = new MediaPlayer(); //初始化MediaPlayer musicInfo = new MusicInfo(); // 自動播放下一首 mediaPlayer.setOnCompletionListener(new OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { // TODO Auto-generated method stub if (mediaPlayer != null) { if (Random) { //因為我定義的Random=false,即隨機關 location = location + 1; songplay(location); } else if (!Random) { //隨機開 location = getRandomNumber(); songplay(location); } } } }); mName = (TextView) findViewById(R.id.name); mButton = (Button) findViewById(R.id.btn_list); mPre = (Button) findViewById(R.id.pre); mPlay = (Button) findViewById(R.id.play); mNext = (Button) findViewById(R.id.next); mRandom = (Button) findViewById(R.id.btn_random); mSeekBar = (SeekBar) findViewById(R.id.time_seekbar); mSeekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { @Override public void onStopTrackingTouch(SeekBar seekBar) { // TODO Auto-generated method stub mediaPlayer.getCurrentPosition(); } @Override public void onStartTrackingTouch(SeekBar seekBar) { // TODO Auto-generated method stub } @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { // TODO Auto-generated method stub if (fromUser) { // 判斷是否為使用者自己操作 mediaPlayer.seekTo(progress); // 設定音樂進度 就是拖動進度條也就是所謂的快進,後退 } curplaytime = progress; //記錄當前播放時間 } }); mCurtime = (TextView) findViewById(R.id.tv_curtime); mAllTime = (TextView) findViewById(R.id.tv_alltime); mCount = (TextView) findViewById(R.id.music_count); mAllTime.setText("00:00"); mCurtime.setText("00:00"); mCount.setText("0/0"); mButton.setOnClickListener(this); mNext.setOnClickListener(this); mPre.setOnClickListener(this); mPlay.setOnClickListener(this); mRandom.setOnClickListener(this); } @Override public void onClick(View v) { // TODO Auto-generated method stub switch (v.getId()) { case R.id.btn_list: Intent intent = new Intent(MainActivity.this, MusicList.class); startActivityForResult(intent, 1); //因為要從MusicList返回一個值,所以要用startActivityForResult break; case R.id.pre: if (Random) { if (location > 0 && location <= musicCount - 1) { location = location - 1; songplay(location); } else if (location == 0) { songplay(musicCount - 1); location = musicCount - 1; } } else if (!Random) { location = getRandomNumber(); songplay(location); } break; case R.id.play: if (mediaPlayer != null && mediaPlayer.isPlaying()) { mediaPlayer.pause(); } else { if (curplaytime != 0) { //如果播放時間不為0,就繼續上次時間播放 songplay(location); mediaPlayer.seekTo(curplaytime); } else { songplay(location); } } break; case R.id.next: nextsong(); break; case R.id.btn_random: if (Random == false) { Random = true; } else if (Random == true) { Random = false; } default: break; } } private void nextsong() { if (Random) { if (location >= 0 && location < musicCount - 1) { location = location + 1; songplay(location); } else { songplay(0); location = 0; } } else if (!Random) { location = getRandomNumber(); songplay(location); } } public void onDestroy() { if (mediaPlayer.isPlaying()) { mediaPlayer.stop(); } mediaPlayer.release(); super.onDestroy(); } public void songplay(int location) { musicInfo = MusicList.getMusicInfos(getApplicationContext()).get( location); String url = musicInfo.getUrl(); try { mediaPlayer.reset(); mediaPlayer.setDataSource(url); mediaPlayer.prepare(); mediaPlayer.start(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } catch (IllegalStateException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } /** * 返回值從[0,musicCount] * * @return location */ public int getRandomNumber() { Random random = new Random(); int location = random.nextInt(musicCount); return location; } //接收從listview傳過來的id,由於id索引從1開始,而location索引從0開始,所以要減1. protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (1 == requestCode) { if (1 == resultCode) { Bundle bundle = data.getExtras(); id = bundle.getInt("id"); location = id - 1; songplay(location); } } super.onActivityResult(requestCode, resultCode, data); } protected void onRestart() { super.onRestart(); }
}
MusicInfo.java
public class MusicInfo { private int id; // 歌曲ID private String title; // 歌曲名稱 private String singer; // 歌手名稱 private long time; private String url; public MusicInfo(){} public MusicInfo(int id, String title, String singer, long time, String url){ super(); this.id=id; this.title = title; this.singer = singer; this.time = time; this.url = url; } public String getUrl(){ return url; } public void setUrl(String url) { this.url = url; } public int getId() { return id; } public void setId(int ld){ this.id=ld; } public String getTitle(){ return title; } public void setTitle(String title){ this.title = title; } public String getSinger(){ return singer; } public void setSinger(String singer){ this.singer = singer; } public Long getTime(){ return time; } public void setTime(long time){ this.time = time; }
}
一個不咋滴的介面卡
public class MusicAdapater extends BaseAdapter { private Context mContext; private List<MusicInfo> musicInfos; private MusicInfo musicInfo; int mPosition; public MusicAdapater(Context context,List<MusicInfo> musicInfos){ this.mContext = context; this.musicInfos = musicInfos; } public int getPosition(){ return mPosition; } public void setPosition(int mPosition){ this.mPosition = mPosition; } @Override public int getCount() { // 決定listview有多少個item return musicInfos.size(); } @Override public Object getItem(int position) { return position; } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub View view; ViewHolder holder; if (convertView == null) { holder = new ViewHolder(); convertView = LayoutInflater.from(mContext).inflate(R.layout.music_title, null); holder.title = (TextView)convertView.findViewById(R.id.music_title); holder.singer = (TextView)convertView.findViewById(R.id.music_singer); holder.time = (TextView)convertView.findViewById(R.id.music_time); convertView.setTag(holder); } else { holder = (ViewHolder)convertView.getTag(); } musicInfo =musicInfos.get(position); holder.title.setText(musicInfo.getTitle()); holder.singer.setText(musicInfo.getSinger()); holder.time.setText(Format(musicInfo.getTime())); return convertView; } class ViewHolder { public TextView title; //音樂名 public TextView singer; // 歌手名 public TextView time; //時間 } /** * 時間轉化 把音樂時間的long型資料轉化為“分:秒” * @param time * @return String hms */ public static String Format(long time) { SimpleDateFormat format = new SimpleDateFormat("mm:ss"); String hms = format.format(time); return hms; }
}
音樂列表介面
public class MusicList extends Activity {
private ListView mListView;
MusicInfo musicInfo;
MusicAdapater adapater;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.music_list_activity);
initView(this);
}
void initView(Context context) {
mListView = (ListView) findViewById(R.id.listview);
mListView.setOnItemClickListener(new MusicItemCLickListener());
musicInfo = new MusicInfo();
adapater = new MusicAdapater(context, getMusicInfos(context));
mListView.setAdapter(adapater);
}
public static List<MusicInfo> getMusicInfos(Context context) {
Cursor mCursor = context.getContentResolver().query(
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null,
MediaStore.Audio.Media.DEFAULT_SORT_ORDER);
List<MusicInfo> musicInfos = new ArrayList<MusicInfo>();
for (int i = 0; i < mCursor.getCount(); i++) {
MusicInfo musicInfo = new MusicInfo();
mCursor.moveToNext();
int id = i + 1; //這是自定義音樂id,從1開始,方便之後使用,有規律
// long id = mCursor.getLong(mCursor.getColumnIndex(MediaStore.Audio.Media._ID)); // 音樂id,好像無規律
String title = mCursor.getString((mCursor.getColumnIndex(MediaStore.Audio.Media.TITLE)));// 音樂標題
String artist = mCursor.getString(mCursor.getColumnIndex(MediaStore.Audio.Media.ARTIST));// 藝術家
long duration = mCursor.getLong(mCursor.getColumnIndex(MediaStore.Audio.Media.DURATION));// 時長
int isMusic = mCursor.getInt(mCursor.getColumnIndex(MediaStore.Audio.Media.IS_MUSIC));// 是否為音樂
String url = mCursor.getString(mCursor.getColumnIndex(MediaStore.Audio.Media.DATA)); //路徑
if (isMusic != 0) {
musicInfo.setId(id);
musicInfo.setTitle(title);
musicInfo.setSinger(artist);
musicInfo.setTime(duration);
musicInfo.setUrl(url);
musicInfos.add(musicInfo);
}
}
return musicInfos;
}
/*
* 這是listview item 的點選事件 點選後丟擲音樂id給MainActivity,在MainActivity中根據id來播放相應的音樂
*/
private class MusicItemCLickListener implements OnItemClickListener {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
// TODO Auto-generated method stub
if (getMusicInfos(getApplicationContext()) != null) {
MusicInfo musicInfo = getMusicInfos(getApplicationContext()).get(position);
int id2 = musicInfo.getId();
Intent intent = new Intent(MusicList.this, MainActivity.class);
Bundle bundle = new Bundle();
bundle.putInt("id", id2);
intent.putExtras(bundle);
setResult(1, intent);
MusicList.this.finish();
}
}
}
}
因為mediaplay是在MainActiviy中例項化的,為了防止MainActiviy活動重複建立,修改 AndroidManifest 當然記得加許可權##
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:launchMode="singleTask" //這個是防止重複建立棧頂活動的問題直接從返回棧中檢查是否存在該活動的例項,存在就直接使用,不存在就新建
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".MusicList"></activity>
</application>
下面是佈局檔案 main_activity.xml
佈局檔案就沒什麼好說的了。隨便扔了幾個控制元件在上面
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:textColor="@android:color/black"
android:textSize="24sp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center" >
<TextView
android:id="@+id/tv_curtime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@android:color/black"
android:textSize="24sp" />
<SeekBar
android:id="@+id/time_seekbar"
android:layout_width="600dp"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:maxHeight="10dp"
android:minWidth="10dp" />
<TextView
android:id="@+id/tv_alltime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@android:color/black"
android:textSize="24sp" />
</LinearLayout>
<TextView
android:id="@+id/music_count"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:textColor="@android:color/black"
android:textSize="24sp" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginTop="30dp"
android:gravity="center"
android:orientation="horizontal" >
<Button
android:id="@+id/btn_list"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/list"
android:textSize="32sp" />
<Button
android:id="@+id/pre"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/pre"
android:textSize="32sp" />
<Button
android:id="@+id/play"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/play"
android:textSize="32sp" />
<Button
android:id="@+id/next"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/next"
android:textSize="32sp" />
<Button
android:id="@+id/btn_random"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/randomon"
android:textSize="32sp" />
</LinearLayout>
第二個佈局檔案 music_list_activity.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<ListView
android:id="@+id/listview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:divider="#000" >
</ListView>
第三個佈局檔案music_title.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/music_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="24sp" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<TextView
android:id="@+id/music_singer"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="24sp" />
<TextView
android:id="@+id/music_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="24sp"
android:layout_marginLeft="20dp" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="20dp" >
</LinearLayout>
至於那些資源values就沒寫了
這是一個自動的跑馬燈自定義控制元件
有些欄位太長了TextView大小又有限怎麼辦?那就讓它自己動起來。
建立一個類繼承自TextView
public class MarqueeTextView extends TextView
{
public MarqueeTextView(Context context, AttributeSet attrs)
{
super(context, attrs);
}
@Override
protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) {
// TODO Auto-generated method stub
if(focused) super.onFocusChanged(focused, direction, previouslyFocusedRect);
}
@Override
public void onWindowFocusChanged(boolean hasWindowFocus)
{
// TODO Auto-generated method stub
if(hasWindowFocus) super.onWindowFocusChanged(hasWindowFocus);
}
@Override
public boolean isFocused()
{
return true;
}
}
然後是自定義控制元件的使用,記得給layout_width設定一個比較具體的大小,不然跑步起來哦
<com.android.auto.autohome.MarqueeTextView
android:id="@+id/music_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:ellipsize="marquee"
android:singleLine="true"
android:text="@string/unknow"
android:textColor="@color/white"
android:textSize="20sp" />
相關推薦
[HTML5]簡單網頁本地音樂播放器
既然HTML5提出與本地互動方便,就想寫個HTML5的本地音樂播放器。一開始問題主要集中在怎麼讀取本地檔案路徑,我想肯定可以用JS實現去操作本地檔案(因為node.js很容易實現讀取本地檔案,但是原生JS怎麼寫不太清楚),不過簡單一點就用<input typ
iOS 簡單實用的音樂播放器,少年,自己做個歌單吧。。。。。。
我也不知道為什麼突然會想寫一下音樂播放器的,感覺應該挺好的玩,自己把自己喜歡的歌曲匯出來,用程式載入跑起來,那歌聽起來必定很帶感啊。。。。。。不過那首Love Story被我聽了無數遍。。。。。。聽吐了
[Android]結合MediaPlayer和Service的音樂播放器
通過參照網上其他人的MP3播放器,自己也在這些基礎上小試牛刀,製作的了一個MP3的播放器,先上個介面先: 接下來就上程式碼: 首先是.mp3格式的音樂檔案的過濾類單獨在一個java檔案中: package com.example.mediaplayer; import
[報告和原始碼分享] 基於Android和SQLite資料庫的手機音樂播放器
本文就Android系統上一款音樂播放器應用程式的設計與實現進行討論。Android是一個開源的系統,它底層是基於Linux的作業系統,本論文的音樂播放器採用了Android開源系統技術,利用Java語言和Eclipse編輯工具對播放器進行編寫。同時給出了詳細的系統設計過程、部分介面圖及主要功能執行
Android第三次程式作業——音樂播放器
1、實現的功能 實現播放,暫停,播放上一首,下一首功能 顯示播放列表 可以播放3首歌曲 2、實現步驟 截圖: &nbs
1600802047 android 第三次作業(音樂播放器)
一、實現的功能 播放、暫停、上一首、下一首 顯示列表 二、UI介面截圖 第一首歌 第二首歌 第三首歌 第四首歌 list列表 點選播放音樂時圖片旋轉,點選上一首切換上一
用Python開發一個只屬於你的音樂播放器
前言 很多人都喜歡聽歌,如果你喜歡的人,用你開發的軟體聽著小情歌,心裡豈不是美滋滋。 Python爬取網易雲歌單音樂+Python開發音樂播放器,兩者結合那豈不就是一個新的網易雲音樂播放器了。 本人對於Python學習建立了一個小小的學習圈子,為各位提供了一個平臺,大家一起來討論
Android開發本地及網路Mp3音樂播放器(十五)網路音樂及歌詞下載功能實現
實現功能: 實現網路音樂歌詞下載功能(下載音樂的同時,下載對應歌詞) 下載好的歌詞目前不在播放器內,可以通過檔案瀏覽器檢視。 後續將博文,將實現本地音樂歌詞下載和已下載音樂掃描功能。 因為,沒有自己的伺服器,所以網路音樂所有相關功能(包含搜尋音樂、下載音樂、下載歌詞)均無法
Android開源專案(一)音樂播放器
作為一個有追求的程式設計師來說,專案原始碼必須看,但是網上那麼多資源是不讓你無從下手啊,博主今天為大家推薦五個經典專案吧。 一、android-UniversalMusicPlayer 這個開源專案展示瞭如何實現一個橫跨各種Android平臺的音樂播放器,包括手機,平板,汽車,手錶,電視等。 架構:
【Android】Android開源專案(一)音樂播放器原始碼彙總
作為一個有追求的程式設計師來說,專案原始碼必須看,但是網上那麼多資源是不讓你無從下手啊,博主今天為大家推薦五個經典專案吧。 一、android-UniversalMusicPlayer 這個開源專案展示瞭如何實現一個橫跨各種Android平臺的音樂播放器,包
Android開發本地及網路Mp3音樂播放器(五)實現專輯封面圖片
實現功能: 在MyMusicListFragment中實現專輯封面圖片 在item_music_list中實現專輯封面圖片 實現效果如圖: 實現程式碼如下: 在MediaUtiles中新增如下程式碼:/** * 獲取預設專輯圖片 */ pub
一個小小的移動web版音樂播放器
這個小東西是在去年八月份就完成的啦,但是由於自己一拖再拖沒有來更新部落格,直到今天心血來潮想來更新下部落格。 今天就來記錄下自己做完這個小小的迷你小專案—music-player。 哈哈,由於自己藝術細胞有限,再加上是個簡潔控,自己粗略設計了一下,所以我的u
Android開發本地及網路Mp3音樂播放器(二)SplashActivity(歡迎介面)
SplashActivity(歡迎介面) 實現功能: 修改背景圖片 通過java修改歡迎介面文字資訊 在xml中增加文字陰影 實現6秒自動跳轉到MainActivity 實現點選Button跳轉到MainActivity 以上2種跳轉方法不衝突 (以上2種跳轉方法不衝突
android一個很簡單很簡單的音樂播放器
這是一個亂七八糟的主介面 偷懶直接把所有操作都也在了MainActivity上面,主要是學習是怎麼執行的,之後滿滿完善吧。這裡的操作包括上下曲,播放暫停,隨機開關,列表跳轉播放。UI十分十分簡單。 public class MainActivity exte
通過一個簡單的音樂播放器探討 Android Aidl 的實現原理
眾所周知,音樂播放器的播放不應該在前臺程序,而是要在另外一個程序的 Service 中進行,這樣才能實現後臺播放功能,同時不影響 UI 程序且不共用記憶體資源從而減少雙方被 kill 的可能性。 由於不同程序間是無法直接通訊的,因此在這種情況我們會使用 AID
使用Service組件實現簡單的音樂播放器功能 --Android基礎
area direct start 獲取 點擊 btn src c函數 extern 1、本例利用Service實現簡單的音樂播放功能,下面是效果圖。(點擊開始播放開啟服務,音樂播放,點擊“停止播放”關閉服務,音樂停止播放。) 2、核心代碼:
Android實現簡單音樂播放器(MediaPlayer)
工程內容 實現一個簡單的音樂播放器,要求功能有: 播放、暫停功能;進度條顯示播放進度功能拖動進度條改變進度功能;後臺播放功能;停止功能;退出功能; 程式碼實現 匯入歌曲到手機SD卡的Music目錄中,這裡我匯入了4首歌曲:仙劍六裡面的《誓言成暉》、《劍客不能說》、《鏡
Android音樂播放器的簡單實現
1、MusicService 音樂播放器的Service,裡面獲取音樂檔案,封裝了MediaPlayer,實現播放上一首和下一首,播放,停止,封裝成方法供Activity呼叫,獲取音樂的當前進度,總長度、名字,通過傳送廣播的方式發給Activity pa
Android之簡單本地音樂播放器
平臺:Android studio 本地的音樂播放器,主要功能就是可以播放音樂,能夠讀取本地的音樂,並顯示出來,播放,暫停,上一首,下一首,進度條可以拖拽播放,添加了前臺service,看一下實現 首先我是先做了一個大概的佈局,樣子先出來,需要其他的空間後期
Android 超簡單音樂播放器(十)歌詞的實現
關於歌詞 有下面這些: 歌詞的獲取 歌詞的解析 自定義View 歌詞的獲取 歌詞的獲取分為兩種,一種是從本地一種是通過網路上提供的API獲取。我選擇的是歌詞迷的API http://api.geci.me/en/latest/ 說實話,這