9일차=================================================

[gmail 계정 생성하기]


[과제] 탭브라우징
교재  p277
1) IntentTabDemo 
2) AcornBrowser
3) AndroidBrowser

[과제2]
1) 인텐트 호출을 암시적호출로 바꾸고
Intent intent = new Intent("MyBrowser");
intent.putExtra("url", "http://okgosu.net");

2) 인텐트 호출할 때 웹주소를 넘겨서 MyBrowser클래스에서 받아서 처리하도록 함
Intent intent = getIntent();
String url = intent.getStringExtra("url");
browser.loadUrl(url);


[원래]
String data = el.getElementsByTagName("title").item(0)
.getFirstChild().getNodeValue();
items.add(data);


[바꿀내용]
1) 
Element title = (Element)el.getElementsByTagName("title").item(0);
items.add(getElementValue(title));

2) 함수 추가
private static String getElementValue(Element e) {
if (e == null)
return "Nothing";
Node temp = e.getFirstChild();
StringBuilder sb = new StringBuilder();
while (temp != null) {
sb.append(temp.getNodeValue());
temp = temp.getNextSibling();
}
return sb.toString();
}

3) getView에서 html이 표시되도록
label.setText(Html.fromHtml(items.get(position).toString()));

[LBS] - Location Based Service (위치기반 서비스)

1. 현재 위치 확인: GPS - 인공위성(3개이상)
1) GPS 문제점
- 오차(수십미터)
- 실내, 하늘이 가릴 때, 빌딩숲
- 보완 알고리즘 : network (3G, WiFi기지국 위치)
2) LocationProvider: gps? nework? 등 현재위치 확인 수단 제공  
3) LocationListner: 현재위치 변화를 감지, LocationProvider 상태 변화감지
4) 위치정보 (GoeCode) --> 구글서버에 쿼리 
위도/경도 --> 주소 : 1건
주소 --> 위도/경도 : 다건

2. 현재 위치를 지도에 표시 : MapView를 사용 --> apiKey --> 구글계정
- 레이어 방식 : 지도 - 인공위성 사진 - 교통정보 
- 마커를 이용해서 표시 

3. 구글맵 사용절차
1) 구글맵 apiKey 받기 
2) 구글맵 AVD 생성 
3) 구글맵 - 안드로이드 프로젝트 생성
4) 프로젝트 설정 - 구글 라이브러리
<uses-library android:name="com.google.android.maps" android:required="true"/>
5) 권한 설정 - 인터넷, 위치 정보
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.INTERNET"/>
6) MapView에 apiKey 값 설정: my_map_view.xml 


[구글키 받기]
cd .android

1. MD5 값 생성
keytool -list -alias androiddebugkey -keystore debug.keystore -storepass android -keypass android
* JDK패스가 설정안된 경우
"C:\Program Files\Java\jdk1.5.0_19\bin\keytool" -list -alias androiddebugkey -keystore debug.keystore -storepass android -keypass android

2. 구글맵키 등록 사이트로 이동
http://code.google.com/android/maps-api-signup.html

3. 약관 동의 체크

4. MD5값을 입력후 "Generate API Key"클릭
--> apikey값 저장

* 지도 테스트
startActivity(new Intent(Intent.ACTION_VIEW, 
Uri.parse ("geo:55.636051,12.398769")));

[피자마을]
Longitude: 12.398769
Latitude: 55.636051

[비행기무덤]
Longitude: -110.827760
Latitude: 32.153887
(geo:32.153887,-110.827760)

Haveforeningen Hareker
Haveforeningen Harekær

keytool -list -alias androiddebugkey -keystore debug.keystore -storepass 
android -keypass android


[과제] 교재 p234  

1. 레이아웃 message_demo.xml

2. Activity : MessageDemo.java

3. 다음을 .show() 위에 라인에 추가함
1) "확인" 버튼을 추가하고, "확인"을 클릭하면 Toast메시지로 "확인했습니다" 출력
.setPositiveButton("확인", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int whichButton) {
             Toast.............띄우기
             }
 })

2) "취소" 버튼을 추가하고, "취소"를 클릭하면 아무것도 안함
.setNegativeButton("취소", null)


[과제]
1. 현재 위치 정보를 받으면 대화 상자를 띄움 onLocationChanged

2. 대화 상자에는 확인/취소 버튼 추가
   1) 확인을 클릭하면 지도보기로 이동
   2) 취소를 클릭하면 그냥 닫기

3. GPS 설정 상태 확인 (onCreate)
String gs = android.provider.Settings.Secure.getString(getContentResolver(),
android.provider.Settings.Secure.LOCATION_PROVIDERS_ALLOWED);
if (gs.indexOf("gps", 0) < 0) {
    Toast.makeText(MyLocationView.this, "GPS 설정안됨", 1000).show();
    
    //GPS가 안켜져있으면 켜는 설정으로 이동
    new AlertDialog.Builder(MyLocationView.this)
    .setTitle("GPS 설정")
    .setMessage("GPS가 꺼져 있습니다. GPS를 켜시겠습니까?")
    .setPositiveButton("GPS켜기", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int which) {
          Intent intent = new Intent(android.provider.Settings.
              ACTION_LOCATION_SOURCE_SETTINGS);
          startActivity(intent);
       }
    }).show();  
} else {
    Toast.makeText(MyLocationView.this, "GPS 설정됨", 1000).show();
}


[과제] : LocationManager에 근접 알림 설정
- 송파구 가락동 반경 500m에 근접시 알림발생하도록 설정
- 알림이 발생하면 Intent가 실행되고, okgosu.net 사이트로 이동함

double latitude = 37.493835;
double longitude = 127.121314;
PendingIntent pintent = PendingIntent.getActivity(MyLocationView.this, 0, 
new Intent(Intent.ACTION_VIEW, Uri.parse("http://okgosu.net")), 0);
locationMgr.addProximityAlert(latitude, longitude, 500, -1, pintent);

* 에뮬레이터에서는 
좌표를 127.121314, 47.493835 로 보냈다가
다시 좌표를 127.121314, 37.493835 로 수정해서 보낸다.


[과제] 현재 위치 정보 사용 안하기 
onLocationChanged의  AlertDialog의 setNegativeButton에서
 "취소"를 클릭하면 현재위치 정보 업데이트 안하도록 설정

1)  .setNegativeButton("취소", null) 에 리스너 설정

2) 취소를 누르면 다음 코드가 실행
      locationMgr.removeUpdates(MyLocationView.this); 

[현재 위치 표시]
1. MapActivity 사용
MapView  + Activity = MapActivity 

2. 레이아웃에는 MapView사용
apiKey 

* 참고
- ListView + Activity = ListActivity
- TabHost + Activity = TabAcitvity
- Preference + Activity = PreferenceActivity

3. GeoCoder: getFromLocationName - 주소를 검색하면 위도, 경도가


[과제]: MyMapView 수정

1. 현재 위치에 gmarker.png 파일을 표시한다.

2. 주소를 검색하면 검색결과를 다이얼로그로 띄운다.
- 다이얼로그에서 선택한 주소를 지도에 표시한다.

1) String placeName = loc_name.getText().toString(); 밑에 다음을 추가
ArrayList<String> addrs =new ArrayList<String>();

2) geocodeResults를 다음과 같이 변경
변경전: List<Address> geocodeResults;
변경후: final List<Address> geocodeResults;

3) results.setText(locInfo); 밑에 다이얼로그가 표시되도록 코드 추가 

final String[] addresses = addrs.toArray(new String[addrs.size()]);
new AlertDialog.Builder(MyMapView.this)
    .setTitle(placeName + " 검색 결과")
    .setSingleChoiceItems(addresses, 0, new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int whichButton) {
        }
    })
    .setPositiveButton("확인", new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int whichButton) {
        }
    }).setNegativeButton("취소", null)
.show();     

4) 검색결과 추가
addrs.add(loc.getFeatureName());

5) 다이얼로그에서 각 아이템을 클릭하면 Toast 표시 (setSingleChoiceItems 클릭리스너)
    Toast.makeText(MyMapView.this, addresses[whichButton], 1000).show();

6) 확인을 누르면 선택한 아이템으로 이동 (setPositiveButton 클릭리스너)
        Address where = geocodeResults.get(whichButton);
        lat = where.getLatitude();
        lon = where.getLongitude();     
        mapControl.animateTo(new GeoPoint((int) (lat * 1E6), (int) (lon * 1E6)));
        mapControl.setZoom(15);                         
   
[과제]
1. my_map_view.xml 에 체크박스 추가

2. MyMapView에 onCreate 함수에 체크박스 리스너를 추가함
map.setSatellite(true); 인공위성 사진표시 함
map.setSatellite(false); 인공위성 사진표시 안함
profile