이클립스 Package Explorer에서 SVN 아이콘

이클립스 Package Explorer에서 SVN 아이콘이 사라지는 경우가 발생한다.
이클립스의 Preferances -> General -> Appearance -> Label Decorations 메뉴에서 표시하고싶은 항목에 체크설정을 해주면 정상 표시된다.

svn

<supports-screens> Guide

supports-screens :
    APP이 지원하는 화면의 종류를 명시적으로 지정할때 사용
    (필수항목은 아니므로 해당 element가 없어도 무방)

문법 :

    <supports-screens android:smallScreens=["true" | "false"]
                      android:normalScreens=["true" | "false"]
                      android:largeScreens=["true" | "false"]
                      android:anyDensity=["true" | "false"] />

상위 엘리먼트 : <manifest>

설명 :

여러분으로 하여금 애플리케이션이 지원하는 스크린 크기를 지정하게 한다. 디폴트로 최신 애플리케이션(API 레벨 4 또는 그 이상을 사용하는)은 모든 스크린 크기를 지원하므로 여기서 명시적으로 특정 스크린 크기를 비활성화해야 한다; 오래된 애플리케이션은 “normal” 스크린 크기만을 지원하는 것으로 가정된다. 스크린 크기는 밀도density와 분리된 축이다. 스크린 크기는 밀도 조정이 적용된 후에 애플리케이션에 이용가능한 픽셀들로 결정된다.

타겟이 되는 다바이스 스크린 밀도에 기반하여, 안드로이드 프레임워크는 에셋을 0.75 비율 만큼 크기 축소(낮은 dpi 스크린)하거나 1.6 비율 만큼 크기를 확대(높은 dpi 스크린)할 것이다. 스크린 밀도는 인치당 도트 개수dots-per-inch (dpi)로 표시된다.

더 많은 정보에 대해서는 Multiple Screens Supprt
(http://developer.android.com/guide/practices/screens_support.html) 를 보라.

애트리뷰트 :

android:smallScreens

애플리케이션이 더 작은 스크린 외형form-factors을 지원하는 지 여부를 가리킨다. small 스크린은 “normal”(전형적인 HVGA) 스크린 보다 더 작은 가로 세로 비율을 가지는 스크린으로 정의된다. small 스크린을 지원하지 않는 애플리케이션은 작은 스크린 디바이스에서는 이용가능하지 않다. 왜냐하면, 그 디바이스 상의 플랫폼은 그런 애플리케이션이 더 작은 스크린에 대해서 거의 동작할 수 없게 하기 때문이다. API 레벨 4 또는 그 이상을 사용하는 애플리케이션은 디폴트로 이 값을 “참true”으로 설정하고 다른 애플리케이션은 “거짓false”로 설정한다.

android:normalScreens

애플리케이션이 “normal” 스크린 외형form-factors을 지원하는 지 여부를 가리킨다. 전통적으로 “normal” 스크린은 HVGA 중간 밀도 스크린이지만, WQVGA 낮은 밀도와 WVGA 높은 밀도 또한 “normal” 크기로 간주된다. 이 애트리뷰트는 디폴트로 “참true”이며, 애플리케이션들은 현재 그 방식대로 그대로 나두어야 한다.

android:largeScreens

애플리케이션이 더 큰 스크린 외형form-factors을 지원할 수 있는지 여부를 가리킨다. large 스크린은 “normal” 폰 스크린 보다 훨씬 더 큰 스크린으로 정의된다. 따라서 이것은 large 스크린을 잘 사용하기 위해 애플리케이션 영역에서의 특별한 주의를 요구할 지도 모른다. large 스크린을 지원하지 않는 애플리케이션은 최초의 디자인되었던 크기를 유지하기 위해 그러한 스크린 상에서는 “우표postage stamp”처럼 놓이게 될 것이다. API 레벨 4 또는 그 이상을 사용하는 애플리케이션은 디폴트로 이 값이 “참true”이고, 다른 애플리케이션은 “거짓false”이다.

android:anyDensity

애플리케이션이 임의의 스크린 밀도를 수용할 수 있는 지를 가리킨다. 더 오래된 애플리케이션(API 레벨 4 이전)은 모든 밀도를 지원할 수 없는 것으로 가정한다. 따라서, 이 애트리뷰트 값은 디폴트로 “거짓false”이다. API 레벨 4 또는 그 이상을 사용하는 애플리케이션은 모든 밀도를 지원할 수 있는 것으로 가정하고 이 애트리뷰트 값은 디폴트로 “참true”이다. 여러분은 여기서 명시적으로 여러분의 지원 능력을 지원할 수 있다.

도입 : API Level 4

'기술참고자료 > Android' 카테고리의 다른 글

View에 백그라운드 반복설정  (0) 2011.04.20
<TextView>에서의 줄간격 설정하기  (0) 2011.04.20
<support-screen>  (0) 2011.04.19
SIM의 IMSI값 읽어오기  (0) 2011.04.19
단말정보 조회관련 정보  (0) 2011.04.19

<support-screen>

안드로이드 SDK 1.6버전에는 새로운 속성의 element가 있다. <support-screen> 태그다.

이 태그는 우리 어플리케이션이 지원해야할 스크린 사이즈가 무엇인지 말해준다.
종류에는 android:smallScreens, android:normalScreens, android:largeScreens 그리고 android:anyDensity 가 있다.

이것은 manifest의 일부이다.

<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <supports-screens
        android:largeScreens="false"
        android:normalScreens="true"
        android:smallScreens="true"
        android:anyDensity="true"
        />
</manifest>


여기서 우리가 말하려는것은 무엇인가?

android:largeScreen 이 false 설정되어있는것은,
우리 어플리케이션은 large screens를 지원하지 않는다는 것을 말한다. 그러나 normal과 small screens, 이것들은 지원하며 true로 설정한다

android:anyDensity 파라미터는 의미하는것이 무엇인가? 여기 그 의미가 있다.
- 만일 이 값을 true로 놓는다면 우리는 안드로이드가 관리하는 내부 기능을 끄는것을 의미한다.

그리고 우리는 시스템에게 icons와 밀도를 우리가 관리할것을 얘기한다.
- 만일 false로 설정하면 우리는 안드로이드의 관리 시스템을 이용할 것을 설정한다. 뭐냐면..

안드로이드는 아이콘과 스크린에 대해 자동 조절을 하게 된다.

'기술참고자료 > Android' 카테고리의 다른 글

<TextView>에서의 줄간격 설정하기  (0) 2011.04.20
<supports-screens> Guide  (1) 2011.04.19
SIM의 IMSI값 읽어오기  (0) 2011.04.19
단말정보 조회관련 정보  (0) 2011.04.19
Android Graphics Example - Bitmap Image  (1) 2011.04.16

SIM의 IMSI값 읽어오기

IMSI(International Mobile Subscriber identity)
  1. 전세계적으로 unique한 값(15~18 digits)

  2. MCC(Mobile Country Code) + MNC(Mobile Network Code) + MSIN으로 구성

방법1.


Eclair 버전의
BluetoothHandsfree.java 의  
        parser.register("+CIMI", new AtCommandHandler() {
            @Override
            public AtCommandResult handleActionCommand() {
                // AT+CIMI
                String imsi = mPhone.getSubscriberId();
                if (imsi == null || imsi.length() == 0) {
                    return reportCmeError(BluetoothCmeError.SIM_FAILURE);
                } else {
                    return new AtCommandResult(imsi);
                }
            }
        });

방법2.
String phoneIMSI =
android.os.SystemProperties.get(android.telephony.TelephonyProperties.PROPERTY_IMSI);

String phoneIMEI =
 android.os.SystemProperties.get(android.telephony.TelephonyProperties.PROPERTY_IMEI);
방법3.
 
TelephonyManager mTelephonyMgr =
                        (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
  String imsi = mTelephonyMgr.getSubscriberId();
  String imei = mTelephonyMgr.getDeviceId();
  String phoneNumber = mTelephonyMgr.getLine1Number();

'기술참고자료 > Android' 카테고리의 다른 글

<supports-screens> Guide  (1) 2011.04.19
<support-screen>  (0) 2011.04.19
단말정보 조회관련 정보  (0) 2011.04.19
Android Graphics Example - Bitmap Image  (1) 2011.04.16
Android Graphics Example  (0) 2011.04.15

단말정보 조회관련 정보

1. AndroidManifest.xml 에 아래 권한 추가
<uses-permission android:name="android.permission.READ_PHONE_STATE" />

2. 아래와 같이 Context.getSystemService 를 통해 TelephonyManager 를 가져옴.
TelephonyManager telephony = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
        
3. TelephonyManager 의 메소드 들 중, getLine1Number() 메소드가 전화번호를 반환
String  telPhoneNo = telephony.getLine1Number();  
출처 ( http://icess.egloos.com/3279459 )

android.telephony 패키지의 TelephonyManager클래스에서 담당한다.

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

◆ 단말기의 모뎀상태 조회
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());
그러나 역시 한국어로는 동작하지 않았다.

'기술참고자료 > Android' 카테고리의 다른 글

<support-screen>  (0) 2011.04.19
SIM의 IMSI값 읽어오기  (0) 2011.04.19
Android Graphics Example - Bitmap Image  (1) 2011.04.16
Android Graphics Example  (0) 2011.04.15
[Android] Marquee effect in TextView  (0) 2011.04.06