功能实现:播放/暂停/进度显示、拖动/已加入歌曲列表显示/扫描手机存储MP3文件
主要代码部分:Mainactivity+DBHelper
代码使用注意事项:
1.路径要换成自己的手机路径,我这里用的自己手机路径是/storage/emulated/0/DCIM/Camera/Hey Girl.mp3
2.我是在真机环境下运行的,虚拟机会因为没有对上路径点击播放奔溃
3.真机环境下由于安卓的版本问题要手动在设置里面允许存储权限,不然会导致崩溃
这个路径用于一进去列表没有歌曲情况下,点击播放可以播放这一首歌曲,你也可以把这个注释掉,就不需要考虑路径运行了。(这个一开始我是用于调试的后面就没去改了)
运行效果:
Mainactivity
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.ListActivity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnCancelListener;
import android.database.Cursor;
import android.database.sqlite.SQLiteCursor;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.PowerManager;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.style.RelativeSizeSpan;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.SimpleCursorAdapter;
import android.widget.TextView;
import android.widget.Toast;
import java.io.File;
import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.Vector;
public class MainActivity extends ListActivity {
private static final String LOG_TAG = "MainActivity";
String db_name = "audios_db110";
private Context context;
MediaPlayer mp;
DBHelper helper;
SeekBar progress;
TextView status;
private List<FileInfo> mFileList;
private ProgressDialog mProgressDialogForScanSDCard;
Handler mhandler = new Handler();
private SDCardScanThread mSDCardScanThread;
private Thread mUpdateProgressThread = new UpdateProgressThread();
private class DialogDisplayer implements Runnable {
private final int mResId;
public DialogDisplayer(int resId) {
mResId = resId;
}
@Override
public void run() {
showDialog(mResId);
}
}
private class CancelListener //取消监听
implements DialogInterface.OnClickListener, DialogInterface.OnCancelListener {
public void onClick(DialogInterface dialog, int which) {
//finish();
}
public void onCancel(DialogInterface dialog) {
//finish();
}
}
private CancelListener mCancelListener = new CancelListener();
private class FileSelectedListener implements
DialogInterface.OnClickListener, DialogInterface.OnMultiChoiceClickListener {
public FileSelectedListener() {
}
public void onClick(DialogInterface dialog, int which) {
if (which == DialogInterface.BUTTON_POSITIVE) {
Toast.makeText(context, "无任何操作!", Toast.LENGTH_SHORT).show();
} else if (which == DialogInterface.BUTTON_NEGATIVE) {
Toast.makeText(context, "你已取消", Toast.LENGTH_SHORT).show();
} else {
if (!helper.isContainsURI(mFileList.get(which).getCanonicalpath())) {
//Toast.makeText(context,mFileList.get(which).getCanonicalpath(), Toast.LENGTH_SHORT).show();
helper.insert(mFileList.get(which).getNameWithoutsuffix(),mFileList.get(which).getCanonicalpath());
status.setText("成功添加文件:" + mFileList.get(which).getNameWithoutsuffix());
refresh();
} else {
status.setText("该文件已存在于列表中");
}
}
}
@Override
public void onClick(DialogInterface dialog, int which, boolean isChecked) {
onClick(dialog, which);
}
}
private Dialog getFileSelectDialog() {
int size = mFileList.size();
FileSelectedListener listener = new FileSelectedListener();
AlertDialog.Builder builder =
new AlertDialog.Builder(this)
.setTitle(R.string.select_file_title)
.setPositiveButton(android.R.string.ok, listener)
.setOnCancelListener(mCancelListener)
.setNegativeButton(android.R.string.cancel, mCancelListener);
CharSequence[] items = new CharSequence[size];
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
for (int i = 0; i < size; i++) {
FileInfo audioFile = mFileList.get(i);
SpannableStringBuilder stringBuilder = new SpannableStringBuilder();
stringBuilder.append(audioFile.getName());
stringBuilder.append('\n');
int indexToBeSpanned = stringBuilder.length();
stringBuilder.append(
"(" + dateFormat.format(new Date(audioFile.getLastModified())) + ")");
stringBuilder.setSpan(
new RelativeSizeSpan(0.7f), indexToBeSpanned, stringBuilder.length(),
Spanned.SPAN_EXCLUSIVE_