EntryNavi : « Android携帯の音楽のプレイリストの動作について調査しました | メイン | Google Codeはじめました »

CategoryNavi : メイン -> コンピューター -> 開発 -> Java(Android)

Androidでユーザープレイリストを管理する方法

プレイリストの情報の取得はできるのにそこへ曲へ追加する方法って言うのが調べてもなかなか出てこなかったので紹介します。

取得方法は、我らがAndroid 名古屋つ部部長の塚田氏の著書を見ていただくとして
AndroidSDK開発のレシピ―104個のレシピで学ぶAndroidアプリ開発の極意

一気に本題いきます。

まず、気をつけなければいけないのが Galaxyシリーズ。なんと行ってもこれ。
Android携帯に登録されているプレイリストを取得する時の罠で、紹介したとおり情報を取得する時のURIが違います。
そしてプレイリストを操作するときもこのURIを使用します。
なので注意です。


サンプルコード的にはこんな感じです
	public boolean isGalaxy(){
		return true;
	}
	
	/**
	 * プレイリストを新規作成する
	 * @param name プレイリストの名前
	 * @param images_uri サムネイル画像のURI(Galaxyのみ)
	 * @param thumb サムネイル画像のURIの文字列(Galaxyのみ)
	 * 
	 * 基本的に名前を指定してクエリー実行でOKです。
	 * Galaxyの場合は、サムネイル画像を指定する事ができます。
	 * 
	 */
	public void addPlaylist(String name, Uri images_uri, String thumb){
		ContentValues contentvalues = null;
		ContentResolver contentResolver = getContentResolver();
		Uri result_uri = null;
		Uri playlist_uri = null;
		int result = -1;
		
		if(isGalaxy()){
			//Galaxyの場合の必要データ作成
			
			//URI
			playlist_uri = Uri.parse("content://media/external/audio/music_playlists");
			//データ作成
			int image_index = -1;
			if(images_uri != null){
				image_index = (int)ContentUris.parseId(images_uri);
			}
			contentvalues = new ContentValues();
			contentvalues.put("name", name);
			contentvalues.put("images_id", image_index);
			contentvalues.put("thumbnail_uri", "");
		}else{
			//標準的な端末の必要データ作成
			
			//URI
			playlist_uri = MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI;
			//データ作成
			contentvalues = new ContentValues();
			contentvalues.put("name", name);
		}
		
		//追加
		result_uri = contentResolver.insert(playlist_uri, contentvalues);
		
		if(result_uri == null){
			//NG
			Log.d("test", "fail add playlist : " + name + ", is null");
		}else if((result = (int)ContentUris.parseId(result_uri)) == -1){
			//NG
			Log.d("test", "fail add playlist : " + name + ", " + result_uri.toString());
		}else{
			//OK
			Log.d("test", "add playlist : " + name + "," + result);
		}
	}

	/**
	 * プレイリストの名前を変更する
	 * @param id プレイリストのID
	 * @param name 新しい名前
	 */
	public void updatePlaylist(int id, String name){
		ContentResolver contentResolver = getContentResolver();
		ContentValues contentvalues = null;
		Uri uri = null;
		String as[];
		int result = -1;
		
		//URIの作成
		if(isGalaxy()){
			uri = Uri.parse("content://media/external/audio/music_playlists");
		}else{
			uri = MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI;
		}
		//登録データの作成
		contentvalues = new ContentValues(1);
		contentvalues.put("name", name);
		as = new String[1];
		as[0] = Integer.toString(id);
		//変更
		result = contentResolver.update(uri, contentvalues, "_id = ?", as);
		if(result != 1){
			Log.d("test", "fail update playlist : " + name + ", " + result);
		}else{
			Log.d("test", "update playlist : " + name + ", " + result);
		}
	}

	/**
	 * プレイリストの最大のplay_orderを取得する
	 * @param playlist_id
	 * @return
	 */
	public int getUserListMaxPlayOrder(int playlist_id){
		int ret = -1;
		ContentResolver contentResolver = getContentResolver();
		Uri uri = null;
		
		if(isGalaxy()){
			uri = Uri.parse("content://media/external/audio/music_playlists/" + playlist_id + "/members");;
		}else{
			uri = MediaStore.Audio.Playlists.Members.getContentUri("external", playlist_id);
		}
		String as[] = new String[1];
		as[0] = " max(play_order)";
		String s = "playlist_id = " + playlist_id;
		Cursor cursor = contentResolver.query(uri, as, s, null, null);
		if(cursor == null){
		}else{
			cursor.moveToFirst();
			ret = cursor.getInt(0);
			cursor.close();
		}
		return ret;
	}


	/**
	 * プレイリストへ曲を追加する
	 * @param playlist_id 追加対象のプレイリストのID(標準端末・Galaxyの共通で使用します)
	 * @param audio_id 追加する曲のID(標準端末で使用します)
	 * @param data 追加する曲のフルパスの文字列(Galaxyで使用します)
	 * @param data_hash 追加する曲のハッシュコード(Galaxyで使用します)
	 */
	public void addMusicToPlaylist(int playlist_id, int audio_id, String data, int data_hash){
		ContentResolver contentResolver = getContentResolver();
		ContentValues contentvalues = new ContentValues();
		Uri uri = null;
		
		if(contentResolver == null){
		}else{

			Uri result_uri = null;
            contentvalues.put("play_order", getUserListMaxPlayOrder(playlist_id) + 1);
			
    		if(isGalaxy()){
    			uri = Uri.parse("content://media/external/audio/music_playlists/" + playlist_id + "/members");;
				contentvalues.put("audio_data", data);
				contentvalues.put("audio_data_hashcode", data_hash);
    		}else{
    			uri = MediaStore.Audio.Playlists.Members.getContentUri("external", playlist_id);
                contentvalues.put("audio_id", Integer.valueOf(audio_id));
    		}

			//追加
			result_uri = contentResolver.insert(uri, contentvalues);
			if(result_uri == null){
				//NG
				Log.d("test", "fail add music : " + playlist_id + ", " + audio_id + ", is null");
			}else if(((int)ContentUris.parseId(result_uri)) == -1){
				//NG
				Log.d("test", "fail add music : " + playlist_id + ", " + audio_id + ", " + result_uri.toString());
			}else{
				//OK
				Log.d("test", "add music : " + playlist_id + ", " + audio_id + ", " + result_uri.toString());
			}
		}
	}


	/**
	 * プレイリストから曲を削除する
	 * @param ids 削除対象のIDの配列
	 */
	public void removeMusicFromPlaylists(int playlist_id, int[] ids){
		Uri uri = null;
		if(isGalaxy()){
			uri = Uri.parse("content://media/external/audio/music_playlists/" + playlist_id + "/members");
		}else{
			uri = MediaStore.Audio.Playlists.Members.getContentUri("external", playlist_id);
		}
		removeItems(uri, ids);
	}

	/**
	 * プレイリストを削除する
	 * @param ids 削除対象のIDの配列
	 */
	public void removePlaylists(int[] ids){
		Uri uri = null;
		if(isGalaxy()){
			uri = Uri.parse("content://media/external/audio/music_playlists");
		}else{
			uri = MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI;
		}
		removeItems(uri, ids);
	}
	

	/**
	 * 登録されているアイテムを削除する
	 * @param uri 削除URI
	 * @param ids 削除するIDの配列
	 */
	protected void removeItems(Uri uri, int[] ids){
		ContentResolver contentResolver = getContentResolver();
		
		if(uri == null || ids == null){
		}else{
			String where = "_id IN(";
			for(int i=0; i<ids.length; i++){
				where += Integer.valueOf(ids[i]);
				if(i < (ids.length -1)){
					where += ", ";
				}
			}
			where += ")";
			//削除
			contentResolver.delete(uri, where, null);
		}		
	}

<Category : Java(Android)>

検索

Google

サイドフィード

track feed 理ろぐ
人気ブログランキング - 理ろぐ
Powered by
Movable Type 3.34