안드로이드 어플을 개발하다보면, DataBase를 사용해야 하는 경우가 간혹있다. 우리가 많이 사용하는 전화번호부, 일정관리 어플, 메시지 프로그램들이 모두가 DB를 자체적으로 사용하고 있는 것들이다.


안드로이드는 프레임웍에서 SQLite를 사용하기 쉽게 제공하고 있다. 그래서 오늘은 정말 정말 정말, 간단한 진짜 아무런 기능이 아직 준비되어 있지 않은 기본적인 Provider의 기본중의 기본 클래스만 만들어서 공유하고자 한다. 이후 DB를 사용하거나, openFile(API 9 GingerBread 부터 지원)과 같은 API를 사용해서 기능을 붙여나가고 진짜 DB를 써야 할 이유가 있을때 적절한 설명과 예제를 공유하도록 하겠지만, 오늘은 정말 기 기초적인 Provider의 껍데기만을 만들어뒀다.


나중에 필요할일이 생기면 그대로 복사해서 필요한 것들 추가하고 바로 사용할수 있게함이 목적이다.


Provider를 만들기 위해서는 AndroidManifest.xml에 provider를 선언해줘야 한다, ContentProvider는 내부적으로 Binder Interface를 통해서 IPC를 지원하고 있다.그래서 Manifest File에 내가 제공하는 provider정보를 명세해주어야지 다른 어플에서도 내가 제공하는 Provider의 Authority로 DB를 접근할수 있게 할수있다.


1. AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.hoepisagoodthing.simpleprovider"
    android:versionCode="1"
    android:versionName="1.0">

    <uses-sdk android:minSdkVersion="9" android:targetSdkVersion="15" />

    <application android:label="@string/app_name"
        android:icon="@drawable/ic_launcher"
        android:theme="@style/AppTheme">
        
        <provider
            android:authorities="com.hopeisagoodthing.simpleprovider"
            android:enabled="true"
            android:exported="true"            
            android:label="Coolkim"
            android:name="com.hopeisagoodthing.simpleprovider.Provider"
            android:syncable="false" >
        </provider>

    </application>

</manifest>




2. Provider와 DataBaseHelper Class

package com.hopeisagoodthing.simpleprovider;

import java.io.File;
import java.io.FileNotFoundException;

import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.net.Uri;
import android.os.ParcelFileDescriptor;
import android.util.Log;
import android.util.SparseArray;

public class Provider extends ContentProvider{
	private static final String TAG="Provider";
	private static final String authority = "com.hopeisagoodthing.simpleprovider";
	private SQLiteOpenHelper dbHelper;
	private SQLiteDatabase db;
	private UriMatcher uriMatcher;
	
	private interface Scheme{
		interface Table{
			static final String NAME="name";
			static final String ADDR="address";
			static final String INTEREST="interest";
		}
		interface Match{
			static final int NAME=1;
			static final int ADDR=2;
			static final int INTEREST=3;
		}		
	}	
	
	private static final SparseArray<Stringgt; tableMap = new SparseArraylt;Stringgt;();
	static{
		tableMap.put(Scheme.Match.NAME, Scheme.Table.NAME);
		tableMap.put(Scheme.Match.ADDR, Scheme.Table.ADDR);
		tableMap.put(Scheme.Match.INTEREST, Scheme.Table.INTEREST);		
	}

	@Override
	public int delete(Uri uri, String selection, String[] selectionArgs) {
		int 	match 	= uriMatcher.match(uri);
		switch(match){
		case Scheme.Match.NAME:
			break;
		
		case Scheme.Match.ADDR:
			break;
			
		case Scheme.Match.INTEREST:
			break;
			
		default:
			throw new UnsupportedOperationException();			
		}
		
		return db.delete(tableMap.get(match), selection, selectionArgs);		
	}

	@Override
	public String getType(Uri uri) {
		int 	match 	= uriMatcher.match(uri);
		switch(match){
		case Scheme.Match.NAME:
			break;
		
		case Scheme.Match.ADDR:
			break;
			
		case Scheme.Match.INTEREST:
			break;
			
		default:
			throw new UnsupportedOperationException();	
		}
		return null;
	}

	@Override
	public Uri insert(Uri uri, ContentValues values) {
		int 	match 	= uriMatcher.match(uri);
		switch(match){
		case Scheme.Match.NAME:
			break;
		
		case Scheme.Match.ADDR:
			break;
			
		case Scheme.Match.INTEREST:
			break;
			
		default:
			throw new UnsupportedOperationException();	
		}
		
		long rowId =  db.insert(tableMap.get(match), null, values);
		uri = ContentUris.withAppendedId(uri, rowId);
		getContext().getContentResolver().notifyChange(uri, null);
		return uri;
	}

	@Override
	public boolean onCreate() {
		dbHelper 	= new SimpleDatabaseHelper(getContext());
        db 		= dbHelper.getWritableDatabase();
        uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);

        uriMatcher.addURI(authority, Scheme.Table.NAME, Scheme.Match.NAME);       
        uriMatcher.addURI(authority, Scheme.Table.ADDR,Scheme.Match.ADDR); 
        uriMatcher.addURI(authority, Scheme.Table.INTEREST, Scheme.Match.INTEREST);
       
		return true;		
	}

	@Override
	public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
		int 	match 	= uriMatcher.match(uri);
		switch(match){
		case Scheme.Match.NAME:
			break;
		case Scheme.Match.ADDR:
			break;
		case Scheme.Match.INTEREST:
			break;
			
		default:
			throw new UnsupportedOperationException();	
		}
		
		return db.query(tableMap.get(match), projection, selection, selectionArgs, null, null, sortOrder);
		
	}

	@Override
	public int update(Uri uri, ContentValues values, String selection,
			String[] selectionArgs) {
		int 	match 	= uriMatcher.match(uri);
		switch(match){
		
		case Scheme.Match.NAME:
			break;
		
		case Scheme.Match.ADDR:
			break;
		
		case Scheme.Match.INTEREST:
			break;
			
		default:
			throw new UnsupportedOperationException();	
		}
		
		
		return db.update(tableMap.get(match), values, selection,selectionArgs);
	}
	
	@Override
	public ParcelFileDescriptor openFile (Uri uri,String mode){
		ParcelFileDescriptor fd = null;
		
		String filename = uri.getQueryParameter("filename");
		if(filename == null || filename.isEmpty()){
			throw new UnsupportedOperationException();
		}
		File dir = getContext().getFilesDir();
		if(dir.exists() == false){
			dir.mkdir();
		}
		String filepath = dir.getAbsolutePath()+ "/" +filename;
	    try {
			fd = ParcelFileDescriptor.open(new File(filepath), ParcelFileDescriptor.MODE_CREATE|ParcelFileDescriptor.MODE_READ_WRITE);
		} catch (FileNotFoundException e) {
			Log.e(TAG,"Unable to open file "+ filepath);
		}		
		return fd;		
	}
	
	@Override
	public int bulkInsert(Uri uri, ContentValues[] values) {
		long 	rowId 		= -1;
		int 	count = 0;
		int 	match 	= uriMatcher.match(uri);
			
		db.beginTransaction();
					
		switch(match){
		
		case Scheme.Match.NAME:
			break;
		
		case Scheme.Match.ADDR:
			break;
		
		case Scheme.Match.INTEREST:
			break;
		
		default:
			throw new UnsupportedOperationException();	
		}
		
		for(ContentValues value:values){
			rowId = db.insert(tableMap.get(match), null, value);
			if(rowId > 0 ){
				count++;
			}
		}
		
		db.setTransactionSuccessful();			
		
		db.endTransaction();
		uri = ContentUris.withAppendedId(uri, rowId);
		getContext().getContentResolver().notifyChange(uri, null);
		return count;
	}
	
	private class SimpleDatabaseHelper extends SQLiteOpenHelper {	
		private static final String DATABASE_NAME = "simple.db";
		private static final int DATABASE_VERSION = 1;
		private static final String NAME_TABLE_CREATE = "CREATE TABLE "
				+ "name" + " (" 
				+ "_id" + " INTEGER PRIMARY KEY AUTOINCREMENT," 
				+ "name" + " TEXT "+");";
		
		private static final String ADDRESS_TABLE_CREATE = "CREATE TABLE "
				+ "address" + " (" 
				+ "_id" + " INTEGER PRIMARY KEY AUTOINCREMENT," 
				+ "address" + " TEXT ," 
				+ "name_id" + " INTEGER " + ");";
		
		private static final String INTEREST_TABLE_CREATE = "CREATE TABLE "
				+ "interest" + " (" 
				+ "_id" + " INTEGER PRIMARY KEY AUTOINCREMENT,"				
				+ "interest" + " TEXT ," 
				+ "name_id" + " INTEGER " + ");";
		
		protected SimpleDatabaseHelper(Context context) {
			super(context, DATABASE_NAME, null, DATABASE_VERSION);
		}

		@Override
		public void onCreate(SQLiteDatabase db) {
			try {				
				db.execSQL(NAME_TABLE_CREATE);	
				db.execSQL(ADDRESS_TABLE_CREATE);
				db.execSQL(INTEREST_TABLE_CREATE);
			} catch (Exception e) {
				Log.e(TAG, "onCreate: Exception - " + e.getMessage());
			}
		}

		@Override
		public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		}
	}
}

블로그 이미지

커뉴

이 세상에서 꿈 이상으로 확실한 것을, 인간은 가지고 있는 것일까?

,

자바 표준으로 URL class등을 사용하여 네트워크 리소스를 사용할수도 있지만, 각종 설정들을 조절하고 더 사용하기 쉬운방법이 있는데, 그것이 바로 HttpClient Class를 사용하는 방법이다.


GET, POST 메소드등을 빈번하게 구분해서 사용하고, 각종 http 네트워크 리소스들을 사용자화 해서 개발할 필요가 있다면, URL class를 사용하는 것도 좋지만, HttpClient를 사용하는 방법도 알아두는 것도 권할만하다.


참고로, 내가 참여하고 있는 프로젝트는 HttpClient Class만을 사용하여 각종 데이터 싱크등을 구현하였다.


사용하는 법 자체는 쉽다.


package com.hopeisagoodthing.samplehttpclient;

import java.io.IOException;

import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpVersion;
import org.apache.http.ParseException;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.params.HttpClientParams;
import org.apache.http.conn.ClientConnectionManager;
import org.apache.http.conn.scheme.PlainSocketFactory;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.scheme.SchemeRegistry;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;
import org.apache.http.params.HttpProtocolParams;
import org.apache.http.protocol.HTTP;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
import android.widget.TextView;

public class MainActivity extends Activity {
	private static final String TAG = "MainActivity";
	private static TextView textView = null;
	private static Handler handler = new Handler(){
		public void handleMessage(final Message msg) {			
			textView.setText(Integer.toString((Integer) msg.obj));
		};		
	};

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);	
		textView = (TextView) findViewById(R.id.result_text);
		Thread thread = new Thread(mRunnable);
		thread.start();
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		getMenuInflater().inflate(R.menu.activity_main, menu);
		
		return true;
	}	
	
	private Runnable mRunnable = new Runnable() {
		@Override
		public void run() {
			try {
				final String url = "http://coolkim.tistory.com";
				final HttpGet get = new HttpGet(url);
				final HttpClient httpClient = getHttpClient();
				final HttpResponse httpResponse = httpClient.execute(get);
				handleResponse(httpResponse);
			} catch (ClientProtocolException e) {
				Log.e(TAG, "ERROR : ClientProtocolException");

			} catch (IOException e) {
				Log.e(TAG, "ERROR :  IOException");
			}

		}
	};

	private HttpClient getHttpClient() {
		HttpClient httpClient = null;
		try {
			final HttpParams params = new BasicHttpParams();

			// PARAMS
			HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
			HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);
			HttpConnectionParams.setConnectionTimeout(params, 1000 * 30); // 30s timeout.
			HttpConnectionParams.setSoTimeout(params, 1000 * 30); // 30s timeout.
			HttpConnectionParams.setSocketBufferSize(params, 512 * 1024);
			HttpConnectionParams.setStaleCheckingEnabled(params, false);
			HttpClientParams.setRedirecting(params, false);
			params.setParameter(HttpProtocolParams.USE_EXPECT_CONTINUE, false);

			// SCHEME
			final SchemeRegistry registry = new SchemeRegistry();
			registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
			registry.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));

			final ClientConnectionManager ccm = new ThreadSafeClientConnManager(params, registry);

			httpClient = new DefaultHttpClient(ccm, params);
		} catch (Exception e) {
			httpClient = new DefaultHttpClient();
		}

		return httpClient;
	}
	
	private void handleResponse(final HttpResponse httpResponse) {
		final int status = httpResponse.getStatusLine().getStatusCode();
		
		try {			
			Message msg = handler.obtainMessage();
			msg.obj = status;
			handler.sendMessage(msg);			
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}		
	}	
}


블로그 이미지

커뉴

이 세상에서 꿈 이상으로 확실한 것을, 인간은 가지고 있는 것일까?

,

검색 엔진은 아니더라도, twitter에도 검색 하는  api를 제공하고 있어서 만들어본 twitter 검색하는 방법.

트위터는 아주 바람직한 서비스인것 같다, 어떤 트윗들이 요새 떠다니는지 검색도 할수 있게 해주고, 

또 여러가지 옵션으로 원하는대로 검색을 할수 있으니!!!


그리고 JSON을 지원해줌..(나는 JSON을 너무 사랑함ㅋㅋㅋㅋ, 영어 이름을 jason이라고 지을까 싶다..)


https://dev.twitter.com/docs/api/1/get/search  --> 너무나 간단한 Twitter 검색 API 사용법.



package com.hopeisagoodthing.searchtool;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.util.Log;


public class TwitterSearch implements ISearch
{
	private static final String TAG = "TwitterSearch";
	private static final String BASE_URL = "https://search.twitter.com/search.json";
	private static final String[] TARGETS = new String[]{"?"};
		
	private static final String RESULT_TYPE ="recent";
	private static final class PARAM{		
		private static final String QUERY = "q=";// always start with this parameter!!!		
		private static final String RESULT_SIZE = "&rpp=";
		private static final String RESULT_TYPE = "&result_type=";		
	}	
	private static final String RESULTS = "results";				// json array.
	private static final String TEXT = "text";				// json obj
	
	private final List<String> mAnalyzedList = new ArrayList<String>();
	
	@Override
	public List<String> getAnalyze(final String query, final int resultSize, final IAnalyzer analyzer) {		
		mAnalyzedList.clear();		
		
		final StringBuilder builder = new StringBuilder();
		for(String target : TARGETS)
		{
			URL url = null;
			try {
				url = new URL(	BASE_URL + target+									
									PARAM.QUERY + URLEncoder.encode(query, "UTF-8") + 
									PARAM.RESULT_TYPE+RESULT_TYPE+
									PARAM.RESULT_SIZE+resultSize*20);
			} catch (MalformedURLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (UnsupportedEncodingException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}			
			
			builder.setLength(0);
			try {
				URLConnection connection = null;
				String line = null;			
				BufferedReader reader = null;
				connection = url.openConnection();
				//connection.addRequestProperty("Referer", /* Enter the URL of your site here */);
				reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
				while((line = reader.readLine()) != null) {
					 builder.append(line);
				}				 
			} catch (IOException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}

			try {
				Log.e(TAG,"Google Result START============================================================");
				final JSONObject json = new JSONObject(builder.toString());
				final JSONArray resultArray = json.getJSONArray(RESULTS);
				
				final int arraySize = resultArray.length();
				for(int i = 0; i< arraySize ; i++)
				{
					final JSONObject result = resultArray.getJSONObject(i);
					final String content = result.getString(TEXT);					
					analyzer.analyze(content,mAnalyzedList);				
				}
				Log.e(TAG,"Google Result END ============================================================");
			} catch (JSONException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
		return mAnalyzedList;		
	}	
}


블로그 이미지

커뉴

이 세상에서 꿈 이상으로 확실한 것을, 인간은 가지고 있는 것일까?

,

구글은 Cusom Search API라는 유료 검색 모델을 지금 엄청 밀고 있는 중인데, 검색  api를 사용하기 위해서 돈을 지불하면서 까지 사용해야 하는 의문이 생겨서, 이전까지 무료로 제공되던 web search api를 사용했다.(이것도 곧 ... 없어질지도 모르겠다. ㅠ.ㅠ)


구글이 자꾸 왜 그러는건지 .... Google App Engine도 과금정책을 바꿔서 기존까지 무료로도 이용이 가능하던 서비스들이 이제는 돈을 낼수 밖에 없는 모델로 계속 바꾸고 있는 것 같다.  



https://developers.google.com/web-search/docs/ --> 현재는 deprecated 되어서 구글의 정책에 의해서 지원이 중단될지도 모르지만, web search api 있는 곳


구글의 검색 api는 JSON을 역시 지원하고, 아래 굵은 표시 된 부분을 조심해서 사용해주면 된다. 버전 설정이라던지 사이즈 설정이라던지 하는 부분이 잘못되면 에러만 리턴된다.



package com.hopeisagoodthing.searchtool;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.util.Log;


public class GoogleSearch implements ISearch
{
	private static final String TAG = "GoogleSearch";
	private static final String BASE_URL = "https://ajax.googleapis.com/ajax/services/search/";
	private static final String[] TARGETS = new String[]{"web?","news?","blogs?"};
	private static final String VERSION="1.0";	
	private static final int START = 1;
	private static final class PARAM{
		private static final String VERSION = "v=";	// always start with this parameter!!!
		private static final String QUERY = "&q=";		
		private static final String START = "&start=";
		private static final String RESULT_SIZE = "&rsz=";
	}	
	private static final String RESPONSE_DATA = "responseData";	// json obj
	private static final String RESULTS = "results";				// json array.
	private static final String CONTENT = "content";				// json obj
	
	private final List<String> mAnalyzedList = new ArrayList<String>();
	
	@Override
	public List<String> getAnalyze(final String query, final int resultSize, final IAnalyzer analyzer) {		
		mAnalyzedList.clear();	


		int realResultSize = 8;
		if(resultSize < 9)
		{
			realResultSize = resultSize;
		}
		
		final StringBuilder builder = new StringBuilder();
		for(String target : TARGETS)
		{
			URL url = null;
			try {
				url = new URL(	BASE_URL + target+
									PARAM.VERSION+VERSION+
									PARAM.QUERY + URLEncoder.encode(query, "UTF-8") + 
									PARAM.START +START+
									PARAM.RESULT_SIZE+realResultSize);
			} catch (MalformedURLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (UnsupportedEncodingException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

			
			
			builder.setLength(0);
			try {
				URLConnection connection = null;
				String line = null;			
				BufferedReader reader = null;
				connection = url.openConnection();
				//connection.addRequestProperty("Referer", /* Enter the URL of your site here */);
				reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
				while((line = reader.readLine()) != null) {
					 builder.append(line);
				}				 
			} catch (IOException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}

			try {
				Log.e(TAG,"Google Result START============================================================");
				final JSONObject json = new JSONObject(builder.toString());
				final JSONObject resultsJson = json.getJSONObject(RESPONSE_DATA);
				final JSONArray resultArray = resultsJson.getJSONArray(RESULTS);
				
				final int arraySize = resultArray.length();
				for(int i = 0; i< arraySize ; i++)
				{
					final JSONObject result = resultArray.getJSONObject(i);
					final String content = result.getString(CONTENT);
					analyzer.analyze(content,mAnalyzedList);				
				}
				Log.e(TAG,"Google Result END ============================================================");
			} catch (JSONException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
		return mAnalyzedList;		
	}	
}
블로그 이미지

커뉴

이 세상에서 꿈 이상으로 확실한 것을, 인간은 가지고 있는 것일까?

,

최근 개인 프로젝트를 하나 진행할 일이 있어, 안드로이드용으로 unit test를 진행하던중 검색 엔진을 직접 사용하는 방법에 대해서 한번 정리가 필요할 것 같아서 정리해본다. 


그 첫 번째 포스팅으로 이번은 DAUM api에 한해서만 정리한다.


일단 DAUM에서 제공하는 API를 사용하려면 다음 주소로 가서 한번 전체적으로 쑤욱 훓어봐야 한다.

http://dna.daum.net/apis/view_all   --> 여기는 전체 API들이 나오는곳

http://dna.daum.net/apis/search  --> 검색 API는 여기로~~


나는 검색 엔진만 사용할것이니까, 검색 API로 가서 한번 쑥 훓어보고 왔다. 사실 별거 없었다 .=_=






package com.hopeisagoodthing.searchtool;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.util.Log;


public class DaumSearch implements ISearch
{
	private static final String TAG = "DaumSearch";
	private static final String BASE_URL = "http://apis.daum.net/search/";
	private static final String[] TARGETS=new String[]{"web?","blog?","board?","cafe?",};
	private static final String API_KEY="여기에자신의api key값을 넣어주면 됨";
	private static final String OUTPUT = "json";
	private static final class PARAM{
		private static final String API_KEY = "apikey=";	// always start with this parameter!!!
		private static final String OUTPUT = "&output=";
		private static final String QUERY = "&q=";		
		private static final String RESULT = "&result=";
	}	
	private static final String CHANEL = "channel";	        // json obj
	private static final String ITEM = "item";				// json array.
	private static final String DESC = "description";		// json obj
	
	private final List<String> mAnalyzedList = new ArrayList<String>();
	
	@Override
	public List<String> getAnalyze(final String query, final int resultSize, final IAnalyzer analyzer) {		
		mAnalyzedList.clear();	

		final StringBuilder builder = new StringBuilder();
		for(String target:TARGETS)
		{
			URL url = null;
			try {
				url = new URL(	BASE_URL + target +
									PARAM.API_KEY+ API_KEY +
									PARAM.OUTPUT + OUTPUT+
									PARAM.QUERY + URLEncoder.encode(query, "UTF-8") + 
									PARAM.RESULT+resultSize);
			} catch (MalformedURLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (UnsupportedEncodingException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

			
			builder.setLength(0);
			try {
				String line = null;
				URLConnection connection = null;
				BufferedReader reader = null;
				connection = url.openConnection();
				
				//connection.addRequestProperty("Referer", /* Enter the URL of your site here */);

				reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
				
				while((line = reader.readLine()) != null) {
					 builder.append(line);
					}
				
			} catch (IOException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
		
		
			try {
				Log.e(TAG,"DAUM Result START============================================================");
				//Log.e(TAG,builder.toString());
				final JSONObject json = new JSONObject(builder.toString());
				final JSONObject resultsJson = json.getJSONObject(CHANEL);
				final JSONArray resultArray = resultsJson.getJSONArray(ITEM);
				
				final int arraySize = resultArray.length();
				for(int i = 0; i< arraySize ; i++)
				{
					final JSONObject result = resultArray.getJSONObject(i);
					final String content = result.getString(DESC);
					analyzer.analyze(content,mAnalyzedList);				
				}
				Log.e(TAG,"DAUM Result END ============================================================");
			} catch (JSONException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}		
		return mAnalyzedList;		
	}	
}
블로그 이미지

커뉴

이 세상에서 꿈 이상으로 확실한 것을, 인간은 가지고 있는 것일까?

,