亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》
  • 首頁 > 
  • 教程 > 
  • 數據庫 > 
  • android通過SQLite數據庫的操作如何實現音樂播放器

android通過SQLite數據庫的操作如何實現音樂播放器

發布時間:2021-11-30 17:23:15 來源:億速云 閱讀:192 作者:柒染 欄目:數據庫

android通過SQLite數據庫的操作如何實現音樂播放器,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

下面實現播放列表的功能。

當選擇某一首歌曲后,自動將該歌曲加入到整個播放列表中,每次進入播放歌曲的界面時,查詢出所有的播放列表中的歌曲,并加入到ListView里,供用戶選擇。

這樣就需要建立一張歌曲表,保存所有的歌曲,主鍵是歌曲的完整路徑。

具體的效果:

第一,先進入到sdcard中

android通過SQLite數據庫的操作如何實現音樂播放器

然后,選擇一個map3音樂,進入到播放頁面,這里實現是通過先將數據的路勁和名稱存入數據庫,然后再讀取數據庫中的音樂信息,完成的

android通過SQLite數據庫的操作如何實現音樂播放器

代碼實現:首先是activity_main.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:background="#cccccc"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/music_name"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:gravity="center"
        android:text="@string/hello_world"
        android:textColor="#000000"
        android:textSize="16sp" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="2"
        android:orientation="horizontal" >

        <TextView
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1" />

        <TextView
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:background="@drawable/audio_identify_start_default" />

        <TextView
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1" />
    </LinearLayout>

    <ListView
        android:id="@+id/list"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="3" >
    </ListView>

    <SeekBar
        android:id="@+id/seekbar"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="0.5" />

    <TextView
        android:id="@+id/time_text"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="0.5"
        android:gravity="center"
        android:text="00:00 / 00:00"
        android:textColor="#000000"
        android:textSize="12sp" />

    <TextView
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:gravity="center" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:orientation="horizontal" >

        <TextView
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="0.5" />

        <Button
            android:id="@+id/pre_btn"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:background="@drawable/ic_player_prev_default" />

        <TextView
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1" />

        <Button
            android:id="@+id/play_btn"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1.5"
            android:background="@drawable/ic_player_play_default" />

        <TextView
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1" />

        <Button
            android:id="@+id/next_btn"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:background="@drawable/ic_player_next_default" />

        <TextView
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="0.5" />
    </LinearLayout>

</LinearLayout>

這里實現的是播放器的頁面。

然后是實現數據處理的xml,song_line.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="wrap_content"
    android:background="#ffffff" >

    <TextView
        android:id="@+id/song_name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textColor="#000000"
        android:textSize="14sp" >
    </TextView>

</LinearLayout>

然后是activity_file_list.xml,這是實現sdcard頁面的顯示

<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" >

    <TextView
        android:id="@+id/title_text"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:gravity="center_vertical"
        android:text="當前位置: /mnt/sdcard"
        android:textSize="14sp" />

    <ListView
        android:id="@+id/list"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="8"
        android:cacheColorHint="#00000000" >
    </ListView>

</LinearLayout>

然后是實現sdcard頁面數據的xml,fine_line.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="wrap_content"
    android:orientation="horizontal" >

    <TextView
        android:id="@+id/file_img"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1" />

    <TextView
        android:id="@+id/file_name"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="4"
        android:textSize="14sp" />

</LinearLayout>

第二步,java代碼,首先實現數據庫的創建

package org.liky.music.util;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;

public class DataBaseConnection extends SQLiteOpenHelper {

	public DataBaseConnection(Context ctx) {
		super(ctx, "music.db", null, 1);
	}
	
	public DataBaseConnection(Context context, String name,
			CursorFactory factory, int version) {
		super(context, name, factory, version);
	}

	@Override
	public void onCreate(SQLiteDatabase db) {
		// 建立表
		String sql = "CREATE TABLE music (" +
				"full_path			text			primary key ," +
				"song_name			text			" +
				");" ;
		
		db.execSQL(sql);
	}

然后是公共類初始化的一些設置Global,如控制屏幕顯示的

package org.liky.music.util;

import java.util.HashMap;
import java.util.Map;

import org.liky.music.R;

import android.app.Activity;
import android.os.Environment;

public class Globals {

	public static int SCREEN_WIDTH;
	public static int SCREEN_HEIGHT;
	// 建立一個Map集合, 里面封裝了所有擴展名對應的圖標圖片, 以便進行文件圖標的顯示
	public static Map<String, Integer> allIconImgs = new HashMap<String, Integer>();

	public static Map<String, String> allSongNameMap = new HashMap<String, String>();

	// 初始化數據庫連接
	public static DataBaseConnection dbc;

	public static void init(Activity a) {
		SCREEN_WIDTH = a.getWindowManager().getDefaultDisplay().getWidth();
		SCREEN_HEIGHT = a.getWindowManager().getDefaultDisplay().getHeight();

		dbc = new DataBaseConnection(a);
		
		// 初始化一些歌曲名稱
		allSongNameMap.put("/storage/sdcard/a.mp3", "Fly Me To The Moon");
		allSongNameMap.put("/storage/sdcard/b.mp3", "時間都去哪兒了");
		allSongNameMap.put("/storage/sdcard/c.mp3", "卷珠簾");

		// 初始化所有擴展名和圖片的對應關系
		allIconImgs.put("txt", R.drawable.txt_file);
		allIconImgs.put("mp3", R.drawable.mp3_file);
		allIconImgs.put("mp4", R.drawable.mp4_file);
		allIconImgs.put("bmp", R.drawable.image_file);
		allIconImgs.put("gif", R.drawable.image_file);
		allIconImgs.put("png", R.drawable.image_file);
		allIconImgs.put("jpg", R.drawable.image_file);
		allIconImgs.put("dir_open", R.drawable.open_dir);
		allIconImgs.put("dir_close", R.drawable.close_dir);
	}

}

然后是對數據庫SQLite的數據的創建和更新;

package org.liky.music.util;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.database.Cursor;

public class MusicDAOUtils {

	public static void insertData(String fullPath) {
		// 先判斷數據庫中是否有這條數據
		String sql = "SELECT song_name FROM music WHERE full_path = ?";
		Cursor c = Globals.dbc.getReadableDatabase().rawQuery(sql,
				new String[] { fullPath });
		if (!c.moveToFirst()) {
			// 之前沒有添加過,需要添加新數據
			sql = "INSERT INTO music VALUES (?,?)";
			Globals.dbc.getWritableDatabase().execSQL(
					sql,
					new Object[] { fullPath,
							Globals.allSongNameMap.get(fullPath) });
		}
		c.close();
	}

	public static List<Map<String, Object>> listData() {
		String sql = "SELECT full_path,song_name FROM music";
		Cursor c = Globals.dbc.getReadableDatabase().rawQuery(sql, null);

		List<Map<String, Object>> allValues = new ArrayList<Map<String, Object>>();
		c.moveToFirst();
		while (!c.isAfterLast()) {
			Map<String, Object> map = new HashMap<String, Object>();
			map.put("fullPath", c.getString(0));
			map.put("songName", c.getString(1));
			allValues.add(map);

			c.moveToNext();
		}

		c.close();

		return allValues;
	}
}

第三步,創建adapter,兩個簡單的adapter,處理文件,和音樂

package org.liky.music.adapter;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.liky.music.R;
import org.liky.music.util.Globals;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView.LayoutParams;
import android.widget.BaseAdapter;
import android.widget.TextView;

public class FileAdapter extends BaseAdapter {

	private Context ctx;
	private List<Map<String, Object>> allValues = new ArrayList<Map<String, Object>>();

	public FileAdapter(Context ctx, List<Map<String, Object>> allValues) {
		this.ctx = ctx;
		this.allValues = allValues;
	}

	@Override
	public int getCount() {
		return allValues.size();
	}

	@Override
	public Object getItem(int arg0) {
		return allValues.get(arg0);
	}

	@Override
	public long getItemId(int position) {
		return position;
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		if (convertView == null) {
			convertView = LayoutInflater.from(ctx).inflate(R.layout.file_line,
					null);
			// 設置高度
			convertView.setLayoutParams(new LayoutParams(
					LayoutParams.MATCH_PARENT, Globals.SCREEN_HEIGHT / 9));
		}

		// 取得組件
		TextView fileImg = (TextView) convertView.findViewById(R.id.file_img);

		fileImg.getLayoutParams().height = Globals.SCREEN_HEIGHT / 9;

		TextView fileName = (TextView) convertView.findViewById(R.id.file_name);

		// 取得數據,設置到組件里
		Map<String, Object> map = allValues.get(position);

		// 設置內容, 文字
		fileName.setText(map.get("fileName").toString());

		// 圖片要根據擴展名取得
		String extName = map.get("extName").toString();
		// 取得圖片的id
		int imgId = Globals.allIconImgs.get(extName);
		// 設置圖片
		fileImg.setBackgroundResource(imgId);

		return convertView;
	}

}
package org.liky.music.adapter;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.liky.music.R;

import android.content.Context;
import android.graphics.Color;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

public class MusicAdapter extends BaseAdapter {

	private List<View> allViews = new ArrayList<View>();

	private Context ctx;

	public MusicAdapter(List<Map<String, Object>> allValues, Context ctx) {
		this.ctx = ctx;
		// 循環建立View
		Iterator<Map<String, Object>> iter = allValues.iterator();
		while (iter.hasNext()) {
			Map<String, Object> map = iter.next();

			View v = LayoutInflater.from(ctx).inflate(R.layout.song_line, null);
			TextView songName = (TextView) v.findViewById(R.id.song_name);
			songName.setText(map.get("songName").toString());

			allViews.add(v);
		}
	}

	public void setSelectedBackground(int index) {
		// 其他的索引全部清空成為白色
		for (int i = 0; i < allViews.size(); i++) {
			if (i == index) {
				allViews.get(index).setBackgroundColor(Color.RED);
			} else {
				allViews.get(i).setBackgroundColor(Color.WHITE);
			}
		}
	}

	@Override
	public int getCount() {
		return allViews.size();
	}

	@Override
	public Object getItem(int position) {
		return allViews.get(position);
	}

	@Override
	public long getItemId(int position) {
		return position;
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		return allViews.get(position);
	}

}

最后是實現的Activity,FIleListActivity和mainActivity

package org.liky.music;

import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.liky.music.adapter.FileAdapter;
import org.liky.music.util.Globals;
import org.liky.music.util.MusicDAOUtils;

import android.app.Activity;
import android.app.AlertDialog.Builder;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.os.Bundle;
import android.os.Environment;
import android.view.KeyEvent;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.ListView;
import android.widget.TextView;

public class FileListActivity extends Activity {

	private TextView titleText;
	private ListView list;

	private FileAdapter adapter;
	private List<Map<String, Object>> allValues = new ArrayList<Map<String, Object>>();

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		Globals.init(this);

		setContentView(R.layout.activity_file_list);

		// 取得組件
		titleText = (TextView) findViewById(R.id.title_text);
		list = (ListView) findViewById(R.id.list);

		// 準備數據
		// 取得SD卡根目錄
		File root = Environment.getExternalStorageDirectory();

		loadFileData(root);

		// 建立Adapter
		adapter = new FileAdapter(this, allValues);

		list.setAdapter(adapter);

		// 加入監聽事件
		list.setOnItemClickListener(new OnItemClickListener() {
			@Override
			public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
					long arg3) {
				// 取得當前操作的數據
				Map<String, Object> map = allValues.get(arg2);
				// 判斷所點的是文件還是文件夾
				boolean dirFlag = (Boolean) map.get("dirFlag");
				if (dirFlag) {
					// 文件夾
					// 建立該文件夾的File對象
					// 取得絕對路徑
					String fullPath = (String) map.get("fullPath");
					// 建立File
					File dir = new File(fullPath);

					// 先清空原有數據
					allValues.clear();

					if (!Environment.getExternalStorageDirectory()
							.getAbsolutePath().equals(fullPath)) {
						// 加入返回上一級的操作行
						Map<String, Object> parent = new HashMap<String, Object>();
						parent.put("fileName", "返回上一級");
						parent.put("extName", "dir_open");
						parent.put("dirFlag", true);
						parent.put("fullPath", dir.getParent());

						// 保存一個標志
						parent.put("flag", "TRUE");

						// 將這一行加入到數據集合中
						allValues.add(parent);
					}

					// 加入新數據
					loadFileData(dir);

					// 使用Adapter通知界面ListView,數據已經被修改了,你也要一起改
					adapter.notifyDataSetChanged();
				} else {
					// 點某個文件時,將該文件完整路徑傳入到MainActivity中
					String fullPath = map.get("fullPath").toString();
					// 將數據保存到數據庫中
					MusicDAOUtils.insertData(fullPath);

					Intent in = new Intent(FileListActivity.this,
							MainActivity.class);
					in.putExtra("fullPath", fullPath);
					startActivity(in);
				}

			}
		});

		list.setOnItemLongClickListener(new OnItemLongClickListener() {
			@Override
			public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
					final int arg2, long arg3) {
				// 取得數據
				Map<String, Object> map = allValues.get(arg2);
				final File f = new File(map.get("fullPath").toString());

				if (f.isFile()) {
					// 彈出確認框
					Builder builder = new Builder(FileListActivity.this);
					builder.setTitle("提示");
					builder.setMessage("確定要刪除該文件(" + f.getName() + ")嗎?");
					builder.setPositiveButton("確定", new OnClickListener() {
						@Override
						public void onClick(DialogInterface dialog, int which) {
							// 將SD卡中的文件刪除
							if (f.exists()) {
								f.delete();
							}

							// 將列表中的數據刪除
							allValues.remove(arg2);
							// 通知
							adapter.notifyDataSetChanged();
						}
					});
					builder.setNegativeButton("取消", new OnClickListener() {
						@Override
						public void onClick(DialogInterface dialog, int which) {
						}
					});

					builder.create().show();
				}

				return false;
			}
		});

	}

	@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		// 根據keyCode判斷用戶按下了哪個鍵
		if (keyCode == KeyEvent.KEYCODE_BACK) {
			// 判斷當前是否在SD卡跟目錄.
			// 取得第一行數據
			Map<String, Object> map = allValues.get(0);
			if ("TRUE".equals(map.get("flag"))) {
				// 里面,需要返回上一級
				list.performItemClick(list.getChildAt(0), 0, list.getChildAt(0)
						.getId());
			} else {
				// 彈出提示框
				Builder builder = new Builder(FileListActivity.this);
				builder.setTitle("提示");
				builder.setMessage("親,真的要離開我嗎?");
				builder.setPositiveButton("真的", new OnClickListener() {
					@Override
					public void onClick(DialogInterface dialog, int which) {
						// 關閉當前Activity
						finish();
					}
				});
				builder.setNegativeButton("再待會兒", new OnClickListener() {
					@Override
					public void onClick(DialogInterface dialog, int which) {

					}
				});
				builder.create().show();
			}

			return false;
		}

		return super.onKeyDown(keyCode, event);
	}

	private void loadFileData(File dir) {
		// 列出該目錄下的所有文件
		File[] allFiles = dir.listFiles();
		// 設置當前位置的提示信息
		titleText.setText("當前位置: " + dir.getAbsolutePath());

		// 判斷
		if (allFiles != null) {
			// 循環
			for (int i = 0; i < allFiles.length; i++) {
				File f = allFiles[i];
				Map<String, Object> map = new HashMap<String, Object>();
				map.put("fileName", f.getName());
				// 多保存一個文件的絕對路徑,方便在進行點擊時使用
				map.put("fullPath", f.getAbsolutePath());
				// 判斷是文件夾還是文件
				if (f.isDirectory()) {
					// 是文件夾
					map.put("extName", "dir_close");
					map.put("dirFlag", true);
				} else {
					// 是文件
					// 截取出擴展名
					String extName = f.getName()
							.substring(f.getName().lastIndexOf(".") + 1)
							.toLowerCase();
					map.put("extName", extName);
					map.put("dirFlag", false);
				}

				// 只添加文件夾或所有mp3文件
				if (f.isDirectory() || "mp3".equals(map.get("extName"))) {
					allValues.add(map);
				}
			}
		}
	}

}
package org.liky.music;

import java.util.List;
import java.util.Map;

import org.liky.music.adapter.MusicAdapter;
import org.liky.music.util.MusicDAOUtils;

import android.app.Activity;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Button;
import android.widget.ListView;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {

	private MediaPlayer player;

	private String filePath = "/storage/sdcard/a.mp3";
	private String songName = "Fly Me To The Moon";
	// 準備ListView
	private ListView list;
	private MusicAdapter adapter;
	private List<Map<String, Object>> allValues;

	// 當前播放的歌曲索引
	private int playingIndex = 0;

	// 音樂名稱
	private TextView musicName;
	// 播放時間長度的文本
	private TextView timeText;
	// 拖動條
	private SeekBar seekbar;
	// 播放/暫停 按鈕
	private Button playBtn;
	// 上一首
	private Button preBtn;
	// 下一首
	private Button nextBtn;

	// 總播放時長的文本
	private String durationTimeStr;

	// 建立消息通道,以便在子線程中修改界面
	private Handler handler;

	// 線程對象,監聽拖動條的移動
	private Thread t = null;

	private boolean flag = true;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		player = new MediaPlayer();

		// 接收傳入的文件路徑
		filePath = getIntent().getStringExtra("fullPath");
		// songName = Globals.allSongNameMap.get(filePath);

		// 提取所有歌曲數據,并初始化
		allValues = MusicDAOUtils.listData();

		// 判斷當前應該播放的是列表中的哪一首
		for (int i = 0; i < allValues.size(); i++) {
			if (allValues.get(i).get("fullPath").equals(filePath)) {
				// 該歌曲就是要進行播放的歌曲
				playingIndex = i;
				songName = allValues.get(i).get("songName").toString();
				break;
			}
		}

		// 將數據放入到listView中列表
		list = (ListView) findViewById(R.id.list);

		adapter = new MusicAdapter(allValues, this);

		list.setAdapter(adapter);

		// 設置選中的背景
		adapter.setSelectedBackground(playingIndex);

		handler = new Handler() {
			@Override
			public void handleMessage(Message msg) {
				seekbar.setProgress(player.getCurrentPosition());
				timeText.setText(getTextByMs(player.getCurrentPosition()) + "/"
						+ durationTimeStr);
			}
		};

		// 取得所有組件
		musicName = (TextView) findViewById(R.id.music_name);
		timeText = (TextView) findViewById(R.id.time_text);

		seekbar = (SeekBar) findViewById(R.id.seekbar);

		playBtn = (Button) findViewById(R.id.play_btn);
		preBtn = (Button) findViewById(R.id.pre_btn);
		nextBtn = (Button) findViewById(R.id.next_btn);

		// 初始化

		// 加入一個多線程,通過子線程控制拖動條以及顯示時間的改變
		t = new Thread() {
			@Override
			public void run() {
				while (flag) {
					try {
						Thread.sleep(1000);

						// 取得當前的播放時間位置,設置到拖動條里
						if (player.isPlaying()) {
							// 傳遞一個空消息,不需要有具體的消息內容,因為消息通道中只有一個固定的操作,而且不需要參數.
							handler.sendEmptyMessage(0);
						}

					} catch (Exception e) {
						e.printStackTrace();
					}
				}
			}
		};
		t.start();

		// 播放歌曲
		playSong();

		// 為播放按鈕加監聽
		playBtn.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				if (player.isPlaying()) {
					player.pause();
					playBtn.setBackgroundResource(R.drawable.ic_player_play_default);
				} else {
					player.start();
					playBtn.setBackgroundResource(R.drawable.ic_player_pause_default);
				}
			}
		});

		// 開始播放
		playBtn.performClick();

		// 加入拖動條的監聽
		seekbar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
			@Override
			public void onStopTrackingTouch(SeekBar seekBar) {
				// 開始播放, 同時要倒到當前拖動條的位置
				player.seekTo(seekbar.getProgress());
				player.start();
				// 修改按鈕的圖片
				playBtn.setBackgroundResource(R.drawable.ic_player_pause_default);
			}

			@Override
			public void onStartTrackingTouch(SeekBar seekBar) {
				// 暫停播放
				player.pause();
				playBtn.setBackgroundResource(R.drawable.ic_player_play_default);
			}

			@Override
			public void onProgressChanged(SeekBar seekBar, int progress,
					boolean fromUser) {
				// 如果是因為人為拖動造成的值改變,則時間文本需要一起修改,如果是自動改變的拖動條的值,則不需要修改
				if (fromUser) {
					// 修改顯示時間的數據
					timeText.setText(getTextByMs(progress) + "/"
							+ durationTimeStr);
				}
			}
		});

		// 設置點某一首歌,進行重新播放的功能
		list.setOnItemClickListener(new OnItemClickListener() {

			@Override
			public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
					long arg3) {
				// 如果是當前正在播放的歌曲,不需要處理
				if (arg2 != playingIndex) {
					// 播放當前所點擊的歌曲
					playingIndex = arg2;
					// 重新播放歌曲
					playSong();
					// 播放歌曲
					player.start();
					playBtn.setBackgroundResource(R.drawable.ic_player_pause_default);
					// 重新設置默認選中的歌曲
					adapter.setSelectedBackground(playingIndex);
				}

			}
		});

		// 設置播放上一首和下一首的功能
		preBtn.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				// 判斷當前是否在播放第一首
				if (playingIndex == 0) {
					Toast.makeText(MainActivity.this, "當前已經播放的是第一首歌,沒有前一首!",
							Toast.LENGTH_SHORT).show();
				} else {
					list.performItemClick((View) adapter
							.getItem(playingIndex - 1), playingIndex - 1,
							((View) (adapter.getItem(playingIndex - 1)))
									.getId());
				}
			}
		});
		nextBtn.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				// 判斷當前是否在播放最后一首
				if (playingIndex == allValues.size() - 1) {
					Toast.makeText(MainActivity.this, "當前已經播放的是最后一首歌,沒有后一首!",
							Toast.LENGTH_SHORT).show();
				} else {
					list.performItemClick((View) adapter
							.getItem(playingIndex + 1), playingIndex + 1,
							((View) (adapter.getItem(playingIndex + 1)))
									.getId());
				}
			}
		});

		// 加入播放完成后,自動播放下一首歌的功能
		player.setOnCompletionListener(new OnCompletionListener() {
			@Override
			public void onCompletion(MediaPlayer mp) {
				// 自動播放下一首歌,如果已經是最后一首,直接播放第一首
				if (playingIndex == allValues.size() - 1) {
					list.performItemClick((View) adapter.getItem(0), 0,
							((View) (adapter.getItem(0))).getId());
				} else {
					list.performItemClick((View) adapter
							.getItem(playingIndex + 1), playingIndex + 1,
							((View) (adapter.getItem(playingIndex + 1)))
									.getId());
				}

			}
		});

	}

	private void playSong() {
		filePath = allValues.get(playingIndex).get("fullPath").toString();
		songName = allValues.get(playingIndex).get("songName").toString();

		// 如果正在播放,則停止播放
		if (player.isPlaying()) {
			player.stop();
		}

		// 重置
		player.reset();

		try {
			// 設置要播放的文件
			player.setDataSource(filePath);
			// 進行準備操作
			player.prepare();
			// player.start();

			// 初始化拖動條的總長度
			seekbar.setMax(player.getDuration());
			seekbar.setProgress(0);

			durationTimeStr = getTextByMs(player.getDuration());

			// 修改歌曲標題
			musicName.setText(songName);

			// 設置顯示的播放時間
			timeText.setText("00:00 / " + durationTimeStr);

		} catch (Exception e) {
			e.printStackTrace();
			Toast.makeText(this, "當前加載的音樂有問題,請確定文件格式是否正確!", Toast.LENGTH_LONG)
					.show();
		}
	}

	// 編寫一個算法, 將傳入的毫秒數轉換成為 分鐘:秒鐘 的格式
	private String getTextByMs(int ms) {
		// 先轉換成秒
		int s = ms / 1000;
		// 計算分鐘
		int min = s / 60;
		// 計算剩余的秒數
		s = s % 60;
		// 拼接字符串,并補0
		StringBuilder builder = new StringBuilder();
		if (min < 10) {
			builder.append(0);
		}
		builder.append(min);
		builder.append(":");
		if (s < 10) {
			builder.append(0);
		}
		builder.append(s);

		return builder.toString();
	}

	@Override
	protected void onDestroy() {
		// 退出時釋放音樂
		if (player != null) {
			if (player.isPlaying()) {
				player.stop();
			}
			player.release();
		}
		if (t != null) {
			try {
				flag = false;
				t.interrupt();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		super.onDestroy();
	}
}


//注意,若是在執行時沒有音樂,或是sdcard讀取不出的話,可能是配置上出現問題。

關于android通過SQLite數據庫的操作如何實現音樂播放器問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

贵定县| 赫章县| 徐水县| 当雄县| 赤城县| 辽阳市| 四平市| 北宁市| 和林格尔县| 临泉县| 盘山县| 小金县| 霍邱县| 遵义县| 增城市| 吉林市| 定安县| 吉安市| 富宁县| 绍兴县| 阳山县| 班玛县| 龙江县| 吉安县| 河南省| 正安县| 防城港市| 新乐市| 根河市| 徐汇区| 盘山县| 全椒县| 嵊州市| 广宗县| 永登县| 南投县| 咸阳市| 上高县| 东丰县| 正安县| 鸡西市|