<activity-alias android:enabled=["true" | "false"]

android:exported=["true" | "false"]

android:icon="drawable resource"

android:label="string resource"

android:name="string"

android:permission="string"

android:targetActivity="string" >

. . .

</activity-alias>

<activity> 타겟으로 지정해 그 타겟과 다른 속성으로 <activity>를 호출한다. targetActivity는 같은 <application>안에 있어야 하고 <activity-alias>보다 먼저 선언 되어 있어야 한다. targetActivity는 Activity-alias의 부모 엘리먼트이고 activity-alias는 targetActivity의 애트리뷰트를 따르지만 activity-alias안에 같은 애트리뷰트가 선언되면 activity-alias 애트리뷰트 값을 따른다.

android:exported 
 다른 애플리케이션의 컴포넌트들이 이 앨리어스를 통해 타겟 액티비티를 런치할 수 있는지를 설정한다. 런치할 수 있다면 true이다. 인텐트 필터가 없으면 디폴트 값은 false이고 인텐트 필터가 있다면 디폴트 값은 true이다.

android:name 
 앨리어스의 이름을 지정한다. 이름은 전체 클래스 이름과 비슷해야 하고 실제 클래스 이름을 참조하지 않는다.

android:permission 
 이것이 설정된다면 targetActivity 퍼미션을 대체한다. 설정이 되지 않는다면 앨리어스를 통해 타겟을 활성화 하기 위한 퍼미션은 필요하지 않다.

android:targetActivity  앨리어스를 통해 활성화 될 수 있는 액티비티의 이름을 지정한다.

출처 : http://chiyo85.tistory.com/32

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

패키지와 어플리케이션 구성요소  (0) 2011.01.28
RIL (Radio Interface Layer)  (0) 2011.01.28
SMS 한글 깨지는 문제  (0) 2011.01.28
SMS 보내기  (0) 2011.01.28
KeyBoard 보이거나 숨기기  (0) 2011.01.28

음; '호환성이슈'이라는 항목으로 올리는게 맞는지 모르겠습니다만...
기존에 XDADevelopers 사이트에서 포팅해놓은 HTC WinMo 기기들의 한국 SMS 포팅 관련 문제가 있어서 이렇게 포스팅합니다.

실제로 저는 Xperia X1 (HTC Kovsky)를 가지고 있으며
xdandoid를 이용해 Froyo 버젼 제 스마트폰에 사용중입니다.

한국 SMS 문제를 정리하면 다음과 같습니다
  • SMS 수신오류 - 잘못된 전화번호 / 메세지 없음
  • SMS 발신오류 - 메세지 내용 깨짐 (인코딩 문제)
결론부터 말씀드리면 문제의 원인은 SKT, KTF가 GSM SMS 기준을 약간? 어겼기 때문입니다. (완전이 어긴건 아니지만서도;;;)

GSM SMS의 전송 규칙은 음... 네트워크의 DataGram같은 일종의 데이터 형식을 따르는데 이를 PDU라고 부릅니다.
PDU(Protocol Data Unit)는 SMS를 전송할 때 일종의 데이터 포맷인데 3GPP라는 기관에서 정한다고 합니다.

문자가 왔을 때 전송되는 SMS-DELIVERY PDU 문자열을 예로들면,
"0791280102198188440AA15117180890000401802291018263130A22080B811040309814F761623132B0A1B3AA"
이런식으로 PDU 문자열이 날아옵니다

이 PDU를 조각조각 분해하면 다음과 같은 결과가 나옵니다.
이전에 제가 안드로이드펍에서 SMS 분석 슬라이드를 본적이 있는데 링크를 까먹어서;
무책임하지만 그 슬라이드를 찾아서 확인해 보시면 매우 자세하게 SMS PDU구조가 나옵니다.

07 // SMSC octet size = 7
91 // type-of-address of the SMSC
280102198188 // service center +82102091888
44 // TP-UDHI(UserDataHeaderIndicator), TP-MMS(More messages to send)
0A // length of sender number
A1 // 1010 0001, national number/isdn/telephone numbering plan
5117180890 // 1571818009
00 // Protocol Identifier
84 // Data Coding Scheme 1000 0100
01802291018263 // 2010/08/22 19:10:28
13 // (User Data) length, 0x13 = 19
0A // (User Data) Header octet size = 10
22 // (User Data) type-of-address(toa)
08 // (User Data) type-of-protocol(TP)
0B // (User Data) length of local phone number, 0x0b = 11
81 // (User Data) 1000 0001, unknown/telephone numbering plan
101021436587 // (User Data), sender number 01012345678
61623132B0A1B3AA // (User Data) text message "ab12가나"

만일 이 SMS-DELIVERY PDU를 국내 SMS 처리가 안된 안드로이드 소스로 처리하게 되면
    발신자: 1571818009
    내용:(내용없음)
이런 식으로 SMS 가 도착합니다. 실제 발신자는 01012345678이고 내용은 "ab12가나"임에도 불구하고 말이죠;

이제 문제를 밝혀봅시다

  1. 수신 문제의 첫번째 '메세지 없음'은 위에 빨간색으로 표시한 두부분에 의해서 발생합니다
첫째로 Data Coding Scheme에 0x80 비트는 미래를 위해 남겨놓은 그룹지정 비트입니다.
따라서 외국에서 개발된 소스에는 저 그룹지정 비트에 대한 어떠한 언급도 없죠. 그냥 Unknown Encoding Scheme입니다;
당연히 모르는 타입의 메세지를 더이상 처리안하고 넘어가는 경우가 많습니다. 따라서 메세지 수신시에 어떠한 내용도 표시되지 않죠;

=> RIL code에서 저 Data Coding Scheme을 처리해주던가
=> 또는 안드로이드 프레임워크내의 Telephony 소스에서 저 Data Coding Scheme에 대해서 처리할 수 있도록 변경해줘야합니다.

  2. 이상한 번호로 문자가 오는 문제는 위에 파란색으로 표시한 부분에 의해 발생합니다.
위의 PDU 예에 따르면 보낸사람 번호는 "1571818009"이지 "01012345678"이 아닙니다;
당연히 문자를 보낸사람은 "1571818009"로 표시가 됩니다; 그리고 국내에서 사용한 전화번호는 밑에 User Data Header에 숨겨져 있네요;

=> Data Coding Scheme & 0x80 혹은 User DataHeaderNumberingPlan & 80 이라면 User Data Header에서 보낸사람 주소를 꺼내서 표시해줘야합니다. 이것도 역시 RIL SMS 코드내에서 수정을 하던가 혹은 안드로이드 Telephony 코드를 수정해야합니다

  3. 보너스 문제로 한국어 인코딩 문제가 있습니다.
위 PDU 예에서 텍스트 메세지 "61623132B0A1B3AA" 가 "ab12가나"로 해석되어야합니다.
그런데 "61623132"는 쉽게 해석이 됩니다. 0x61 => 'a', 0x31 => '1' 이 부분은 ASCII 코드이면서 동시에 UTF-8 코드로 해석될 수 있죠.
문제는 "B0A1B3AA"가 왜 "가나"로 해석되냐 입니다. 실제로 GSM SMS 표준에 따르면 Data Coding Scheme으로 3가지가 가능합니다
  1. GSM7bit (Default 7bit 문자셋에 기반한 7bit 코딩입니다. 자세한건 패스;)
  2. 8bit (UTF-8)
  3. 16bit (UCS-2)
그러면 "61623132"같은 8bit 단위 문자에 따라서 "B0A1B3AA"도 UTF-8 코딩으로 해석하면 될까요? 그렇지 않습니다.
UTF-8 코딩에 따르면 "가나"같은 문자는 한 문자당 3byte로 변환이 됩니다;
위에 "B0A1B3AA"는 실제로 EUC-KR (KSC5601) 코딩을 사용하고 있습니다.
당연히 위에 GSM SMS의 Data Coding Scheme 표준에 따르지 않으므로 한글은 깨져서 해석이 됩니다;
이 문제를 해결하면 문자를 받았을 때 글자가 깨지는 문제가 없어지겠죠.

=> Data Coding Scheme & 0x80 이라면 메세지 내용을 EUC-KR => UTF-8 혹은 UCS-2 변환해야합니다
다행히도 C로 개발시에는 안드로이드 소스의 external/icu4c를 사용하시면 되고
Java에서는 스트링을 읽을때 String(text, "KSC5601") 하시면 될겁니다.


여기까지가 제가 문제를 확인하고 분석한 결과입니다.
마지막으로, 만일 SMS 소스 부분의 작업이 필요하시면 안드로이드 프레임워크내의 Telephony코드를 수정하라고 권해드리고 싶네요.
왜냐하면 어떤 스마트폰이냐에 상관없이 수정해야하는 SMS 코드이기 때문입니다.
음; 그러나 저는 불행히도 제가 빌드하지 않은 안드로이드 system.img를 사용하고 있기 때문에 RIL 코드를 수정해야 했습니다.
HTC ril 소스 부분은 정말 버그가 많네요; 제가 능력이 된다면 xdandroid 부분에 htc-ril 관련 소스 코드를 바로잡고 싶습니다.
기회가 될런지 모르겠네요.

틀린 부분이 있으면 지적해주시고
게시판을 잘못 찾아왔다면 역시 지적해주시고
뭔가 궁금한 부분이 있으시면 역시 질문해주시길 바랍니다.
그럼 저로인해 삽질이 조금이라도 줄어들기를 바라며 이만 줄입니다.

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

RIL (Radio Interface Layer)  (0) 2011.01.28
<activity-alias>  (0) 2011.01.28
SMS 보내기  (0) 2011.01.28
KeyBoard 보이거나 숨기기  (0) 2011.01.28
Eclipse에서 android Full Source 연결해서 개발환경 만들기  (0) 2011.01.28

private void sendSMS(String phoneNumber, String message)
    {        
        String SENT = "SMS_SENT";
        String DELIVERED = "SMS_DELIVERED";
 
        PendingIntent sentPI = PendingIntent.getBroadcast(this, 0,
            new Intent(SENT), 0);
 
        PendingIntent deliveredPI = PendingIntent.getBroadcast(this, 0,
            new Intent(DELIVERED), 0);
 
        //---when the SMS has been sent---
        registerReceiver(new BroadcastReceiver(){
            @Override
            public void onReceive(Context arg0, Intent arg1) {
                switch (getResultCode())
                {
                    case Activity.RESULT_OK:
                        Toast.makeText(getBaseContext(), "SMS sent", 
                                Toast.LENGTH_SHORT).show();
                        break;
                    case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
                        Toast.makeText(getBaseContext(), "Generic failure", 
                                Toast.LENGTH_SHORT).show();
                        break;
                    case SmsManager.RESULT_ERROR_NO_SERVICE:
                        Toast.makeText(getBaseContext(), "No service", 
                                Toast.LENGTH_SHORT).show();
                        break;
                    case SmsManager.RESULT_ERROR_NULL_PDU:
                        Toast.makeText(getBaseContext(), "Null PDU", 
                                Toast.LENGTH_SHORT).show();
                        break;
                    case SmsManager.RESULT_ERROR_RADIO_OFF:
                        Toast.makeText(getBaseContext(), "Radio off", 
                                Toast.LENGTH_SHORT).show();
                        break;
                }
            }
        }, new IntentFilter(SENT));
 
        //---when the SMS has been delivered---
        registerReceiver(new BroadcastReceiver(){
            @Override
            public void onReceive(Context arg0, Intent arg1) {
                switch (getResultCode())
                {
                    case Activity.RESULT_OK:
                        Toast.makeText(getBaseContext(), "SMS delivered", 
                                Toast.LENGTH_SHORT).show();
                        break;
                    case Activity.RESULT_CANCELED:
                        Toast.makeText(getBaseContext(), "SMS not delivered", 
                                Toast.LENGTH_SHORT).show();
                        break;                        
                }
            }
        }, new IntentFilter(DELIVERED));        
 
        SmsManager sms = SmsManager.getDefault();
        sms.sendTextMessage(phoneNumber, null, message, sentPI, deliveredPI);        
    }

안드로이드 SMS 문자 전송 클래스 예제

SEND_SMS 퍼미션을 추가해 주어야 사용이 가능하다.

SMS delevered 와 SMS not delevered 메세지는 에뮬레이터상에서는 보이지 않으며 실제 기기에서만 표시된다.

sentPI  deliveredPI 는 메세지의 전송 상태를 보기 위해 등록된 것이기 떄문에 동작결과에 따른 행동은 맞게 편집을 해주자.

이 부분은 빼고 아래와 같이 작성하여도 SMS 전송은 가능하다.



private void sendSMS(String phoneNumber, String message)
    {        
        SmsManager sms = SmsManager.getDefault();
        sms.sendTextMessage(phoneNumber, null, message, null, null);        
    }

출처 : http://yobin.egloos.com/2870783

키보드 보이게 하기
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");
         }
        }
    }

+ Recent posts