2010년 7월 28일 수요일

장보기 어플을...

장보기 어플에 구매된 리스트의 상세 정보를 넣고 히스토리를 관리한다면...
구매한 항목에 대한 트렌드를 확인할 수 있지 않을까?
내가 언제 구매했고 구매금액은 얼마이고... 등등...
그러면 구매 패턴을 확인할 수 있으니... 경제활동에 도움이 되지 않을까?
그럼 이제... 그래프 기능 구현을 함 해볼까~~~~

장보기 어플 초성검색 기능

장보기 어플의 항목등록을 위해 자바로 구현된 초성검색 로직이다.

public static String getInitialConsonant(String str) {
int value = 0;
int initial, consonant = 0;
String[] arr_consonant =
new String[] {"ㄱ","ㄲ","ㄴ","ㄷ","ㄸ","ㄹ"
,"ㅁ","ㅂ","ㅃ","ㅅ","ㅆ","ㅇ","ㅈ"
,"ㅉ","ㅊ","ㅋ","ㅌ","ㅍ","ㅎ"};
String result = "";

for(int i = 0 ; i < str.length(); i++) { value = str.subSequence(i, i+1).hashCode() - 0xAC00; consonant = value % 28; initial = (int)(((value - consonant) / 28) / 21); if(initial > 0) result += arr_consonant[initial];
else result += str.substring(i, i+1);
}

return result;
}

장보기 어플 개발된 화면

1. 우선 장보기 항목을 위한 초성검색 기능이다. 장보기 항목을 가장 빠르게 입력할 수 있는 방법은 초성검색을 지원하는 검색 기능일 것으로 생각했다. 그래서 AutoCompleteTextView를 활용하여 초성검색 입력 기능을 넣었다.
2. 다음은 추가된 장보기 항목이다. 구매된 항목을 클릭하면 구매된 리스트로 표시가 된다. 쉽게 구매항목과 아직 구매되지 않은 항목을 확인할 수 있어야 할 것 같았다.
 
3. 그리고 추가된 항목을 삭제하는 기능이다. 해당 항목을 길게 클릭하면 삭제를 위한 팝업이 뜬다. 삭제를 하기 위해서 "삭제"버튼을 클릭한다.
 
4. 리스트 아래 부분의 두개의 버튼은 새로고침버튼과 항목 일괄 삭제 버튼이다.

장보기 어플 개발 배경

장을 보러 가기전에 항상 품목 리스트를 만들고 간다.
나야 항상 마누라 심부름으로 가는 거니...
마누라가 필요한 물품을 줄줄이 이야기 한다.
그럼 나는 핸드폰 메모장에 열심히 적는다. 아니면 종이에 적는다.
하도 귀찮아서 마누라 보고 써서 달라고 하니 마누라는 투덜거린다...(몇개 안되는 걸 못 외우냐고...)
외워 보기도 했는데... 이상하게 장을 보러가면 구경하느라 가끔 하나씩 빼먹는다... ㅋㅋ

그래서 항상 장보기 어플을 만들어 봐야지 하는 생각을 가지고 있었다.
쉽게 등록할 수 있고 산것과 안 산것을 쉽게 확인할 수 있는 그런 간단한 어플을....

2010년 7월 22일 목요일

애뮬레이터 한글자판 설정

애뮬레이터에 기본적으로 한글자판이 설치되어 있지 않다.
따라서 한글자판 사용을 위해서는 해당 앱을 설치해야만 가능하다.

1. HangulKeyboard.apk 파일을 다운
2. 아래의명령을 실행한다.
adb install 다운로드경로\HangulKeyboard.apk
3. 이클립스에서 가상장치를 구동시킨다.
4. 구동시칸 가상장치의 첫화면(메인)에서
메뉴버튼 >> 설정 >> 언어 및 키보드 를 클릭한다.
5. Android키보드와 한글 접촉식 키보드 를 선택한다.

2010년 7월 13일 화요일

TTS(Text To Speech) 사용하기

음... 반복이의 단어들을 자동으로 읽어주기 위해서 TTS 기능을 추가했다.
약간의 에러가 있어서 해매기는 했지만 지금은 잘 작동이 된다. (음... ㅋㅋ)

TTS 사용을 위한 Sample 코드와 에러를 해결했던 나의 Know-how를 적어 본다.

1. Sample Code (http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/TextToSpeechActivity.html)
 /*
* Copyright (C) 2009 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/


package com.example.android.apis.app;

import android.app.Activity;
import android.os.Bundle;
import android.speech.tts.TextToSpeech;
import android.util.Log;
import android.view.View;
import android.widget.Button;

import com.example.android.apis.R;

import java.util.Locale;
import java.util.Random;

public class TextToSpeechActivity extends Activity implements TextToSpeech.OnInitListener {

private static final String TAG = "TextToSpeechDemo";

private TextToSpeech mTts;
private Button mAgainButton;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView
(R.layout.text_to_speech);

// Initialize text-to-speech. This is an asynchronous operation.
// The OnInitListener (second argument) is called after initialization completes.
mTts
= new TextToSpeech(this,
this // TextToSpeech.OnInitListener
);

// The button is disabled in the layout.
// It will be enabled upon initialization of the TTS engine.
mAgainButton
= (Button) findViewById(R.id.again_button);

mAgainButton
.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
sayHello
();
}
});
}

@Override
public void onDestroy() {
// Don't forget to shutdown!
if (mTts != null) {
mTts
.stop();
mTts
.shutdown();
}

super.onDestroy();
}

// Implements TextToSpeech.OnInitListener.
public void onInit(int status) {
// status can be either TextToSpeech.SUCCESS or TextToSpeech.ERROR.
if (status == TextToSpeech.SUCCESS) {
// Set preferred language to US english.
// Note that a language may not be available, and the result will indicate this.
int result = mTts.setLanguage(Locale.US);
// Try this someday for some interesting results.
// int result mTts.setLanguage(Locale.FRANCE);
if (result == TextToSpeech.LANG_MISSING_DATA ||
result
== TextToSpeech.LANG_NOT_SUPPORTED) {
// Lanuage data is missing or the language is not supported.
Log.e(TAG, "Language is not available.");
} else {
// Check the documentation for other possible result codes.
// For example, the language may be available for the locale,
// but not for the specified country and variant.

// The TTS engine has been successfully initialized.
// Allow the user to press the button for the app to speak again.
mAgainButton
.setEnabled(true);
// Greet the user.
sayHello
();
}
} else {
// Initialization failed.
Log.e(TAG, "Could not initialize TextToSpeech.");
}
}

private static final Random RANDOM = new Random();
private static final String[] HELLOS = {
"Hello",
"Salutations",
"Greetings",
"Howdy",
"What's crack-a-lackin?",
"That explains the stench!"
};

private void sayHello() {
// Select a random hello.
int helloLength = HELLOS.length;
String hello = HELLOS[RANDOM.nextInt(helloLength)];
mTts
.speak(hello,
TextToSpeech.QUEUE_FLUSH, // Drop all pending entries in the playback queue.
null);
}

}

2. 에러 처리
에러는 "Language is not supported." 이다.
내가 사용하는 폰의 언어 설정은 한국어로 되어 있다.
당연히 지역도 한국으로 되어 있을 것이다.
하지만 Locale.US를 사용하면 지역과 언어가 en_US 가 된다.
따라서 폰의 언어 설정을 영어로 변경하여야 아무런 에러 없이 실행이 된다.
그럼 한국어 설정에서 영어 설정을 사용하려면????
바로 Locale.US => Locale.ENGLISH로 수정하면 된다.
그러면 한국어 설정에서도 TTS에 영어를 적용할 수 있다.

그럼 여기까지 TTS 활용 방법이였다.

모두들 즐거운 하루되세요.

2010년 7월 6일 화요일

데이터 저장을... 파일? DB? 아니면 다른 방법?

반복이를 위한 데이터를 저장하기 위해서 방식을 어떻게 해야 할지?
일단 DB를 사용해서 데이터를 저장하지만 갑작스럽게 고민이 된다.
파일을 이용하여 SD카드를 활용하는 것이 좋은지?
아니면 계속 DB를 활용하는 것이 좋은 것인지?
아니면 다른 방법이 있을지?

DB를 활용하면 저장된 데이터를 활용하는데 편하다.
하지만 SD카드를 활용할 수 없어서 데이터가 증가하면...
안드로이드 2.2에서는 어플을 SD카드에 설치를 할 수 있어서 용량 문제가 없지만,
아직은 어플의 영역에 많은 데이터를 저장하면... 좋지 않을 것 같다는 생각이 있다.

그럼 파일을 사용해야 할까?
활용하기는 어렵지만 SD카드를 활용하여 데이터를 관리할 수 있고,
추가 데이터에 대해서 DB에 업로드할 필요없이 컨텐츠파일만 변경하면 되므로
활용하기도 편할 것 같다.

지금 생각나는 장단점은 여기까지이다.

더 고민해야 할 듯... ^^

Do you know how to mute a call?

자동응답기 어플을 제작 중이다.

거의 완성단계라 할 수 있지만 문제가 있다. ㅡ,.ㅡ;
Android 2.1에서 개발을 하였고,
Android에서 전화내용을 녹음하기 위해서
AudioSource의 VOICE_CALL/VOICE_UPLINK/VOICE_DOWNLINK를 사용해야 하는데
버그가 있다고 한다. 그래서 옵션간에 별 차이가 없다는 사실...
무엇을 사용해도 VOICE_CALL과 같다는 것이다.

참고)
VOICE_UPLINK: 내가 이야기 하는 내용
VOICE_DOWNLINK: 상대방이 이야기 하는 내용
VOICE_CALL: VOICE_UPLINK + VOICE_DOWNLINK

VOICE_CALL을 사용하고 Microphone Mute 기능을 활용하면 가능할 것 같다.
그래서 방법을 찾고 있지만... 음... 잘 안된다...

사용방법)
AudioManager am = Context.getSystemService(Context.AUDIO_SERVICE);
if(am.isMicrophoneMute()) am.setMicrophoneMute(true);

하지만, 결론적으로 Mute상태로 변경이 안된다.
무엇이 문제일까?

^_________________^?

2010년 7월 1일 목요일

자동응답기 시작하기

같이 일하시는 최**차장님께서 옛날이야기하면서 나온 어플 아이템이다.

지금까지는 전화를 받지 못하는 상황이면 메시지로 현재 상황(회의/기타..등등..)을 보내주거나
전화한 사람이 음성메시지를 남기게 되는데
문제는 내가 다시 음성메시지를 확인하던지 전화를 해야 용건을 알 수 있다는 것이다.

그래서 내가 전화를 못 받는 상황이라면 자동응답기를 실행하고
그 동안 연결되는 모든 전화에 대해서는 자동응답을 하는 것이다.
상황을 알리고 상대방이 용건을 남기면 바로 전화기에서 확인할 수 있는 것이다.
그러면 나에게서 발생하는 추가 비용이 "0"원이라는 것이다. ㅎㅎ
돈주고 팔아도 좀 사지 않을까??? ㅋㅋ

회사원들 중에 회의등으로 자주 연락이 안되는 경우라면 활용할 가치가 있지 않을까??? ㅡ,.ㅡ?
없으면 말구... ㅋㅋ

반복이 개발 시작하기

스마트폰을 산 이유도... 그리고 안드로이드 폰으로 구매한 이유도...
어쩌면 이 프로그램 때문일 수도 있다.

모두들 "깜빡x"를 알고 있을 것이다.
개인적으로 영어 공부를 하고 있어서 단어를 외우는 가장 좋은 방법인 것 같아서
그 기계를 사려고 했다. 하지만 가격이... 그리 만만한 가격이 아니였다...
거의 30~40만원 사이정도... 헐~~~ ㅡ,.ㅜ

내가 단순히 단어공부를 위해 이 많은 금액을 투자하기에는 넘 낭비라 느껴졌고,
그리면서 스마트폰을 알게되었고 개발환경이 자바라는 점 때문에
안드로이드 폰을 사서 어플을 개발하기로 마음먹었다.

구현되어야 할 기능으로는 1) 설정된 초 단위로 단어 반복,
2) 단어 반복 시 다양한 설정 기능을 통해서 반복 대상 설정 기능,
3) 단어 추가 기능(파일 업로드 기능) 등을 구현하여 반복이라는 이름으로 어플을 구현하려고 한다.

안드로이드 개발 추천 서적

안드로이드 개발에 있어서 책 한권은 필요할 것 같다.
사이트에서도 많은 정보를 얻을 수 있지만 책을 통해 얻는 정보도 무시하지 못 한다.
그리고 구글링등을 통해 자료를 수집하는 것보다 어쩌며 더 빠른 시간에 많은 정보를 얻을 수 있을 것 같다. 단, 좋은 책이여야 겠지만...

내가 보고 있는 책은 2권이다.
1) 알짜만 골라 배우는 안드로이드 프로그램 (에이콘출판사)
2) 시작하세요! 안드로이드 프로그래밍

개인적으로는 1)번책을 더 좋아한다.
내용도 좋고 설명도 좋고 번역도 잘 되어 있고...
처음에 쉽게 접근할 수 있어서 더 좋은 것 같다.
그렇다고 2)번이 나쁘다고 말 하는 것은 아니다.
단지 번역에 있어서 불필요한 부분까지 번역이 되어 있어서 책을 읽으면서 많이 어색한 느낌이 든다.

이제 다른 사람이 추천한 "프로페셔널 안드로이드 애플리케이션 개발"을 사야할지? 아니면 그냥 웹사이트에서 많은 정보를 수집하는 것이 좋을지 고민이다. 1)번사고 마스터한 후에 2)번 책을 보니 기초적인 부분이 거의 같아서 그리 많이 도움이 되지는 않는 것 같다.

아니면 구글링을 통해 얻은 책 정보인데.. 웹사이트에서 책 내용을 모두 볼 수 있어서 그냥 이것으로 공부하는 것도 좋을 것 같다라는 생각도 든다.
http://books.google.com/books?id=Bam8K5SIiTkC&lpg=PA343&ots=NGGoBcGRTZ&dq=android%20voice_uplink%20vs%20voice_downlink&pg=PP1#v=onepage&q&f=false
책 제목은 "Pro Android 2"이다.

그럼 도움이 되길바라며....

안드로이드 어플 개발 시작하기

안드로이드 어플 개발을 위해 가장 먼저해야 하는 것은 개발 환경을 구축하는 것이다.
그리 어렵지 않게 환경을 설정할 수 있다.

어플 개발하면서 가장 많이 방문할 사이트가 아래 사이트이다.
개발을 위해서 필요한 모든 정보가 다 있는 사이트이다.
그럼 왜 이런 블로그를 만들까?
없는 것도 있으니... 그렇지... ^^*

http://developer.android.com/index.html

Dev Guide >> Developing >> In Eclipse with ADT 에서 환경 설정하는 방법을 확인할 수 있다.

간단히 요약하면
1) http://www.eclipse.org 에서 eclipse 를 다운로드 한다.
2) eclipse를 실행하고 ADT plugin을 설치하고 다시 실행한다.
3) Android SDK를 다운로드 받고 특정 폴더에 압축을 푼다.
4) Path 정보에 Android SDK/tools를 추가하면 adb... 등.. 안드로이드 커맨드를 실행할 수 있다.
5) 실행된 eclipse 에서 Android SDK의 위치를 설정한다.
6) Android SDK를 실행하고 각 Platform 버전별로 다운로드를 받는다. (시간이 좀 걸린다...)
7) 1)~6)까지 이상없이 설치가 되었다면 Android Project 생성을 클릭하여 Hello World 프로그램을 작성해 보면 된다. (참고로 이러한 샘플도 위의 사이트에 있으니 확인하고 실습하면 된다. ^^*)

이상입니다.

P.S. 혹시라도 틀린 부분이나 추가할 사항이 있으면 코맨드 주세요. 감솨합니다.~~~

안드로이드 어플 개발에 대한 모든 정보를...

안드로이드 어플 개발을 위해 필요한 모든 정보를 공유하고자 블로그를 시작합니다.

자... 이제 시작합니다.....