android 收藏歌曲功能,基于android的网络音乐播放器-回调实现音乐播放及音乐收藏的实现(三)...
作為android初學(xué)者,最近把瘋狂android講義和瘋狂Java講義看了一遍,看到書中介紹的知識(shí)點(diǎn)非常多,很難全部記住,為了更好的掌握基礎(chǔ)知識(shí)點(diǎn),我將開發(fā)一個(gè)網(wǎng)絡(luò)音樂播放器-EasyMusic來鞏固下,也當(dāng)作是練練手。感興趣的朋友可以看看,有設(shè)計(jì)不足的地方也歡迎指出。
開發(fā)之前首先介紹下該音樂播放器將要開發(fā)的功能(需求):
1.本地音樂的加載和播放;
2.網(wǎng)絡(luò)音樂的搜索,試聽和下載;
3.音樂的斷點(diǎn)下載;
4.點(diǎn)擊播放圖標(biāo)加載專輯圖片,點(diǎn)擊歌詞加載歌詞并滾動(dòng)顯示(支持滑動(dòng)歌詞改變音樂播放進(jìn)度);
5.支持基于popupWindow的彈出式菜單;
6.支持后臺(tái)任務(wù)欄顯示和控制。
該篇主要介紹音樂的回調(diào)播放及收藏音樂的實(shí)現(xiàn),其中音樂的收藏需要用到SQLite數(shù)據(jù)庫(kù):
1.回調(diào)監(jiān)聽實(shí)現(xiàn)音樂的點(diǎn)擊播放
該部分對(duì)MusicListFragment 的主要修改如下
public class MusicListFragment extends Fragment {
......
private CallBack mCallBack;
.....
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.musiclist, container, false);
musicListView = (ListView)view.findViewById(R.id.musicList);
musicListView.setAdapter(musicListAdapter);
musicListView.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView> parent, View view, int position, long id) {
//mCallBack指向MainActivity,實(shí)際調(diào)用的是MainActivity的onItemSelected方法
mCallBack.onItemSelected((String)dbMusic.get(position).get("url"));
TextView title = (TextView)view.findViewWithTag("title");
Toast.makeText(mContext, "title = " + title.getText().toString(), Toast.LENGTH_SHORT).show();
}
});
return view;
}
/**
* 回調(diào)接口指向MainActivity,因?yàn)镸ainActivity實(shí)現(xiàn)了CallBack接口,所有這里用到了多態(tài)-父類引用指向子類對(duì)象,然后在該Fragment中可
* 通過mCallBack調(diào)用MainActivity播放音樂的方法
*/
public void onAttach(Activity activity) {
super.onAttach(activity);
mCallBack = (CallBack)activity;
}
public interface CallBack {
public void onItemSelected(String url);
}
}
MainActivity還需要實(shí)現(xiàn)MusicListFragment的內(nèi)部接口CallBack,這樣當(dāng)點(diǎn)擊音樂列表時(shí)即可調(diào)用MainActivity的onItemSelected方法,實(shí)現(xiàn)音樂的播放,MainActivity的調(diào)整如下:
public class MainActivity extends FragmentActivity implements MusicListFragment.CallBack, View.OnClickListener {
......
@Override
public void onItemSelected(String url) {
playMusic(url);
}
}
2.音樂收藏的實(shí)現(xiàn)
這里設(shè)計(jì)的收藏思路為:點(diǎn)擊音樂后端的五角星實(shí)現(xiàn)五角星的點(diǎn)亮和熄滅,分別對(duì)應(yīng)收藏和取消收藏,收藏任務(wù)的執(zhí)行使用異步任務(wù),異步任務(wù)定義為MusicListFragment的內(nèi)部類,其定義如下:
//執(zhí)行收藏音樂/取消收藏的異步任務(wù)
private class MyAsyncTask extends AsyncTask{
private ImageView starView;
private MapmusicInfo;
private boolean storeSuccess;
public MyAsyncTask(ImageView starView, MapmusicInfo) {
this.starView = starView;
this.musicInfo = musicInfo;
}
protected void onPreExecute() {
super.onPreExecute();
}
protected void onProgressUpdate(Void... values) {
super.onProgressUpdate(values);
}
protected Void doInBackground(String... params) {
Log.d(TAG, "doInBackground");
Cursor cursor = myHelper.getReadableDatabase().rawQuery("select * from stored_music", null);
while (cursor.moveToNext()) {
String title = cursor.getString(1);
String artist = cursor.getString(2);
Log.d(TAG, "title = " + title + " artist = " + artist);
Log.d(TAG, "musicInfo.title = "+(String)musicInfo.get("title")+ " musicInfo.artist = "+(String)musicInfo.get("artist"));
if (title.equals((String)musicInfo.get("title")) && artist.equals((String)musicInfo.get("artist"))) {
//已經(jīng)收藏的音樂取消收藏并移出收藏音樂表格-stored_music
myHelper.getReadableDatabase().execSQL("delete from stored_Music where title like ? and artist like ?",
new String[] {title, artist});
storeSuccess = false;
return null;
}
}
//未收藏的音樂加入到收藏中
myHelper.getReadableDatabase().execSQL("insert into stored_music values(null, ?, ?, ?, ?)",
new Object[] {musicInfo.get("title"),musicInfo.get("artist"),musicInfo.get("duration"),musicInfo.get("url")});
storeSuccess = true;
return null;
}
protected void onPostExecute(Void result) {
super.onPostExecute(result);
if (storeSuccess) {
starView.setImageResource(android.R.drawable.btn_star_big_on);
Toast.makeText(mContext, "收藏成功", 100).show();
} else {
starView.setImageResource(android.R.drawable.btn_star_big_off);
Toast.makeText(mContext, "取消收藏", 100).show();
}
}
當(dāng)點(diǎn)擊音樂的收藏圖標(biāo)-五角星時(shí)即可開啟一個(gè)異步任務(wù),當(dāng)異步任務(wù)執(zhí)行即為相應(yīng)的收藏?cái)?shù)據(jù)庫(kù)音樂信息的增加和刪除,執(zhí)行完成完成后再點(diǎn)亮/熄滅五角星。另外,我們音樂收藏?cái)?shù)據(jù)庫(kù)的定義如下:
package com.sprd.easymusic.mysql;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
public class MyDBHelper extends SQLiteOpenHelper {
//收藏音樂的數(shù)據(jù)表
private final String CREATE_TABLE_LOCALMUSIC = "create table stored_music(" +
"_id integer primary key autoincrement,title,artist,duration,url)";
public MyDBHelper(Context context, String name, CursorFactory factory, int version) {
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_TABLE_LOCALMUSIC);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
}
}
異步任務(wù)的啟動(dòng)源于收藏圖標(biāo)的監(jiān)聽:
// 音樂列表適配器
private BaseAdapter musicListAdapter = new BaseAdapter() {
@Override
public int getCount() {
return dbMusic.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View view = convertView;
Mapitem = dbMusic.get(position);
if (convertView == null) {
view = inflater.inflate(R.layout.musiclist_item, null);
}
final ImageView storeMusic = (ImageView) view.findViewById(R.id.love);
if (checkIfStored((String) item.get("url"))) {
storeMusic.setImageResource(android.R.drawable.btn_star_big_on);
} else {
storeMusic.setImageResource(android.R.drawable.btn_star_big_off);
}
//收藏或取消收藏的監(jiān)聽
storeMusic.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
new MyAsyncTask(storeMusic, dbMusic.get(position)).execute();
}
});
TextView musicTitle = (TextView) view.findViewById(R.id.musicTitle);
musicTitle.setTag("title");
TextView musicArtist = (TextView) view.findViewById(R.id.musicArtist);
musicTitle.setText((String) item.get("title"));
musicArtist.setText((String) item.get("artist"));
return view;
}
};
音樂收藏的關(guān)鍵代碼就如上面所述,其他就不多講了。當(dāng)然在進(jìn)入音樂列表的時(shí)候需要查詢當(dāng)前音樂是否被收藏了,是的話就需要點(diǎn)亮收藏圖標(biāo),加上一個(gè)判斷即可,上面代碼中的checkIfStored((String) item.get(“url”))方法就是進(jìn)行該判斷的。
好了,該篇先講這么多了,后面一篇我將把這些主要類的代碼都貼上并附上效果圖供大家參考。
音樂播放器已完成,下載地址:
Android音樂播放器
總結(jié)
以上是生活随笔為你收集整理的android 收藏歌曲功能,基于android的网络音乐播放器-回调实现音乐播放及音乐收藏的实现(三)...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么让html网页动态效果,从html制
- 下一篇: 低压配电的全球与中国市场2022-202