close() was never explicitly called on database '/data/data/com.music/databases/database'
android.database.sqlite.DatabaseObjectNotClosedException:Application did not close the cursor or
cursor or database obj....(看不到) opened herepackage com.music;import java.util.Map;import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SubMenu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageButton;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.SeekBar.OnSeekBarChangeListener;public class Music extends Activity { private static Map<String, String> title;
private Boolean _isBound;
private boolean isPlaying = true;
private Integer position;
private Long playlist_id;
private PlayerService _playerService;
private static MediaPlayer mediaPlayer;
private ImageButton start_and_pause, before, after;
private OnClickListener start_and_pause_listener, beforelistener,
afterlistener;
private static TextView musicname;
private static TextView max_time;
private static TextView play_time;
private static SeekBar seekBar;
private static final int UPDATE_UI = 1; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.play_music);
initData();
initButtons();
autoPlay();
} public void autoPlay() {
if (_playerService == null) {
Intent intent = new Intent(this, PlayerService.class);
intent.putExtra("info", "play");
intent.putExtra("playlist_id", playlist_id);
intent.putExtra("music_id", position);
startService(intent);// 启动service
bindService();// 绑定service
isPlaying = true;
} else {
bindService();
}
} private ServiceConnection _serviceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Log.i("onServiceConnected", "onServiceConnected");
_playerService = ((PlayerService.LocalBinder) service).getService();
mediaPlayer = _playerService.getPlayer();
Log.i("player", mediaPlayer.toString());
title = _playerService.getMusicName();
new RefreshMusicBar().start();
} @Override
public void onServiceDisconnected(ComponentName name) {
_playerService = null;
mediaPlayer = null;
}
}; public void initData() {
playlist_id = getIntent().getExtras().getLong("playlist_id");
Long temp = getIntent().getExtras().getLong("music_id");
position = temp.intValue();
Log.i("initData", "initData"); max_time = (TextView) findViewById(R.id.max_time);
play_time = (TextView) findViewById(R.id.play_time); seekBar = (SeekBar) findViewById(R.id.music_bar);
seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
if (!fromUser)
return;
if (_playerService != null)
mediaPlayer.seekTo(progress);
}
});
musicname = (TextView) findViewById(R.id.music_name); } public void initButtons() {
Log.i("initButtons", "initButtons");
start_and_pause = (ImageButton) findViewById(R.id.play_and_pause_button);
before = (ImageButton) findViewById(R.id.before_button);
after = (ImageButton) findViewById(R.id.after_button); start_and_pause_listener = new ImageButton.OnClickListener() {
@Override
public void onClick(View v) { if (isPlaying) {
pause();
start_and_pause.setImageResource(R.drawable.start);
isPlaying = false; } else {
start();
start_and_pause.setImageResource(R.drawable.pause);
isPlaying = true;
}
}
}; beforelistener = new ImageButton.OnClickListener() {
@Override
public void onClick(View v) {
before();
}
};
afterlistener = new ImageButton.OnClickListener() {
@Override
public void onClick(View v) {
after();
}
};
start_and_pause.setOnClickListener(start_and_pause_listener);
before.setOnClickListener(beforelistener);
after.setOnClickListener(afterlistener);
} private void bindService() { Intent i = new Intent(this, PlayerService.class);
bindService(i, _serviceConnection, Context.BIND_AUTO_CREATE);
_isBound = true;
Log.i("bindService", "bindService");
} private void unbindService() { if (_isBound) {
unbindService(_serviceConnection);
_isBound = false;
}
Log.i("unbindService", "unbindService");
} @Override
public boolean onCreateOptionsMenu(Menu menu) {
SubMenu subMenu = menu.addSubMenu("播放模式");
subMenu.add(0, 1, 0, "单曲循环");
subMenu.add(0, 2, 0, "顺序播放");
subMenu.add(0, 3, 0, "随机播放"); return super.onCreateOptionsMenu(menu);
} @Override
public boolean onMenuItemSelected(int featureId, MenuItem item) {
switch (item.getItemId()) {
case 1 :
_playerService.PLAY_MODELS = 1;
break;
case 2 :
_playerService.PLAY_MODELS = 2;
break;
case 3 :
_playerService.PLAY_MODELS = 3;
break;
}
return super.onMenuItemSelected(featureId, item);
}
public void start() {
Log.i("start", "start——in");
Intent intent = new Intent(this, PlayerService.class);
intent.putExtra("info", "play");
intent.putExtra("playlist_id", playlist_id);
intent.putExtra("music_id", position);
startService(intent);
Log.i("start", "start——out");
}
public void pause() {
Intent intent = new Intent(this, PlayerService.class);
intent.putExtra("info", "pause");
startService(intent);
}
public void before() {
Intent intent = new Intent(this, PlayerService.class);
intent.putExtra("info", "before");
startService(intent);
}
public void after() {
Intent intent = new Intent(this, PlayerService.class);
intent.putExtra("info", "after");
startService(intent);
}
public void exit() {
Intent intent = new Intent(this, PlayerService.class);
intent.putExtra("info", "exit");
startService(intent);
} private static Handler mHandler = new Handler() {// UI主线程
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case UPDATE_UI :
seekBar.setMax(mediaPlayer.getDuration());
seekBar.setProgress(mediaPlayer.getCurrentPosition());
play_time.setText(formatTime(mediaPlayer
.getCurrentPosition()));
max_time.setText(formatTime(mediaPlayer.getDuration()));
musicname.setText(title.get("title"));
break;
}
} }; public static class RefreshMusicBar extends Thread {
@Override
public void run() {
while (!Thread.interrupted()) {
try {
Thread.sleep(1000);
mHandler.sendMessage(mHandler.obtainMessage(UPDATE_UI));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
private static String formatTime(int time) {
int sec = time / 1000;// 格式化时间
int min = sec / 60;
sec = sec - min * 60;
String s = String.format("%1$02d", min) + ":"
+ String.format("%1$02d", sec);
return s;
}}
android.database.sqlite.DatabaseObjectNotClosedException:Application did not close the cursor or
cursor or database obj....(看不到) opened herepackage com.music;import java.util.Map;import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SubMenu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageButton;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.SeekBar.OnSeekBarChangeListener;public class Music extends Activity { private static Map<String, String> title;
private Boolean _isBound;
private boolean isPlaying = true;
private Integer position;
private Long playlist_id;
private PlayerService _playerService;
private static MediaPlayer mediaPlayer;
private ImageButton start_and_pause, before, after;
private OnClickListener start_and_pause_listener, beforelistener,
afterlistener;
private static TextView musicname;
private static TextView max_time;
private static TextView play_time;
private static SeekBar seekBar;
private static final int UPDATE_UI = 1; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.play_music);
initData();
initButtons();
autoPlay();
} public void autoPlay() {
if (_playerService == null) {
Intent intent = new Intent(this, PlayerService.class);
intent.putExtra("info", "play");
intent.putExtra("playlist_id", playlist_id);
intent.putExtra("music_id", position);
startService(intent);// 启动service
bindService();// 绑定service
isPlaying = true;
} else {
bindService();
}
} private ServiceConnection _serviceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Log.i("onServiceConnected", "onServiceConnected");
_playerService = ((PlayerService.LocalBinder) service).getService();
mediaPlayer = _playerService.getPlayer();
Log.i("player", mediaPlayer.toString());
title = _playerService.getMusicName();
new RefreshMusicBar().start();
} @Override
public void onServiceDisconnected(ComponentName name) {
_playerService = null;
mediaPlayer = null;
}
}; public void initData() {
playlist_id = getIntent().getExtras().getLong("playlist_id");
Long temp = getIntent().getExtras().getLong("music_id");
position = temp.intValue();
Log.i("initData", "initData"); max_time = (TextView) findViewById(R.id.max_time);
play_time = (TextView) findViewById(R.id.play_time); seekBar = (SeekBar) findViewById(R.id.music_bar);
seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
if (!fromUser)
return;
if (_playerService != null)
mediaPlayer.seekTo(progress);
}
});
musicname = (TextView) findViewById(R.id.music_name); } public void initButtons() {
Log.i("initButtons", "initButtons");
start_and_pause = (ImageButton) findViewById(R.id.play_and_pause_button);
before = (ImageButton) findViewById(R.id.before_button);
after = (ImageButton) findViewById(R.id.after_button); start_and_pause_listener = new ImageButton.OnClickListener() {
@Override
public void onClick(View v) { if (isPlaying) {
pause();
start_and_pause.setImageResource(R.drawable.start);
isPlaying = false; } else {
start();
start_and_pause.setImageResource(R.drawable.pause);
isPlaying = true;
}
}
}; beforelistener = new ImageButton.OnClickListener() {
@Override
public void onClick(View v) {
before();
}
};
afterlistener = new ImageButton.OnClickListener() {
@Override
public void onClick(View v) {
after();
}
};
start_and_pause.setOnClickListener(start_and_pause_listener);
before.setOnClickListener(beforelistener);
after.setOnClickListener(afterlistener);
} private void bindService() { Intent i = new Intent(this, PlayerService.class);
bindService(i, _serviceConnection, Context.BIND_AUTO_CREATE);
_isBound = true;
Log.i("bindService", "bindService");
} private void unbindService() { if (_isBound) {
unbindService(_serviceConnection);
_isBound = false;
}
Log.i("unbindService", "unbindService");
} @Override
public boolean onCreateOptionsMenu(Menu menu) {
SubMenu subMenu = menu.addSubMenu("播放模式");
subMenu.add(0, 1, 0, "单曲循环");
subMenu.add(0, 2, 0, "顺序播放");
subMenu.add(0, 3, 0, "随机播放"); return super.onCreateOptionsMenu(menu);
} @Override
public boolean onMenuItemSelected(int featureId, MenuItem item) {
switch (item.getItemId()) {
case 1 :
_playerService.PLAY_MODELS = 1;
break;
case 2 :
_playerService.PLAY_MODELS = 2;
break;
case 3 :
_playerService.PLAY_MODELS = 3;
break;
}
return super.onMenuItemSelected(featureId, item);
}
public void start() {
Log.i("start", "start——in");
Intent intent = new Intent(this, PlayerService.class);
intent.putExtra("info", "play");
intent.putExtra("playlist_id", playlist_id);
intent.putExtra("music_id", position);
startService(intent);
Log.i("start", "start——out");
}
public void pause() {
Intent intent = new Intent(this, PlayerService.class);
intent.putExtra("info", "pause");
startService(intent);
}
public void before() {
Intent intent = new Intent(this, PlayerService.class);
intent.putExtra("info", "before");
startService(intent);
}
public void after() {
Intent intent = new Intent(this, PlayerService.class);
intent.putExtra("info", "after");
startService(intent);
}
public void exit() {
Intent intent = new Intent(this, PlayerService.class);
intent.putExtra("info", "exit");
startService(intent);
} private static Handler mHandler = new Handler() {// UI主线程
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case UPDATE_UI :
seekBar.setMax(mediaPlayer.getDuration());
seekBar.setProgress(mediaPlayer.getCurrentPosition());
play_time.setText(formatTime(mediaPlayer
.getCurrentPosition()));
max_time.setText(formatTime(mediaPlayer.getDuration()));
musicname.setText(title.get("title"));
break;
}
} }; public static class RefreshMusicBar extends Thread {
@Override
public void run() {
while (!Thread.interrupted()) {
try {
Thread.sleep(1000);
mHandler.sendMessage(mHandler.obtainMessage(UPDATE_UI));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
private static String formatTime(int time) {
int sec = time / 1000;// 格式化时间
int min = sec / 60;
sec = sec - min * 60;
String s = String.format("%1$02d", min) + ":"
+ String.format("%1$02d", sec);
return s;
}}
-----------------------------------------------------------------------------------------------------package com.music;import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;import android.app.Service;
import android.content.Intent;
import android.database.Cursor;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;public class PlayerService extends Service { private Map<String, String> musicName = new HashMap<String, String>();
private Intent mIntent = new Intent("com.music.Music");
private LocalBinder localBinder = new LocalBinder();
private MediaPlayer player = new MediaPlayer();
private Boolean isPause = false;
private Boolean isSame = false;
private List<Integer> music_id;
private List<String> music_name;
private List<String> music_path;
private ListDbAdapter listDbAdapter;
private Cursor cursor;
private Long playlist_id;
private Integer position;
private Integer musicid;
private Random random = new Random();
private static final int PLAY_ONE = 1;
private static final int PLAY_AUTO = 2;
private static final int PLAY_RANDOM = 3;
public static int PLAY_MODELS = PLAY_AUTO;
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i("comend", "comend");
return super.onStartCommand(intent, flags, startId);
}
public class LocalBinder extends Binder {
public PlayerService getService() {
Log.i("LocalBinder", "LocalBinder");
return PlayerService.this;
}
} @Override
public void onCreate() {
super.onCreate();
Log.i("onCreate", "onCreate");
listDbAdapter = new ListDbAdapter(this);
} @Override
public IBinder onBind(Intent intent) {
Log.i("onBind", "onBind");
return localBinder;
} @Override
public boolean onUnbind(Intent intent) {
Log.i("onUnbind", "onUnbind");
return super.onUnbind(intent);
} @Override
public void onDestroy() {
super.onDestroy();
player.pause();
} @Override
public void onStart(Intent intent, int startId) {
super.onStart(intent, startId);
Log.i("onStart", "onStart");
String info = intent.getStringExtra("info"); if ("play".equals(info)) {// 当点击菜单中的某一首歌曲时,对播放刘备进行初始化
listDbAdapter.open();
playlist_id = intent.getExtras().getLong("playlist_id"); // 初始化播放列表id
musicid = intent.getExtras().getInt("music_id"); // 初始化所选歌曲id // 检查所点播歌曲与当前播放歌曲是否为同一首歌曲
isSameMusic(); cursor = listDbAdapter.getPlayList(playlist_id); // 获取包含播放列表中所有歌曲的结果集
// 初始化播放列表中的音乐 id、歌曲名、歌曲路径
music_id = new ArrayList<Integer>();
music_name = new ArrayList<String>();
music_path = new ArrayList<String>(); while (cursor.moveToNext()) {
music_id.add(cursor.getInt(0));
music_name.add(cursor.getString(1));
music_path.add(cursor.getString(2));
}
// 初始化所选音乐在播放列表中的位置
for (int i = 0; i < music_id.size(); i++) {
if (musicid == music_id.get(i)) {
position = i;
break;
}
}
Log.i("onStart", "onStart_out");
} player.setOnCompletionListener(new OnCompletionListener() { @Override
public void onCompletion(MediaPlayer mp) { switch (PLAY_MODELS) {
case PLAY_AUTO :// 循环播放所有歌曲
if (position == music_id.size() - 1)
position = 0;
else
position++;
play();
break;
case PLAY_ONE :// 单曲循环
play();
break;
case PLAY_RANDOM :// 随机播放
position = random.nextInt(music_id.size());
Log.i("random", "random_position=" + position);
play();
break;
}
}
});
if ("play".equals(info)) {
if (isPause) {// 暂停后,继续播放
player.start();
isPause = false;
} else if (isSame) {// 如果现在播放和与所点播歌曲时同一首,继续播放所选歌曲
player.start();
musicName.put("title", music_name.get(position));
} else {// 点播某一首歌曲
play();
}
} else if ("pause".equals(info)) {
player.pause();// 暂停
isPause = true;
} else if ("before".equals(info)) {
playBefore();// 播放上一首
} else if ("after".equals(info)) {
playAfter();// 播放下一首
}
} private void isSameMusic() {
if (position != null
&& musicid.intValue() == music_id.get(position).intValue()) {
isSame = true;
} else {
isSame = false;
}
} public void play() {
try {
player.reset();
player.setDataSource(music_path.get(position));
player.prepare();
player.start();
musicName.put("title", music_name.get(position));
} catch (Exception e) {
e.printStackTrace();
}
}
public MediaPlayer getPlayer() {
return this.player;
} public void playBefore() {
if (position == 0) {
position = music_id.size() - 1;
} else {
position--;
}
play();
}
public void playAfter() {
if (position == music_id.size() - 1) {
position = 0;
} else {
position++;
}
play();
} public Map getMusicName() {
return this.musicName;
}}