일단 그냥 기록용!

안드로이드로 음악플레이어를 만드려면 안드로이드용 음악 라이브러리에서 데이터를 가져와야합니다. 안드로이드는 자체적으로 Song, Artist, Album, Genre 등의 데이터를 sdcard에서 미디어스캔을 해서 데이터베이스를 구축합니다.
이 구축한 것을 자체적인 sqlite에 저장을 하는데, 이것을 앱에서 불러와서 쓸 수 있습니다. 뭐 Song테이블에서 해당 곡에 대한 경로까지 다 저장하고 있어서 불러와서 데이터를 보여줄 수 있는 그런 앱을 만들 수 있습니다.

간단한 예제로 아티스트 목록을 가져오는 것을......


package com.mudchobo.test.musiclibrarytest;

import java.util.ArrayList;
import java.util.List;

import android.app.ListActivity;
import android.database.Cursor;
import android.os.Bundle;
import android.provider.MediaStore;
import android.widget.ArrayAdapter;

public class MusicLibraryTestActivity extends ListActivity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        List<String> artists = getArtists();
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, artists);
        setListAdapter(adapter);
    }
    
    public List<String> getArtists() {
    	List<String> list = new ArrayList<String>();
		String[] cursorColumns = new String[] {
				MediaStore.Audio.Artists._ID,
				MediaStore.Audio.Artists.ARTIST
		};
		Cursor cursor = (Cursor) getContentResolver().query(
				MediaStore.Audio.Artists.EXTERNAL_CONTENT_URI,
				cursorColumns, null, null, null);
		
		if (cursor == null) {
			return list;
		}
		if (cursor.moveToFirst()) {
			int idColumn = cursor.getColumnIndex(MediaStore.Audio.Artists._ID);
			int artistColumn = cursor.getColumnIndex(MediaStore.Audio.Artists.ARTIST);
			do
			{
				String artist = cursor.getString(artistColumn);
				list.add(artist);
			} while (cursor.moveToNext());
		}
		cursor.close();
		return list;
    }
}



아 귀차나서...초간단 소스를......
getArtists함수를 주목해서.....
getContentResolver().query()함수를 보면 그냥 저 테이블에서 쿼리를 날려서 cursor를 얻어옵니다.
cursor를 돌려가면서 값을 가져오면 아티스트명을 가져오게 됩니다.
그리고 이 아티스트테이블에 보면 칼럼이 4개가 있습니다. 아래사이트에 확인!
http://developer.android.com/reference/android/provider/MediaStore.Audio.ArtistColumns.html
이런 식으로 해서 가져오는데, 막상 보면 sqlite로 쿼리날리는 것과 같습니다. 직접 쿼리를 날려도 가져올 수 있구요^^

그 외의 Song테이블이라던지, Album테이블, Playlist테이블 같은 것도 위와 같은 방법으로 다 가져오고, 삽입하는 것도 가능합니다.
플레이리스트는 MediaStore.Audio.Playlists 이곳 테이블에 insert하면 되고~
이건 플레이르스트 곡목록 관련된 것들 MediaStore.Audio.Playlists.Members
앨범은 MediaStore.Audio.Albums
곡은 MediaStore.Audio.Media
장르는 MediaStore.Audio.Genres
등등~

PS. 근데, 이거 테이블 구조 같은 것을 잘 정리한 곳이 왜 없죠?-_- 내가 못찾는 건가... 안드로이드 사이트 가도 없는 것 같은데....
 
Posted by 머드초보

댓글을 달아 주세요

 
우선 RESTFul로 구현된 WebService를 Flex에서 호출하기 위해서는 클라이언트에서 method방식이 GET, POST, DELETE, PUT을 지원을 해야합니다. 근데, 제가 RESTful WebService를 만들었는데요. 만들어놓고, 자체 GlassFish에서 제공하는 RESTful WebService Test로는 무쟈게 잘 돌아갔습니다.
근데, Flex에서 제공하는 HTTPService를 이용해서 method는 DELETE로 놓은다음에 http요청을 해봤습니다. 이게 왠걸......POST로 요청이 되는 듯해서 데이터를 가져오고 있습니다-_-; 지워야하는데!

그래서 검색을 해보니.......
http://verveguy.blogspot.com/2008/07/truth-about-flex-httpservice.html
저의 짧은 영어실력으로 보니.......
4/ All HTTP PUT and HTTP DELETE requests are turned into POST requests. This appears to be a browser limitation that the Flash player is stuck with.
라고 되어있군요. PUT과 DELETE는 POST로 요청이 된다고 하는 것 같습니다. 플래쉬플레이어가 브라우저 제한에 뭐 걸린 것으로 보인다고 말하는데요. 해석이 잘 안되네요-_-;

그래서! 검색해본 결과 REST요청을 위한 라이브러리를 누가 만들었더군요. 대단합니다 ^^ 어차피 HTTP요청도 해당 포트로 뭐 데이터를 주고 받는 것이다 보니, 이것을 소켓으로 구현을 했더군요.

http://lab.arc90.com/2008/03/restservice.php

기존 HTTPService랑 틀린 것이...얘는 소켓을 통해서 쏘기 때문에 포트를 지정해줘야합니다. 그리고 arc90에서 만든 ResultEvent랑 FaultEvent를 사용해야합니다.

서버측 코드를 보면
[code]
@DELETE
    public Response delete() {
        PersistenceService persistenceSvc = PersistenceService.getInstance();
        try {
            Wsboard entity = getEntity();
            if (entity.getPwd().equals(pwd))
            {
                persistenceSvc.beginTx();
                persistenceSvc.removeEntity(entity);
                persistenceSvc.commitTx();
               
                return Response.ok("success").build();
            }
        } finally {
            persistenceSvc.close();
        }
        return Response.ok("fail").build();
    }
[/code]
그냥 단순히 비밀번호가 같으면 지워서 응답을 success로 주고, 틀리면 fail로 줍니다.

이제 플렉스에서 봅시다.
[code]
<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml"
    layout="absolute"
    creationComplete="init()" xmlns:rest="com.arc90.rpc.rest.*">
   
    <mx:Script>
        <![CDATA[
            import com.arc90.rpc.events.FaultEvent;
            import com.arc90.rpc.events.ResultEvent;
            import mx.controls.Alert;
           
            private function init():void
            {       
                service.send();               
            }

            private function result(event:ResultEvent):void
            {
                Alert.show(event.result.toString());
            }   
           
            private function fault(event:FaultEvent):void
            {
                Alert.show(event.fault.toString());
            }       
        ]]>
    </mx:Script>
    <rest:RESTService id="service"
        port="9080" url="http://localhost/BoardWS/resources/wsboards/22/1"
        result="result(event)" fault="fault(event)" method="DELETE">
    </rest:RESTService>
   
</mx:WindowedApplication>
[/code]
포트를 port라고 해서 따로 지정해줍니다.
저 웹서비스가 {idx}/{pwd} 형식의 url을 요청합니다. DB에는 22번의 idx를 가지고 pwd가 1인 데이터가 있습니다. 저렇게 요청하면 지워집니다.

사용자 삽입 이미지
ps. 정말 적절하지 못한 웹서비스군-_-;
 
Posted by 머드초보

댓글을 달아 주세요