키보드 보이게 하기
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);  
imm.showSoftInput(editText, 0);

키보드 숨기기 
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);  
imm.hideSoftInputFromWindow(myEditText.getWindowToken(), 0);

Activity에서 Edit Fild 를 선택했을때 키보드 나타나게 하는 방법
AndroidManifest에서 설정

<activity android:configChanges="orientation|keyboardHidden">

또는
<activity android:windowSoftInputMode="stateHidden"> 를 사용

'안드로이드' 카테고리의 다른 글

SMS 한글 깨지는 문제  (0) 2011.01.28
SMS 보내기  (0) 2011.01.28
Eclipse에서 android Full Source 연결해서 개발환경 만들기  (0) 2011.01.28
구글 Power Manager 정리 PPT 자료  (0) 2011.01.27
adb shell 처리 방법  (0) 2011.01.27

여기서는 윈도우에서 Android Full Source를 받아서 Debuging하는 방법을 정리하고
리눅스에서 컴파일 돌리는 방법에 대해서 정리를 할 것입니다.

1. 리눅스에서 안드로이드 소스 컴파일 하기

 1.다운받은 안드로이드 소스 빌드
    cd myDroid [Enter]                                /*Android full source 다운 받은 경로*/
    make [Enter]
 2.make 하고 난 뒤 classpath를 설정
    cd myDroid [Enter]
    cp development/ide/eclipse/.classpath . [Enter]
    ch mode u+w .classpath
    <주의사항 : path설정이 잘못되면 이클립스에서 Error가 나거나 class가 폴더별로
                     정리되어 문제가 발생됨.>

2.윈도우 및 리눅스에서 Eclipse Debuging 환경 만들기
 1.Android Full Source 받은 경로로 이동.
 2.development/ide/eclipse/로 이동하여 classpath파일을 복사 후
    Android Full Source 받은 경로로 이동후 붙여넣기.
 3. Eclipse 실행 후 File>new>Java project 선택
    그리고 그림과 같이 설정.
   
 4.위와 같이 설정한 후 Finish를 선택할 수 있게 될 것임.
    그러면 여기서 Finish 를 선택 한 후 안드로이드 Package에서 오른쪽 클릭.
    그 후 Debug As > Debug configuration을 선택.
 5.아래의 그림과 같이 Port를 설정.
 6. 위와 같이 Debug Configuration을 설정했다면 Debug를 클릭.
     그러면 아래와 같이 Error가 발생하는데 무시.
 7. 작업한 Android Full Source Package가 아닌 따로 작업하고 잇는 Android Project
    에서 Debuging하고 싶은 곳에 Break Point를 설정후 Debug로 실행.
    그러면 DDMS로 이동하게 되는데 여기서 Debug 창에서 마우스 오른쪽 클릭 후
    Edit Source Lookup을 선택.
 8.Edit Source Lookup Path창에서 Add를 선택.

 9.Java Project를 선택.

 10.여기서 안드로이드 풀 소스 Project를 선택 후 OK를 누르면 환경이 구축 완료!

참조 : http://blog.naver.com/jang2818?Redirect=Log&logNo=20078863663

'안드로이드' 카테고리의 다른 글

SMS 보내기  (0) 2011.01.28
KeyBoard 보이거나 숨기기  (0) 2011.01.28
구글 Power Manager 정리 PPT 자료  (0) 2011.01.27
adb shell 처리 방법  (0) 2011.01.27
TextWatcher  (0) 2011.01.27

'안드로이드' 카테고리의 다른 글

KeyBoard 보이거나 숨기기  (0) 2011.01.28
Eclipse에서 android Full Source 연결해서 개발환경 만들기  (0) 2011.01.28
adb shell 처리 방법  (0) 2011.01.27
TextWatcher  (0) 2011.01.27
문자열 자동완성  (0) 2011.01.27
adb shell

su

mount -o remount,rw -t yaffs2 /dev/block/mtdblock1 /system

cd system/app

rm MyFiles.apk
pm uninstall package_name
adb uninstall com.sec.android.app.myfiles

// adb remount
네이티브 어플리케이션 삭제 방법.
# remount는 /system 파티션을 ro(read-only)에서 rw(read-write)로 바꿉니다
$ adb remount

# 이제 rm으로 apk를 삭제하고 uninstall합니다
$ adb shell rm /system/app/Music.apk
$ adb uninstall com.android.music

'안드로이드' 카테고리의 다른 글

Eclipse에서 android Full Source 연결해서 개발환경 만들기  (0) 2011.01.28
구글 Power Manager 정리 PPT 자료  (0) 2011.01.27
TextWatcher  (0) 2011.01.27
문자열 자동완성  (0) 2011.01.27
전화중인 상태 체크하기  (0) 2011.01.27

TextWatcher만 단순히 놓고 보자면 얘는 텍스트 입력에 변화가 있을 때마다 이벤트에 맞춰 호출 되는 클래스다.

Summmary를 살펴 보면 가지고 있는 인터페이스는 총 3개

afterTextChanged(Editable s)
- Text 변화 후 발생

beforeTextChanged(CharSequence s, int start, int count, int after)
- 새로운 텍스트 길이로 변화 하게 되면 발생

onTextChanged(CharSequence s, int start, int before, int count)
- 텍스트 변경 시마다 불림

사실 가장 많이 사용되는게 onTextChanged 인데 가만 보면 각각 이벤트를 맞춰서 해줘야 할 때가 적지 않은 것 같다.  

Editable, CharSequence 모두 현재 입력되고 있는 텍스트를 의미한다. start는 시작 위치, count는 글자의 길이, before는 붙여넣기나 잘라내기를 할 때 나타나는 이전에 존재하던 길이를 의미한다. after는 이후의 길이를 말한다. 

setSpan을 보면 start, end Index를 입력 받게 되던데. 이때 주로 start, start+count를 이용한다.
실제 값을 찍어보면 EditText는 1정도의 공간을 가지고 있다. 즉 한칸도 입력되지 않아도 기본 length는 1.

'안드로이드' 카테고리의 다른 글

구글 Power Manager 정리 PPT 자료  (0) 2011.01.27
adb shell 처리 방법  (0) 2011.01.27
문자열 자동완성  (0) 2011.01.27
전화중인 상태 체크하기  (0) 2011.01.27
Telephony 기능  (0) 2011.01.27

java.lang.Object
   ↳ android.view.View
     ↳ android.widget.TextView
       ↳ android.widget.EditText
         ↳ android.widget.AutoCompleteTextView
           ↳ android.widget.MultiAutoCompleteTextView

 

- AutoCompleteTextView와 다른점은 tokenizer로 여러개를 입력할 수(선택할 수) 있다.

예) 쉼표(,) tokenizer라면 "Belgium, France"가 가능

- 반드시 목록에 있는 항목을 선택해야 하는것은 아님

 

1. 자동완성에 쓸 문자열 및 Tokenizer 연결시키기(setAdapter(), setTokenizer()) 

 

public class CountriesActivity extends Activity {
     
protected void onCreate(Bundle savedInstanceState) {
         
super.onCreate(savedInstanceState);
         setContentView
(R.layout.autocomplete_7);
 
         
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                 android
.R.layout.simple_dropdown_item_1line, COUNTRIES);
         
MultiAutoCompleteTextView textView = (MultiAutoCompleteTextView)findViewById(R.id.edit);
         textView
.setAdapter(adapter);
         textView
.setTokenizer(new MultiAutoCompleteTextView.CommaTokenizer()); // ','(쉼표) Tokenizer 등록(안드로이드 기본 제공 Tokenizer)
     
}

     
private static final String[] COUNTRIES = new String[] {
         
"Belgium", "France", "Italy", "Germany", "Spain"
     
};
 
}

 

2. android:completionHint [ setCompletionHint(CharSequence) ] : 자동완성 드롭다운 목록아래에 표시될 도움말 문자열 등록

3. android:completionThreshold [ setThreshold(int) ] : 자동완성 드롭다운 목록이 몇글자 입력한 후에 표시될 지 등록

 

android:layout_height = "wrap_content"로 설정해야 드롭다운 목록이 보일것이다.

'안드로이드' 카테고리의 다른 글

adb shell 처리 방법  (0) 2011.01.27
TextWatcher  (0) 2011.01.27
전화중인 상태 체크하기  (0) 2011.01.27
Telephony 기능  (0) 2011.01.27
멀티 터치 구현 예제  (0) 2011.01.27
CALL_STATE_OFFHOOK : 통화중인 상태

CALL_STATE_RINGING : 폰이 울리고 있는 상태

CALL_STATE_IDLE : 폰이 울리거나 통화중이 아닌 상태

public class MyPhoneStateListener extends PhoneStateListener { 
        @Override 
       public void onCallStateChanged(int state, String incomingNumber){

         if (state == TelephonyManager.CALL_STATE_IDLE) {
                Log.i("PhoneCallState", "STATE_IDLE");
         }
         else if (state == TelephonyManager.CALL_STATE_RINGING) {
                Log.i("PhoneCallState", "STATE_RINGING : Incoming number "+incomingNumber);
         }
         else if (state == TelephonyManager.CALL_STATE_OFFHOOK) {
                Log.i("PhoneCallState", "STATE_OFFHOOK");
         }
        }
    }

단말기의 모뎀상태에 대한 정보를 얻기 위해서는 READ_PHONE_STATE권한이 필요하다.
AndroidManifest.xml파일에 아래 내용을 추가한다.
<uses-permission 
android:name="android.permission.READ_PHONE_STATE">
</uses-permission>

◆ 단말기의 모뎀상태 조회
TelephonyManager 객체를 얻기 위해서는 Context 객체에서 제공하는 getSystemService() 메서드를 이용한다.
TelephonyManager tm = (TelephonyManager) 
getSystemService(TELEPHONY_SERVICE);

음성통화 상태 조회
CALL_STATE_IDLE/CALL_STATE_OFFHOOK/CALL_STATE_RINGING 등의 값을 반환
Log.d("PHONE", "getCallState :" + tm.getCallState());
데이터통신 상태 조회
DATA_DISCONNECTED/DATA_CONNECTING/DATA_CONNECTED/DATA_SUSPENDED 등의 값을 반환
Log.d("PHONE", "getDataState :" + tm.getDataState());
단말기 ID 조회
GSM방식 IMEI 또는 CDMA방식의 MEID 값을 반환
Log.d("PHONE", "getDeviceId :" + tm.getDeviceId());
SW버전 조회
GSM방식의 IMEI/SV와 같은 SW버전을 반환
Log.d("PHONE", "getDeviceSoftwareVersion :" + tm.getDeviceSoftwareVersion());
전화번호 조회
GSM방식의 MSISDN과 같은 전화번호 반환
Log.d("PHONE", "getLine1Number :" + tm.getLine1Number());
국가코드 조회
현재 등록된 망 사업자의 MCC(Mobile Country Code)에 대한 ISO 국가코드 반환
Log.d("PHONE", "getNETWORKCountryIso :" + tm.getNetworkCountryIso());
Log.d("PHONE", "getSimCountryIso :" + tm.getSimCountryIso());
망 사업자코드 조회
현재 등록된 망 사업자의 MCC+MNC(Mobile Network Code) 반환
Log.d("PHONE", "getNetworkOperator :" + tm.getNetworkOperator());
Log.d("PHONE", "getSimOperator :" + tm.getSimOperator());
망 사업자명 조회
현재 등록된 망 사업자명 반환
Log.d("PHONE", "getNetworkOperatorName :" + tm.getNetworkOperatorName());
Log.d("PHONE", "getSimOperatorName :" + tm.getSimOperatorName());
망 시스템 방식 조회
현재 단말기에서 사용중인 망 시스템 방식을 반환
NETWORK_TYPE_UNKNOWN/
GSM방식 :  NETWORK_TYPE_GPRS/NETWORK_TYPE_EDGE/NETWORK_TYPE_UMTS/
NETWORK_TYPE_HSDPA/NETWORK_TYPE_HSUPA/NETWORK_TYPE_HSPA
CDMA방식 : NETWORK_TYPE_CDMA/NETWORK_TYPE_EVDO_0/NETWORK_TYPE_EVDO_A/NETWORK_TYPE_1xRTT
Log.d("PHONE", "getNetworkType :" + tm.getNetworkType());
단말기 종류 조회
단말기에서 지원하는 망의 종류를 반환
PHONE_TYPE_NONE/PHONE_TYPE_GSM/PHONE_TYPE_CDMA 등의 값을 반환
Log.d("PHONE", "getPhoneType :" + tm.getPhoneType());
SIM카드 Serial Number 조회
Log.d("PHONE", "getSimSerialNumber :" + tm.getSimSerialNumber());
SIM카드 상태 조회
SIM_STATE_UNKNOWN/SIM_STATE_ABSENT/SIM_STATE_PIN_REQUIRED/SIM_STATE_PUK_REQUIRED/
SIM_STATE_NETWORK_LOCKED/SIM_STATE_READY 등의 값을 반환
Log.d("PHONE", "getSimState :" + tm.getSimState());
가입자 ID 조회
GSM방식의 IMSI와 같은 가입자 ID 반환
Log.d("PHONE", "getSubscriberId :" + tm.getSubscriberId());

◆ 조회결과
getCallState :0(CALL_STATE_IDLE)
getDataState :2(DATA_ACTIVITY_OUT)
getDeviceId :000000000000000
getDeviceSoftwareVersion :null
getLine1Number :15555218135
getNetworkCountryIso :us
getNetworkOperator :310260
getNetworkOperatorName :Android
getNetworkType :3(NETWORK_TYPE_UMTS)
getPhoneType :1(PHONE_TYPE_GSM)
getSimCountryIso :us
getSimOperator :310260
getSimOperatorName :Android
getSimSerialNumber :89014103211118510720
getSimState :5(SIM_STATE_READY)
getSubscriberId :310260000000000

실제상황에서는 이와같이 현재 단말기의 상태를 직접 조회하는것이 아니라 
상태정보가 변경될 때 자동으로 인식해야하는 상황이 훨씬 많을것이다.
이럴때는 TelephonyManager의 listen()를 이용하여 콜백메서드를 등록하면 가능하다.
        tm.listen(new PhoneStateListener(){
         public void onCallStateChanged(int state, String incomingNumber){
         if (state == TelephonyManager.CALL_STATE_RINGING){
         Log.d("Telephony", "state = " + state + ", number = " + incomingNumber);
         }else{
         Log.d("Telephony", "state = " + state);
         }        
         }
        }, PhoneStateListener.LISTEN_CALL_STATE);

onCallStateChanged() 이외에도 아래와 같은 상태변화를 감지할 수 있다.
- onCallForwardingIndicatorChanged() : 호전환(Call Forwarding) 상태 변화
- onCellLocationChanged() : 단말기의 Cell위치 변화
- onDataActivity() : Data 활성화 상태 변화
- onDataConnectionStateChanged() : Data 연결상태 변화
- onMessageWaitingIndicatorChanged() : 메시지 대기상태 변화
- onServiceStateChanged() : 단말기의 서비스 상태 변화
- onSignalStrengthsChanged() : 망의 신호강도 변화

◆ 전화번호 처리
각 국가별로 전화번호의 형식이 다르다. 
한국은 01x-xxxx-xxxx 이 일반적이고,
북미는 xxx-xxx-xxxx가 된다.
PhoneNumberUtils.formatNumber() 메서드를 사용하면 설정된 Locale에 맞게 형식화 된다.
String formattedTelNumber = PhoneNumberUtils.formatNumber("01098761234");
        Log.d("Telephony", "formattedTelNumber :" + formattedTelNumber);
Locale을 English(United States)로 할경우 010-987-61234로 출력된다.
한국어로 할 경우는 01098761234가 그대로 출력된다.
formatNumber() 메서드의 구현내용을 살펴봐야 할듯 하다.

EditText에서 전화번호를 입력받을 경우에도 자동으로 형식화가 가능하다.
EditText객체의 addTextChangedListener에 PhoneNumberFormattingTextWatcher()를 등록하기만 하면 된다.
        EditText tn = (EditText) findViewById(R.id.edtTelNumber);
        tn.addTextChangedListener(new PhoneNumberFormattingTextWatcher());
그러나 역시 한국어로는 동작하지 않았다.


 public boolean onTouchEvent(final MotionEvent event)
 
{
     
final int action = event.getAction();
     
if(mIsMultiTouchSupported)
     
{
     
switch (action & MotionEvent.ACTION_MASK)
       
{
       
case  MotionEvent.ACTION_POINTER_DOWN : {
     
if(mActivePointerId == -1)
     
{
             
final int pind = (action & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT;
             
int pid = event.getPointerId(pind);
             
final int x = (int)event.getX(pid);
             
final int y = (int)event.getY(pid);
             
             
if(pointInArea(x, y))
             
{
              mActivePointerId
= pid;
             
               
// System.out.println("down pointer x = "+x+" , y = "+y);
                onAction
(UIAREA_ACTION_DOWN, x, y);
             
}
     
}
       
}
         
break;
       
case MotionEvent.ACTION_DOWN: {
         
if(mActivePointerId == -1)
         
{
             
final int x = (int)event.getX();
             
final int y = (int)event.getY();
             
if(pointInArea(x, y))
             
{
              mActivePointerId
= event.getPointerId(0);
             
// System.out.println("down x = "+x+" , y = "+y);
              onAction
(UIAREA_ACTION_DOWN, x, y);
             
}
         
}
       
           
break;
       
}
           
       
case MotionEvent.ACTION_MOVE: {
         
if(mActivePointerId != -1)
         
{
             
// Find the index of the active pointer and fetch its position
             
final int pointerIndex = event.findPointerIndex(mActivePointerId);
             
final int x = (int)event.getX(pointerIndex);
             
final int y = (int)event.getY(pointerIndex);
             onAction
(UIAREA_ACTION_MOVE, x, y);
         
}
 
           
break;
       
}
           
       
case MotionEvent.ACTION_CANCEL: {
            mActivePointerId
= -1;
           
break;
       
}
       
case MotionEvent.ACTION_UP:
       
case MotionEvent.ACTION_POINTER_UP: {
           
final int pointerIndex = (action & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT;
           
final int pointerId = event.getPointerId(pointerIndex);
           
if (pointerId == mActivePointerId) {

             
final int x = (int)event.getX(mActivePointerId);
             
final int y = (int)event.getY(mActivePointerId);
                mActivePointerId
= -1;
               
// System.out.println(" up x = "+x+" , y = "+y);
                onAction
(UIAREA_ACTION_UP, x, y);
           
}
           
break;
       
}
       
}//end of switch      
     
}
     
else
     
{
     
switch (action)
     
{
       
case MotionEvent.ACTION_DOWN: {
           
final int x = (int)event.getX();
           
final int y = (int)event.getY();
           
if(pointInArea(x, y))
           
{
           
// System.out.println("down x = "+x+" , y = "+y);
             onAction
(UIAREA_ACTION_DOWN, x, y);
           
}
           
break;
       
}
           
       
case MotionEvent.ACTION_MOVE: {
           
final int x = (int)event.getX();
           
final int y = (int)event.getY();
           
if(pointInArea(x, y))
           
{
           
// System.out.println("move x = "+x+" , y = "+y);
             onAction
(UIAREA_ACTION_MOVE, x, y);
           
}
           
break;
       
}
           
       
case MotionEvent.ACTION_CANCEL: {
           
break;
       
}
       
case MotionEvent.ACTION_UP:{
           
final int x = (int)event.getX();
           
final int y = (int)event.getY();
               onAction
(UIAREA_ACTION_UP, x, y);
           
break;
       
}
     
}//end of switch
     
}    
   
return true;

 
}

spring error stacktrace 에러 내용이 찍히지 않을때

[2009-04-25 10:21:11,197](441)  Trying to find handler for exception class[java.lang.Exception]

 

에러가 발생하게 되면 보통 stacktrace 의 객체에 저장된 내용을 print 해서 문제를 파악하게 된다.

하지만 spring framework 에서 위와 같이 간단하게 표현되는 경우가 있다.

그 원인을 찾기 위해서 Controller 가 상속받은 클래스를 따라 올라가다 보니

MultiActionController 함수중에 Exception  이 발생할때 실행되는 놈이 있는데 그 함수가

아래와 같다.

 

protected Method getExceptionHandler(Throwable exception){

Class exceptionClass = exception.getClass();

if(logger.isDebugEnabled())

logger.debug("Trying to find handler for exception class [" + exceptionClass.getName() + "]");

       Method handler;

       for(handler = (Method)exceptionHandlerMap.get(exceptionClass); 
handler == 
null && !exceptionClass.equals(java.lang.Throwable.class); 
handler = (Method)
exceptionHandlerMap.get(exceptionClass))

        {

            if(logger.isDebugEnabled())

                logger.debug("Trying to find handler for exception superclass [" + exceptionClass.getName() + "]");

            exceptionClass = exceptionClass.getSuperclass();

   }

 

   return handler;

}

내용을 보면 대충 알겠지만 logger.isDebugEnabled 일때 Trying to find handler  print하는걸 볼수 있다. 
 옵션을 어떻게 바꿔야 될지  찾아봐야겠지만 
당장은 MultiActionController 상속받아 
클래스를 만든후 getExceptionHandler 오버로딩 
해서 기능을 변경하는것이 편할것 같다.

방법은 exception 객체에서 StackTraceElement[] 배열을 가져온후 그내용을 StringBuffer

저장하여 log4j  출력하는 절차이다. 문자열을 구성한 로직은 일반적인 에러 출력형태를

취해서 print 한다. 다음은 오버로딩한 함수의 내용이다.

 

protected Method getExceptionHandler(Throwable exception){

   StackTraceElement[] element = exception.getStackTrace();

   StringBuffer errorBuff = new StringBuffer(exception.getMessage());

   errorBuff.append("\n");

   for (int i=0; i < element.length; i++){

      errorBuff.append("\tat ").append(element[i]).append("\n");

   }

   log.debug(errorBuff.toString());

   return super.getExceptionHandler(exception);

}


출처 : http://mainia.tistory.com/335

'안드로이드' 카테고리의 다른 글

Telephony 기능  (0) 2011.01.27
멀티 터치 구현 예제  (0) 2011.01.27
java.lang.Annotation(주석:@)  (0) 2011.01.27
View Fipper  (0) 2011.01.27
상태바(Status Bar)  (0) 2011.01.27

+ Recent posts