일단 그냥 기록용!

안드로이드로 음악플레이어를 만드려면 안드로이드용 음악 라이브러리에서 데이터를 가져와야합니다. 안드로이드는 자체적으로 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 머드초보
,