Home Screen을 사용하는 Widget을 만드는 방법을 정리해 보자
Widget을 만들려면 다음과 같은 3가지가 필요하다.
1. AppWidgetProviderInfo
  Widget의 metadata를 정의한다. AppWidgetProvider class, Widget layout 그리고 업데이트 주기등을 XML에 정의한다.
/res/xml 에 해당 xml로 정의하면 된다.

2. AppWidgetProvider
  실제 Widget Application.
업데이트 등 처리

3. View Layout 
  초기 layout을 정의하며, 이는 optional

또한 Widget을 설정하기 위한 Widget Configuraion을 정이할 수 있다. (반드시 있어야 하는 것은 아님)

본격적으로 Widget을 만들어 볼까? 간단하게 Home에 시간을 나타내는 Widget을 만들어 본다.
(나중에 안 사실이지만 Time같이 초단위로 화면이 업데이트 되어야 하는 것들은 Widget으로 만들면 안된다. 업데이트 주기의 minimum값이 있는 것 같다.더 확인해봐야 겠지만 거의 30분정도...^^ 또 삽질했다)
1. Mainfest에 Widget Application 선언   
<application android:icon="@drawable/icon" android:label="@string/app_name">
        <receiver android:name=".TimeWidget" android:label="Timer Widget">
            <intent-filter>
                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
            </intent-filter>
            <meta-data
                android:name="android.appwidget.provider"
                android:resource="@xml/time_widget_provider" />
        </receiver>
    </application>
    <uses-sdk android:minSdkVersion="5" />
  TimerWidget이라는 Class를 만들로 providerInfo는 /xml/time_widget_provider.xml을 사용하기로 정의한다.
그리고 WidgetProvider는 receiver의 기능을 하기 때문에 activity가 아닌 receiver로 정의하고, 안드로이드 예제처럼 별도의 receiver를 만들지 않고 WidgetProvider에서 receiver의 onReceive() method를 override하여 구현한다.

2. AppWidgetProviderInfo Metadata 추가하기
<appwidget-provider
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:minWidth="146dp"
    android:initialLayout="@layout/main"
    android:updatePeriodMillis="1810000"
    android:minHeight="144dp"/>
초기 화면의 layout은 /layout/main.xml을 사용한다. 그리고 사이즈를 정의한다. 업데이트 주기는 30분 이상으로 설정한다.

3. Widget layout
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/LinearLayout01"
    android:layout_height="146dp"
    android:layout_width="144dp"
    android:orientation="horizontal">
    <TextView
        android:id="@+id/widget_timeview"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:gravity="center_vertical|center_horizontal"
        android:textColor="@android:color/black"
        android:textSize="12pt"
    />
</LinearLayout>

  Time을 화면에 그리기 위한 TextView를 정의한다.

4. AppWidgetProvider를 상속한 class 생성

public class TimeWidget extends AppWidgetProvider {

    java.text.DateFormat timeformat = SimpleDateFormat.getTimeInstance( SimpleDateFormat.MEDIUM, Locale.getDefault() );

 @Override
    public void onUpdate( Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds )
    {
        updateTime( context, appWidgetManager);
    }
   
 @Override
    public void onReceive(Context context, Intent intent) {
        updateTime( context, AppWidgetManager.getInstance(context););
    }

    public void updateTime( Context context, AppWidgetManager appWidgetManager)
    {
        RemoteViews remoteViews1;
        ComponentName watchWidget;
       
        remoteViews1 = new RemoteViews( context.getPackageName(), R.layout.main );
        watchWidget = new ComponentName( context, WatchWidget.class );
        remoteViews1.setTextViewText( R.id.widget_timeview, timeformat.format( new Date()));
        appWidgetManager.updateAppWidget( watchWidget, remoteViews1 );
    }
   
}

 emulator에서 확인해 보니 실제 WIdget이 화면에 설정되면 onReceive() method가 호출되고 업데이트 주기가 되면 onUpdate() method가 호출됨을 확인하였다.

5. Widget 설정하기
  이렇게 만들어진 Widget을 어떻게 단말에 설정할까? emulator의 menu > add > widget을 선택하면 설정할 수 있는 widget list가 나온다 그리고 선택하면 된다.
근데 지울때는? 이거땜에 구글링을 했다.  Widget을 한 2초 정도 누르고 있으면 하단에 휴지통이 생긴다. 그럼 선택한 widget을 휴지통에 드래그하면 삭제된다.

주의) 삽질하고 알아낸 건데 업데이트 주기는 30분 이상으로 설정되어야 하는 것 같다.

Posted by 피의복수

1. emulator
  eclipse를 통해 구동하다보면 가끔씩 오류가 발생한다.
이럴 때는 당황하지 말고 SDK가 설치된 directory로 이동하여 emulator를 직접 구동해 보자

tools >emulator -avd avd_name 으로 emulator를 실행한 후에 실행 option에서 실행한 avd_name을 선택하면 오류가 없다.
참고로 자세한 사용법은 tools > emulator -help를 확인해 보셈^^
기존에 설치된 것을 초기화하기 위해서는 -wipe-data option을 추가해서 실행하면 되겠다.
Widget을 삭제하려면 드래그해서 휴지통에 넣으라는데....에뮬에서는 휴지통을 못 찾겠네.
==> 위젯을 좀 오래 클릭해보면 하단에 휴지통이 나타난다. 이 후 드래그해서 넣으면 끝^^

2. Log
  Java의 log4j처럼 유사한 Log를 제공한다.
Log.i(Information), Log.d(Debug)등을 활용하면 된다. 물론 System.out.println도 가능하다.
이렇게 남겨진 로그는 DDM을 이용해 확인해 보면 된다.
DDM은 어디 있을까?

tools > ddms  참 쉽죠~~잉

3. SDK Update
  eclipse에서 SDK Update하는 경우에는 발생하지 않는데, SDK의 "SDK Setup.exe"를 통해 Update를 할 경우 https://xxxxx/repository.xml에 대한 접근 오류가 나는 경우가 있다. (이것 땜에 또 삽질)
Window 사용자라면 사용자 계정 directory로 가봐라. ./android라는 directory가 보일 것이다.
그 밑에 보면 androidtool.cfg 가 있는데 여기에 sdkman.force.http=true 추가하면 그 뒤로는 접속이 될 것이다.
게속 삽질중...^^

Posted by 피의복수

단말 번호를 가져오려면 아래와 같이 해본다.
우선 manifest 파일에 권한을 부여해야 한다.
<uses-permission android:name="android.permission.READ_PHONE_STATE" />

TelephonyManager telephony = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);
telephony.getLine1Number(); // 단말 번호 가져오기
Log.i("Phone Number",telephony.getLine1Number());
단말 번호가 MSISDN이라고 하던데...국내에 들어오면 달라질 수 있을래나?

위의 TelephonyManager를 활용하면 다양한 단말의 정보를 가져올 수 있다.
MCC, MNC 및 기타 단말의 통신사 정보, Network 정보등을 조회할 수 있다.
단 Wi-Fi, Mobile을 사용하고 있는지에 대해서는 별도의 ConnectivityManager를 활용하면 될 것 같다.
Posted by 피의복수

Screen Size를 조회하기 위해서는 아래와 같이 해본다.

Display display = getWindowManager().getDefaultDisplay();
int width = display.getWidth();
int height = display.getHeight();
Log.i("Screen",String.valueOf(width) + "*" + String.valueOf(height));

Posted by 피의복수

  안드로이드 graphics는 custom 2D library와 고성능 3D를 위한 OpenGL ES1.0을 제공한다.

Consider your option
  2D graphics를 그릴 때 다음 두 가지 중 하나를 사용하게 될 것이다.
1) Layout에서 View object로 graphic이나 animation을 그리는 경우.
  - 동적인 변화가 필요없는 graphic, 그리고 성능에 민감한 게임이 아닌 경우에 적합하다.
  - static graphic이나 미리정의된 animation을 출력할 경우에 사용할 수 있다.
2) Canvas에 직접 graphic을 그리는 경우
  - 규칙적으로 re-draw가 필요한 경우에 적합
  - UI Activity로서 동일한 Thread에서 layout에 custom View object를 생성 시 invalidate()를 호출하고 onDraw callback을 다루면 된다.
  - 다른 Thread에서는 SurfaceView를 관리하고 thread의 성능 맞추어 빠르게 Canvas에 그린다.

Simple Graphics Inside a View
  단순한 graphic(images, shapes, colors, pre-defined animation)을 그리는경우는 View 의 background에 그리거나 layout의 ImageView의 Content에 그린다.

Draw with a Canvas
 
특화된 drawing이나 graphic의 animation을 제어하는 application을 개발하려면, Canvas를 통해 drawing을 해야 한다.











Posted by 피의복수

BLOG main image
일에 필요한 자료 by 피의복수

카테고리

분류 전체보기 (40)
프로그램이야기 (38)
끄적끄적 (1)
취미 (0)
서비스이야기 (1)
빅데이터 (0)

최근에 올라온 글