package com.android.music; import android.app.Activity; ... public class CreatePlaylist extends Activity { /* * 在OptionsMenu或者ContextMenu中选择创建新播放列表时,调用此CreatePlaylist类; */ private EditText mPlaylist; private TextView mPrompt; private Button mSaveButton; @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); setVolumeControlStream(AudioManager.STREAM_MUSIC); //设定音频控制为music; //设定窗口的基本属性 requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.create_playlist); getWindow().setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.WRAP_CONTENT); mPrompt = (TextView)findViewById(R.id.prompt); mPlaylist = (EditText)findViewById(R.id.playlist); mSaveButton = (Button) findViewById(R.id.create); mSaveButton.setOnClickListener(mOpenClicked); //设定“保存”按钮的click监听器; ((Button)findViewById(R.id.cancel)).setOnClickListener(new View.OnClickListener() { public void onClick(View v) { finish(); //取消按钮使用一个无名的button,设定当点击时直接finish activity; } }); //如果icicle为空,调用makePlaylistName获得一个默认名称 String defaultname = icicle != null ? icicle.getString("defaultname") : makePlaylistName(); if (defaultname == null) { finish(); return; } String promptformat = getString(R.string.create_playlist_create_text_prompt); //在源代码的values中定义了此string为“播放列表名称” //String.format方法用于将各类格式数据转化为字符串,此处转换结果和原来的promptformat内容一样 String prompt = String.format(promptformat, defaultname); mPrompt.setText(prompt); mPlaylist.setText(defaultname); //在edittext中显示默认的播放列表名称; mPlaylist.setSelection(defaultname.length()); mPlaylist.addTextChangedListener(mTextWatcher); //设定edittext的输入时监听器; } //edittext的输入时监听器 TextWatcher mTextWatcher = new TextWatcher() { public void beforeTextChanged(CharSequence s, int start, int count, int after) { // don't care about this one } //当edittext框的内容改变时,自动调用此方法; public void onTextChanged(CharSequence s, int start, int before, int count) { String newText = mPlaylist.getText().toString(); if (newText.trim().length() == 0) { mSaveButton.setEnabled(false); //输入内容不能为空; } else { mSaveButton.setEnabled(true); //如果输入内容不为空,调用idForplaylist来检查此名称是否已经存在,如果不存在,按钮显示为“创建”,如果已存在,显示为“覆盖”; if (idForplaylist(newText) >= 0) { mSaveButton.setText(R.string.create_playlist_overwrite_text); } else { mSaveButton.setText(R.string.create_playlist_create_text); } } }; public void afterTextChanged(Editable s) { // don't care about this one } }; //此方法用于检查播放列表名称是否以存在 private int idForplaylist(String name) { /* * 调用MusicUtils类的query静态方法,查询数据库中的播放列表的数据表 * 如果表中NAME项=参数name则返回一个包含_ID的cursor * query方法的详细解释见MusicUtils类的相关博文 */ Cursor c = MusicUtils.query(this, MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI, new String[] { MediaStore.Audio.Playlists._ID }, MediaStore.Audio.Playlists.NAME + "=?", new String[] { name }, MediaStore.Audio.Playlists.NAME); int id = -1; //将_ID的值赋给id,关闭cursor; if (c != null) { c.moveToFirst(); if (!c.isAfterLast()) { id = c.getInt(0); } c.close(); } return id; //如果查询到,返回id值,如果未查询到,则返回默认值-1 } @Override public void onSaveInstanceState(Bundle outcicle) { outcicle.putString("defaultname", mPlaylist.getText().toString()); } @Override public void onResume() { super.onResume(); } //获取一个类似于“播放列表 x”的默认播放列表名称 private String makePlaylistName() { String template = getString(R.string.new_playlist_name_template);//源代码的values中定义此string值为“新播放列表 ” int num = 1; String[] cols = new String[] { MediaStore.Audio.Playlists.NAME }; ContentResolver resolver = getContentResolver(); String whereclause = MediaStore.Audio.Playlists.NAME + " != ''"; //获取播放列表的数据表中所有播放列表的名称 Cursor c = resolver.query(MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI, cols, whereclause, null, MediaStore.Audio.Playlists.NAME); if (c == null) { return null; } String suggestedname; suggestedname = String.format(template, num++); //suggestedname值被赋为“新播放列表 2” boolean done = false; //此循环在之前的表中使用compareToIgnoreCase方法匹配最后一个形如”新播放列表 X”的名称 while (!done) { done = true; c.moveToFirst(); while (! c.isAfterLast()) { String playlistname = c.getString(0); if (playlistname.compareToIgnoreCase(suggestedname) == 0) { //匹配之后,把名称更新为“新播放列表 X+1” suggestedname = String.format(template, num++); done = false; } c.moveToNext(); } } c.close(); return suggestedname; } private View.OnClickListener mOpenClicked = new View.OnClickListener() { public void onClick(View v) { String name = mPlaylist.getText().toString(); if (name != null && name.length() > 0) { ContentResolver resolver = getContentResolver(); int id = idForplaylist(name); //检查此name是否已存在 Uri uri; if (id >= 0) { //若id>=0则覆盖一个旧的播放列表。向playlist的uri后添加id值,则此uri可以直接定位此条数据库记录 uri = ContentUris.withAppendedId(MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI, id); MusicUtils.clearPlaylist(CreatePlaylist.this, id); //清空此播放列表 } else { //若id<0则创建一个新播放列表,使用insert向数据库中插入此新记录 ContentValues values = new ContentValues(1); values.put(MediaStore.Audio.Playlists.NAME, name); uri = resolver.insert(MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI, values); } setResult(RESULT_OK, (new Intent()).setData(uri)); finish(); } } }; }