日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

android 收藏歌曲功能,基于android的网络音乐播放器-回调实现音乐播放及音乐收藏的实现(三)...

發(fā)布時(shí)間:2024/3/26 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android 收藏歌曲功能,基于android的网络音乐播放器-回调实现音乐播放及音乐收藏的实现(三)... 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

作為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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。