OpenFrameWork

오픈프레임워크_Day81

px 2015. 7. 8. 16:06

### : 목차 구분 기호
--- : 목차 내에 항목 구분 기호
@@@ : 태그 용도 
,,, : 같은 목차 내에 구분 기호

목차
1. 이론 및 정보
2. 설정 및 그 밖에
3. 소스코드 또는 실습
4. 과제

###################################
1. 이론 및 정보
-----------------------------------
* 안드로이드에서 Log는 자동으로 지워짐?
----------------------------------- 
* LBS
- 인공위성을 통해 알아내는 방법 - GPS
- 기지국 이용하는 방식 - Wifi, 3G 이용
----------------------------------- 
* 쉽게 위도, 경도를 찾아주는 사이트
http://mygeoposition.com/
----------------------------------- 
* 구글 맵 v1, v2 있음
v2만 지원함
MapView -> Fragment 
-----------------------------------
* 구글 맵 서비스 이용하려면 아래 내용 설치 되어 있어야함


프로젝트 Import



~\android-sdk\extras\google\google_play_services\libproject\google-play-services_lib


프로젝트로 배포가 되어 있음


이를 쓰고자하는 프로젝트가 참조를 해야함

프로젝트 우클릭 - 프로퍼티 

적당한 버전 클릭






아래와 같이 API와 Private Lib가 추가 되어있는지 확인

----------------------------------- 
###################################
2. 설정 및 그 밖에
-----------------------------------
* 프로젝트 생성 
LbsApp
프로젝트 생성시에 Package 절대 중복되지 않는 걸로 하기
com.uticleTest1.lbsapp
----------------------------------- 
* GPS, Wifi(3G) 퍼미션 추가

android.permission.ACCESS_FINE_LOCATION
android.permission.ACCESS_COARSE_LOCATION
----------------------------------- 
* 에뮬레이터에서 GPS 테스트는 DDMS의 Location Controls를 이용

위도, 경도를 미리 DDMS에 사이트에서 찾아서 넣어주고
나오는지 확인
----------------------------------- 
* jar가 아닌 파일들 projct 
-----------------------------------  
* 구글 Map 쓰기위한 Permission 만들어야함

-----------------------------------  
* 구글 계정이 있어야함 키값
cloud.google.com/console
console.developers.google.com


로그인 하고
play.google.com/apps/publish/signup/
들어감 


code.google.com/apis/console
create 하고 
왼쪽에 API 및 인증 - 사용자 인증 정보 - 새 키 만들기 - 안드로이드 키 

상자 안에 내가 프로젝트 만들었다는 것을 증명을 해야함 

C:\Users\jhta\.android
위 폴더에 모든 환경 설정이 저장이 됨

C:\Users\jhta\.android\debug.keystore
를 구글에 알려주면 됨

해당 위치의 cmd 에서 
C:\Users\jhta\.android>keytool -list -v -keystore debug.keystore
비밀번호 없음 그냥 엔터

C:\Users\jhta\.android>keytool -list -v -keystore debug.keystore
키 저장소 비밀번호 입력:

*****************  WARNING WARNING WARNING  *****************
* 키 저장소에 저장된 정보의 무결성이  *
* 확인되지 않았습니다! 무결성을 확인하려면, *
* 키 저장소 비밀번호를 제공해야 합니다.                  *
*****************  WARNING WARNING WARNING  *****************

키 저장소 유형: JKS
키 저장소 제공자: SUN

키 저장소에 1개의 항목이 포함되어 있습니다.

별칭 이름: androiddebugkey
생성 날짜: 2015. 6. 23
항목 유형: PrivateKeyEntry
인증서 체인 길이: 1
인증서[1]:
소유자: CN=Android Debug, O=Android, C=US
발행자: CN=Android Debug, O=Android, C=US
일련 번호: 51d2317b
적합한 시작 날짜: Tue Jun 23 10:37:13 KST 2015, 종료 날짜: Thu Jun 15 10:37:13 KST 2045
인증서 지문:
         MD5: EE:40:01:A1:1C:F1:D2:4B:42:FA:DB:2E:25:B4:BE:9F
         SHA1: FC:2D:7E:C5:E8:EE:08:8E:A6:3A:E5:A5:7F:28:D0:33:C5:EF:32:10
         SHA256: 15:9C:1F:55:32:41:DA:1C:F1:32:84:DB:C2:FE:61:47:67:00:03:59:5C:32:9C:81:67:AC:A1:2D
:FD:11:D8:8D
         서명 알고리즘 이름: SHA256withRSA
         버전: 3

확장:

#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: E3 85 A0 03 63 48 DD 06   42 B6 C0 AB 9C D9 18 B7  ....cH..B.......
0010: E3 BD 85 15                                        ....
]
]

*******************************************
*******************************************

혹은 아래에도 있음


결국은 구글에서 필요로 하는 값이 아래와 같음

FC:2D:7E:C5:E8:EE:08:8E:A6:3A:E5:A5:7F:28:D0:33:C5:EF:32:10;com.uticleTest1.lbsapp


----------------------------------- 

* 에뮬레이터 새로 만듬 - 
Target,CPU가 Google API여야함



----------------------------------- 
Error



Window - Preferences - General - show heap status 체크



~\AndroidEclipse\eclipse.ini

맨 밑에

-Xms40m
-Xmx512m

아래로 변경

-Xms1024m
-Xmx1024m
 
-----------------------------------  
* 안드로이드 구글에서 필요한 설정

console.developers.google.com


아래 버튼 클릭



설정은 아래와 같이 되어 있으면 된다.


-----------------------------------
###################################
3. 소스코드 또는 실습 
-----------------------------------
3-1
WorkSpace : ~\study\AndroidWork 
/WebApp/src/com/example/webapp/HtmlParserList.java

package com.example.webapp;

import android.app.ListActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class HtmlParserList extends ListActivity {
     String listName[] = { "Gyeongju National Park", "Soklisan National Park",
               "Bukhansan National Park" };
     String listId[] = { "121900", "120500", "121500" };

     @Override
     public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                    android.R.layout.simple_list_item_1, listName);
          setListAdapter(adapter);

          ListView lv = getListView();
          lv.setOnItemClickListener(new OnItemClickListener() {
               @Override
               public void onItemClick(AdapterView<?> parent, View view,
                         int position, long id) {
                    Intent intent = new Intent(getApplicationContext(),
                              HtmlParserDetail.class);
                    intent.putExtra("parkId", listId[position]);
                    startActivity(intent);
               }
          });
     }

}
----------------------------------- 
3-2
WorkSpace : ~\study\AndroidWork
/WebApp/src/com/example/webapp/HtmlParserDetail.java

package com.example.webapp;

import java.net.URL;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import net.htmlparser.jericho.Element;
import net.htmlparser.jericho.HTMLElementName;
import net.htmlparser.jericho.Source;
import android.app.Activity;
import android.os.Bundle;
import android.os.StrictMode;
import android.util.Log;
import android.widget.TextView;

public class HtmlParserDetail extends Activity {
     private TextView tv;
     private String parkId;

     @Override
     public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          tv = new TextView(this);
          parkId = getIntent().getExtras().getString("parkId");
          tv.setText(getHtmlData());
          setContentView(tv);
     }
     
     // 실제로 HTML 파싱을 하는 메서드
     private String getHtmlData(){
          // 서버 주소 준비
          String url = "http://knps.or.kr/front/portal/visit/visitCourseMain.do?parkId=" + parkId;
          
          // 결과 담을 변수
          String src = "";
          
          try {
               // 안드로이드 정책상 네트워크는 Thread로 구현해야 하나 이번에는 임의로 
               // Thread 안만들어도 네트워크를 할 수 있겠끔 정책
               // 아래 코드 대신에 Thread로 만들어 보시오. Thread에 대한 이해를 파악 할 수 있음
               StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
               StrictMode.setThreadPolicy(policy);
               
               // URL 접속하기, 전부 긁어옴, DOM Api로 접근하기는 힘듬
               URL parkUrl = new URL(url);
               
               // jericho를 사용하기 위해서 준비, 제리코 source를 사용
               Source source = new Source(parkUrl);
               
               // div 태그 전부 가져오기
               List tagName = source.getAllElements(HTMLElementName.DIV);
               
               // Log.d(getLocalClassName(), "태그 갯수 : "+tagName.size());
               
               // 그대로 출력
               for (int i = 0; i < tagName.size(); i++) {
                    Element e = (Element)tagName.get(i);
                    if("f_text".equals(e.getAttributes().getValue("class"))){
                         src = e.getContent().toString();
                         // 태그 안에 내용들만 보여주고 싶으면 정규표현식이 편함
                         Pattern p = Pattern.compile("<(?:.|\\s)*?>");
                         Matcher m = p.matcher(src);
                         src = m.replaceAll(" ");
                    }
               }
               
               
               
          } catch (Exception e) {
               Log.e(getLocalClassName(), "getHtmlData() 오류 : " + e);
          }
          return src;
     }

}
----------------------------------- 
3-3
WorkSpace : ~\study\AndroidWork
/LbsApp/AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.uticleTest1.lbsapp"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="16"
        android:targetSdkVersion="21" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    <permission android:name="com.uticleTest1.lbsapp.permission.MAPS_RECEIVE"></permission>
    <uses-permission android:name="com.uticleTest1.lbsapp.permission.MAPS_RECEIVE"/>
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-feature android:glEsVersion="0x00020000" android:required="true"/>

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        
        <meta-data android:name="com.google.android.gms.version" 
            android:value="@integer/google_play_services_version"/>
        
        <meta-data android:name="com.google.android.maps.v2.API_KEY"
            android:value="AIzaSyDm0JLM-CgGNBdTXJaOrUK0u-gbTwLGPQs"/>
        
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name="LbsActivity"></activity>
        <activity android:name="GoogleMapActivity"></activity>
        <activity android:name="ItemOverlayActivity"></activity>
    </application>

</manifest>
----------------------------------- 
3-4
WorkSpace : ~\study\AndroidWork
/LbsApp/res/layout/activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="onBtnLbs"
        android:text="LBS" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="onBtnGoogleMap"
        android:text="GoogleMap" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="onBtnItemoverlay"
        android:text="Item OverLay" />

</LinearLayout>
----------------------------------- 
3-5 
WorkSpace : ~\study\AndroidWork
/LbsApp/src/com/uticleTest1/lbsapp/MainActivity.java

package com.uticleTest1.lbsapp;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;

public class MainActivity extends Activity {

     @Override
     protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);
     }

     public void onBtnLbs(View v) {
          startActivity(new Intent(MainActivity.this,LbsActivity.class));
     }

     public void onBtnGoogleMap(View v) {
          startActivity(new Intent(MainActivity.this,GoogleMapActivity.class));
     }

     public void onBtnItemoverlay(View v) {
          startActivity(new Intent(MainActivity.this,ItemOverlayActivity.class));
     }
}
----------------------------------- 
3-6
WorkSpace : ~\study\AndroidWork
/LbsApp/src/com/uticleTest1/lbsapp/LbsActivity.java

package com.uticleTest1.lbsapp;

import android.app.Activity;
import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.widget.TextView;
import android.widget.Toast;

public class LbsActivity extends Activity {
     private TextView tv;
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         tv = new TextView(this);
         setContentView(tv);
         
         LocationManager locManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
         
         // 에뮬은 GPS 가능
         // 실제 기기는 Wifi, 3G에서 가능
         
         LocHandler handler = new LocHandler();
         // GPS 서비스 , 1/1000 초 단위 , 미터 단위(얼마나 움직이냐),
          // locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,10000,0,handler);
         
         // 3G, Wifi 사용시
         locManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,10000,0,handler);
         
         // 가장 최근에 갱신된 정보를 가져오기
         try{
              // 어떤 장치를 통해서 알아냈는지 장치를 지정해줌
              Location loc = locManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
              
              if(loc != null){                   
                    Double lat = loc.getLatitude();
                    Double lon = loc.getLongitude();
                    Toast.makeText(getApplicationContext(), "latitude : "+lat+", "+"longitude : "+lon , Toast.LENGTH_SHORT);
              }
         }catch(Exception e){
              
         }
     }
     
     private class LocHandler implements LocationListener{

          @Override
          public void onLocationChanged(Location location) {
               // 위도
               Double lat = location.getLatitude();
               
               // 경도
               Double lon = location.getLongitude();
               
               tv.setText("latitude : "+lat+", "+"longitude : "+lon);
               
          }

          @Override
          public void onStatusChanged(String provider, int status, Bundle extras) {
               // TODO Auto-generated method stub
               
          }

          @Override
          public void onProviderEnabled(String provider) {
               // TODO Auto-generated method stub
               
          }

          @Override
          public void onProviderDisabled(String provider) {
               // TODO Auto-generated method stub
               
          }
          
     }

}
----------------------------------- 
3-7 
WorkSpace : ~\study\AndroidWork
/LbsApp/src/com/uticleTest1/lbsapp/GoogleMapActivity.java

package com.uticleTest1.lbsapp;

import android.app.Activity;
import android.os.Bundle;

public class GoogleMapActivity extends Activity {

     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_googlemap);
     }

}
----------------------------------- 
3-8 
WorkSpace : ~\study\AndroidWork
/LbsApp/src/com/uticleTest1/lbsapp/ItemOverlayActivity.java

package com.uticleTest1.lbsapp;

import android.app.Activity;
import android.os.Bundle;

public class ItemOverlayActivity extends Activity {

     /** Called when the activity is first created. */
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
     
         // TODO Auto-generated method stub
     }

}
----------------------------------- 
3-9 
WorkSpace : ~\study\AndroidWork
/LbsApp/res/layout/activity_googlemap.xml

<fragment xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/map"
    android:name="com.google.android.gms.maps.MapFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />
----------------------------------- 
###################################
4. 과제
-----------------------------------
-----------------------------------
###################################
5. 과제 해결
-----------------------------------
-----------------------------------
###################################
6. 기타
----------------------------------- 
-----------------------------------