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;
}}

解决方案 »

  1.   


    -----------------------------------------------------------------------------------------------------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;
    }}
      

  2.   

    cursor未关闭~~加上cursor.close();
      

  3.   

    原因挺简单,就是使用完cursor后没有及时关闭