android 收藏歌曲功能,基于android的网络音乐播放器-回调实现音乐播放及音乐收藏的实现(三)...
作為android初學者,最近把瘋狂android講義和瘋狂Java講義看了一遍,看到書中介紹的知識點非常多,很難全部記住,為了更好的掌握基礎知識點,我將開發一個網絡音樂播放器-EasyMusic來鞏固下,也當作是練練手。感興趣的朋友可以看看,有設計不足的地方也歡迎指出。
開發之前首先介紹下該音樂播放器將要開發的功能(需求):
1.本地音樂的加載和播放;
2.網絡音樂的搜索,試聽和下載;
3.音樂的斷點下載;
4.點擊播放圖標加載專輯圖片,點擊歌詞加載歌詞并滾動顯示(支持滑動歌詞改變音樂播放進度);
5.支持基于popupWindow的彈出式菜單;
6.支持后臺任務欄顯示和控制。
該篇主要介紹音樂的回調播放及收藏音樂的實現,其中音樂的收藏需要用到SQLite數據庫:
1.回調監聽實現音樂的點擊播放
該部分對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,實際調用的是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;
}
/**
* 回調接口指向MainActivity,因為MainActivity實現了CallBack接口,所有這里用到了多態-父類引用指向子類對象,然后在該Fragment中可
* 通過mCallBack調用MainActivity播放音樂的方法
*/
public void onAttach(Activity activity) {
super.onAttach(activity);
mCallBack = (CallBack)activity;
}
public interface CallBack {
public void onItemSelected(String url);
}
}
MainActivity還需要實現MusicListFragment的內部接口CallBack,這樣當點擊音樂列表時即可調用MainActivity的onItemSelected方法,實現音樂的播放,MainActivity的調整如下:
public class MainActivity extends FragmentActivity implements MusicListFragment.CallBack, View.OnClickListener {
......
@Override
public void onItemSelected(String url) {
playMusic(url);
}
}
2.音樂收藏的實現
這里設計的收藏思路為:點擊音樂后端的五角星實現五角星的點亮和熄滅,分別對應收藏和取消收藏,收藏任務的執行使用異步任務,異步任務定義為MusicListFragment的內部類,其定義如下:
//執行收藏音樂/取消收藏的異步任務
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"))) {
//已經收藏的音樂取消收藏并移出收藏音樂表格-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();
}
}
當點擊音樂的收藏圖標-五角星時即可開啟一個異步任務,當異步任務執行即為相應的收藏數據庫音樂信息的增加和刪除,執行完成完成后再點亮/熄滅五角星。另外,我們音樂收藏數據庫的定義如下:
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 {
//收藏音樂的數據表
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
}
}
異步任務的啟動源于收藏圖標的監聽:
// 音樂列表適配器
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);
}
//收藏或取消收藏的監聽
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;
}
};
音樂收藏的關鍵代碼就如上面所述,其他就不多講了。當然在進入音樂列表的時候需要查詢當前音樂是否被收藏了,是的話就需要點亮收藏圖標,加上一個判斷即可,上面代碼中的checkIfStored((String) item.get(“url”))方法就是進行該判斷的。
好了,該篇先講這么多了,后面一篇我將把這些主要類的代碼都貼上并附上效果圖供大家參考。
音樂播放器已完成,下載地址:
Android音樂播放器
總結
以上是生活随笔為你收集整理的android 收藏歌曲功能,基于android的网络音乐播放器-回调实现音乐播放及音乐收藏的实现(三)...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么让html网页动态效果,从html制
- 下一篇: 低压配电的全球与中国市场2022-202