Mar 222014
 

※ 이 문서는 Notification 자체에 대해서 설명하고 있는 것이 아니라 Notification을 알고 있다는 가정하에서 만들어야 할 앱이 API Level 11 미만을 지원해야할  경우를 위한 설명이다. Notification 자체에 대한 이해는 [1]을 참조하도록 한다.

안드로이드 Notification을 구현하는 방법은 여러가지가 있는데 하나는 기본 제공하는 양식을 사용하는 방법, 다른 하나는 Custom layout을 이용하여 구현하는 방법이 있다. 이 중에 기본 제공 양식을 사용하는 방법으로 구현을 해 보고자 한다.

하지만 안타깝게도 타겟 플렛폼 버젼이 8(Android 2.2, Froyo)이상으로 해야 했기 때문에 문제가 발생했다. 바로 기본 제공 방법을 사용할 경우에 Notification의 생성자가 deprecated 됬기 때문이다. 즉 사용하지 않는 것이 좋다는 뜻이다. 바로 이 메소드가 문제!

The notification constructor is deprecated

Notification의 생성자 Reference[2]

   빨간 네모박스의 내용과 같이 SDK 11버젼부터는 Notification.Builder를 대신 사용하라는 것을 알 수 있다.  그러면 어떻게 해야할까? 여러 인터넷 사이트를 찾아보던 도중 한 사이트[3]를 발견했고, 그곳에 따르면 빌드 환경에 따라서 다른 메소드를 사용할 수 있게 해준다는 것이였다. 아래와 같은 방법으로 가능하다.

 

 

 

if(Build.VERSION.SDK_INT >= 11) {
   // 안드로이드 플렛폼 버젼(API Level)이 11 이상일 경우 실행
} else {
   // 안드로이드 플렛폼 버젼이 11 미만일 경우 실행
}

즉  Notification을 11미만일 때와 11 이상일 경우를 다르게 하여 구현하면 된다는 것! 아래 코드를 보자

int icon = context.getApplicationInfo().icon // Notification 발생시 출력할 아이콘
String title = ""; // Notification 발생시 아래로 내렸을 때 첫번째 줄
String subtitle = ""; // Notification 발생시 아래로 내렸을 때 두번째 줄
String ticker = ""; // 이벤트 발생시 위에 출력될 내용 
Notification noti;

if(Build.VERSION.SDK_INT >= 11) {
    noti = new Notification.Builder(context)
      .setContentTitle(title)
      .setContentText(subtitle)
      .setTicker(ticker)
      .setSmallIcon(icon)
      .setContentIntent(pIntent)
      .build();
} else {
    noti = new Notification(icon, ticker, System.currentTimeMillis());
    noti.setLatestEventInfo(context, title, subtitle, pIntent);
}

위와 같이 구현하면 최소 SDK 버젼에 관계 없이 구현가능하다. 실제로는 위와 같이 구현하면 최소 API Level이 8이기 때문에 11에서 추가된 Notification.Builder는 이용할 수 없지만 위와 같이 하면 문제없이 빌드 가능하다. 만약 에러가 난다면 프로젝트를 clean하여 다시 빌드하도록  하자.

API 레벨에 대해서는 [3][4]을 참조하도록 한다.

 

 참고자료


[1] Android Developer – Notifications,  https://developer.android.com/guide/topics/ui/notifiers/notifications.html
[2] Android Developer – References, https://developer.android.com/reference/android/app/Notification.html#Notification(int, java.lang.CharSequence, long)
[3] 【android】OSのバージョン(APIレベル)によって処理を変える方法, http://nobuo-create.net/api/
[4] Android Developer – API Level, http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels

 

Apr 062011
 

 – 개발 프로젝트 생성시 : Bulid Target을 Google APIs 로 할 것…

= AndroidManifest.xml 수정 =


<?xml version=”1.0″ encoding=”utf-8″?>
<manifest xmlns:android=”http://schemas.android.com/apk/res/android
      package=”kr.pe.kuniz37.GoogleMapB”
      android:versionCode=”1″
      android:versionName=”1.0″>
    <uses-sdk android:minSdkVersion=”9″ />

    <application android:icon=”@drawable/icon” android:label=”@string/app_name”>
        <activity android:name=”.GoogleMaps”
                  android:label=”@string/app_name”
                  android:theme=”@android:style/Theme.NoTitleBar”>
            <intent-filter>
                <action android:name=”android.intent.action.MAIN” />
                <category android:name=”android.intent.category.LAUNCHER” />
            </intent-filter>
        </activity>
       
        <uses-library android:name=”com.google.android.maps” />
    </application>
   
    <uses-permission android:name=”android.permission.INTERNET” />
</manifest>


= res/layout/main.xml =

<?xml version=”1.0″ encoding=”utf-8″?>
<com.google.android.maps.MapView
 xmlns:android=”http://schemas.android.com/apk/res/android
 android:id=”@+id/mapview”
 android:layout_width=”fill_parent”
 android:layout_height=”fill_parent”
 android:clickable=”true”
 android:apiKey=”Your Code Input
 />

Yout Code Input 에는 debug.keystore의 md5 해시를 가져 와야 한다. 운영체제 마다 위치가 다르다.

 윈도우 7의 경우
   keytool -list -keystore /Users/<사용자 명>/.android/debug.keystore
   암호 : android

  인증서 지문(MD5) 에 나와 있는 값을 http://code.google.com/intl/ko-KR/android/maps-api-signup.html 에서 구한다.

= GoogleMaps.java =
 

import java.util.List;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;
import com.google.android.maps.OverlayItem;
import android.graphics.drawable.Drawable;
import android.os.Bundle;

public class GoogleMaps extends MapActivity {

 @Override
 protected boolean isRouteDisplayed() {
  return false;
 }

 /** Called when the activity is first created. */
 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);

  MapView mapView = (MapView) findViewById(R.id.mapview);
  mapView.setBuiltInZoomControls(true);

  List<Overlay> mapOverlays = mapView.getOverlays();
  Drawable drawable = this.getResources().getDrawable(
    R.drawable.androidmarker);
  HelloItemizedOverlay itemizedoverlay = new HelloItemizedOverlay(drawable);

  GeoPoint point = new GeoPoint(19240000, -99120000);
  OverlayItem overlayitem = new OverlayItem(point, “Hola, Mundo!”,    “I’m in Mexico City!”);
  itemizedoverlay.addOverlay(overlayitem);
  mapOverlays.add(itemizedoverlay);

 }
}

= HelloItemizedOverlay.java =

import java.util.ArrayList;
import android.app.AlertDialog;
import android.content.Context;
import android.graphics.drawable.Drawable;
import com.google.android.maps.ItemizedOverlay;
import com.google.android.maps.OverlayItem;

public class HelloItemizedOverlay extends ItemizedOverlay {
 private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>();
 private Context mContext ;

 public HelloItemizedOverlay(Drawable defaultMarker) {
  super(boundCenterBottom(defaultMarker));
 }

 public void addOverlay(OverlayItem overlay) {
  mOverlays.add(overlay);
  populate();
 }

 @Override
 protected OverlayItem createItem(int i) {
  return mOverlays.get(i);
 }

 @Override
 public int size() {
  return mOverlays.size();
 }

 public HelloItemizedOverlay(Drawable defaultMarker, Context context) {
  super(defaultMarker);
  mContext = context;
 }

 @Override
 protected boolean onTap(int index) {
  OverlayItem item = mOverlays.get(index);
  AlertDialog.Builder dialog = new AlertDialog.Builder(mContext);
  dialog.setTitle(item.getTitle());
  dialog.setMessage(item.getSnippet());
  dialog.show();
  return true;
 }
}


= 실행 =
 – 지도가 안나올 경우 한번 기다린다음에 다시 시도하거나 main.xml의 키를 잘 못 입력하였는지 확인한다.