Translate

2014년 3월 25일 화요일

[Android] WebView의 Local File(html) 로딩 시 jQuery 로 jsonp 사용이 안되는 문제



다음의 소스에서..
            $.ajax({
                type: 'POST',
                url: 'http://www.google.co.kr',
                dataType: 'jsonp',
                success: function(res) {
                    console.log('success: ' + res);
                },
                error: function(jqXHR, textStatus, errorThrown) {
                    console.log('error: \njqXhR: ' + jqXHR + '\ntextStatus: ' + textStatus + '\nerrorThrown: ' + errorThrown);
                },
                timeout: function(e) {
                    console.log('timeout: ' + e);
                },
                complete: function(e) {
                    console.log('complete: ' + e);
                }
            });



같은 소스를 WebServer 에 올려서 해당 URL을 로딩하면 정상적으로 작동하는 소스가
안드로이드의 assets 디렉토리에 넣고 WebView 에 file:///android_asset/index.html 이렇게 로드를 했을 경우에는 에러가 발생하는 문제가 있었다.



Logcat 을 찍었을 때 다음과 같이 표시가 되었다.
E/MyActivity( 2076): error:
E/MyActivity( 2076): jqXhR: [object Object]
E/MyActivity( 2076): textStatus: error
E/MyActivity( 2076): errorThrown: Method Not Allowed
E/MyActivity( 2076): LOG
E/MyActivity( 2076): file:///android_asset/index.html
E/MyActivity( 2076): complete: [object Object]
E/MyActivity( 2076): LOG
E/MyActivity( 2076): file:///android_asset/index.html



소스를 수정해보며 한참 삽질을 해보니.. 위에 적혀있는대로..

결론은 서버에서 지원되지 않는 메소드(POST)를 사용해서 그렇다.


Google은 서버에서 POST 메소드를 지원하지 않는다.(POST 요청시 응답코드 405)
jsonp 기술은 GET방식을 이용을 하는데 일반 브라우저에서는 type 을 POST라고 써도
GET방식으로 변환되어 전송되는 것으로 알고있다.
하지만 안드로이드의 Local File(html) 에서는 기술해 놓은 POST로 그대로 나가고 있었다.






그리고 jsonp 를 사용하는 이유가 크로스도메인 이슈를 해결하기 위해 사용을 하는건데
Android의 Webview에서 Local File(html)을 로드했을 시 jsonp 를 사용하지 않더라도 크로스도메인 이슈가 발생하지 않고 정상적으로 동작이 가능했었다.


즉 다음 소스가 크로스도메인 이슈 없이 작동을 한다는 거다.
        $.ajax({
            type: 'GET',
            url: 'http://www.google.co.kr',
            success: function(res) {
                console.log('success: ' + res);
            },
            error: function(jqXHR, textStatus, errorThrown) {
                console.log('error: \njqXhR: ' + jqXHR + '\ntextStatus: ' + textStatus + '\nerrorThrown: ' + errorThrown);
            },
            timeout: function(e) {
                console.log('timeout: ' + e);
            },
            complete: function(e) {
                console.log('complete: ' + e);
            }
        });



그리고 웹뷰의 설정에 다음이 포함되어야 Ajax 사용이 가능했었다.
        WebView webview = (WebView) findViewById(R.id.webview);
        WebSettings webSettings = webview.getSettings();
        webSettings.setJavaScriptEnabled(true);
        webSettings.setAllowUniversalAccessFromFileURLs(true);



테스트했던 소스를 업로드 했다.
소스 다운로드


2014년 3월 24일 월요일

[Driver] BM42 블루투스 동글이 드라이버




인터넷에 BM42 드라이버가 올려진게 있어서 링크 추가!!

드라이버 다운받기


제품정보


2014년 3월 20일 목요일

[Android] WebView 에서 console.log 를 Logcat 에 나오게 하기




웹에서 Javascript 로 작업을 하다보면 디버깅이나 로그를 확인 시

console.log() 를 많이 사용한다.



하지만 말그대로 브라우저에서 확인할 때만 확인이 가능하며
WebView에 해당 주소를 올리는경우 adb logcat 에는 출력이 되지 않는다.

adb logcat 에 console.log 가 출력을 시키려면 다음과 같이 작성한다.


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

        WebView webview = (WebView) findViewById(R.id.webview);
        WebSettings webSettings = webview.getSettings();
        webSettings.setJavaScriptEnabled(true);

        webview.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                view.loadUrl(url);
                return true;
            }
        });

        webview.setWebChromeClient(new WebChromeClient(){
            @Override
            public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
                Log.e(LOG_NAME, consoleMessage.message() + '\n' + consoleMessage.messageLevel() + '\n' + consoleMessage.sourceId());
                return super.onConsoleMessage(consoleMessage);
            }
        });
        webview.loadUrl("http://google.co.kr");
    }




2014년 3월 19일 수요일

[서점] 구로디지털단지에 있는 서점 - 강컴닷컴




컴퓨터 전문서점으로 유명한 사이트인 강컴닷컴
구로디지털단지에서 배송이 되는걸 아는사람이 많지 않은것 같다.

책이 필요하거나 하면 강컴닷컴에서 주문 후 회사에서 걸어서 5분도 안걸리기에
직접 찾아오는 편이다.

직접 방문해서 카드로 결재도 가능하나 포인트 적립이 안되니..
왠만하면 인터넷으로 결재 후 방문 수령이 좋은것 같다.


위치는 다음과 같다.
서울시 구로구 구로3동 851 한화비즈메트로 1차 7층 713호


지도를 클릭하시면 위치정보를 확인하실 수 있습니다.

PS.
문은 굳게 닫혀 있으며 강컴이라는 문구도 하나 없어서 그냥 문닫은 회사마냥..
깜짝 놀라겠지만 713호 문을 두드리고 문을 열면 방대한 서적들이 반겨줄 것이다. :)




2014년 3월 17일 월요일

[Android][IntelliJ] Google Maps v2 지도 화면에 띄우기 (Google Maps Android API v2)




한번 해보고 나면 쉽지만 성공하기 전까지 고생좀 해서 여기에 정리를..

기본적인 방법은 아래의 링크에 있다.
https://developers.google.com/maps/documentation/android/start#installing_the_google_maps_android_v2_api




작업환경








1. SDK Manager 에서 Google Play services 를 설치







2. 다운로드 받은 Google Play services 를 Library Project 로 등록한다.




다음 경로를 선택
<Android_SDK>/extras/google/google_play_services






다른건 필요없고 google-play-services 관련된 것만 선택











3. Google Maps 테스트 프로젝트 생성















4. Library 프로젝트를 테스트 프로젝트의 Dependencies에 등록


















5. Google Maps API v2 의 apikey를 생성하기

다음의 링크를 참조






6. 테스트 프로젝트에 Google Maps 적용하기

AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.example.test.google.maps"
          android:versionCode="1"
          android:versionName="1.0">

    <uses-sdk android:minSdkVersion="10"/>

    <!-- 아래의 4개는 필수 권한 -->
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/>
    <!-- 아래의 2개는 필수는 아니지만 권장 권한 -->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>


    <application
        android:label="@string/app_name"
        android:icon="@drawable/ic_launcher">
        <activity
            android:name="MyActivity"
            android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>

        <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="AIzaSyDEUmVSU2QYHJuD35ktwFT8tztDcgXxsQw"/>
    </application>

    <uses-feature
        android:glEsVersion="0x00020000"
        android:required="true"/>

</manifest>






MyActivity.java
package com.example.test.google.maps;

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

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






main.xml
<?xml version="1.0" encoding="utf-8"?>
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
          android:id="@+id/map"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          android:name="com.google.android.gms.maps.MapFragment"/>






위와같이 셋팅 후 단말기에 프로그램을 올리면 다음과 같이 화면이 나온다.







PS.
화면이 하얗게만 나오는경우 다음 링크를 참조.

[Android] Google Maps v2 에서 Map이 하얀 화면만 나오는 경우




2014년 3월 14일 금요일

[Android] Google Maps v2 에서 Map이 하얀 화면만 나오는 경우




Google Maps v2 를 띄우려 하는데 별다른 에러는 없는거 같은데
Map 화면이 그냥 하얗게만 나온다.


이렇게..





이것저것 찾다보니 로그를 잘 보라는 얘기가..;;



역시 로그에 있었다.
다음과 같은 로그를 찾을 수 있었다.


E/Google Maps Android API(10578): Authorization failure.  Please see https://developers.google.com/maps/documentation/android/start for how to correctly set up the map.
E/Google Maps Android API(10578): Ensure that the following correspond to what is in the API Console: Package Name: com.example.test.google.maps, API Key: AIzaSyDEUmVSU2QYHJuD35ktwFT8tztDcgXxsQw, Certificate Fingerprint: 8C67530F311A6100E7BF18E1D7595226F0B346B1
I/Google Maps Android API(10578): Failed to contact Google servers. Another attempt will be made when connectivity is established.
E/Google Maps Android API(10578): Failed to load map. Error contacting Google servers. This is probably an authentication issue (but could be due to network errors).




결국엔 API key가 잘못되었단 말인데..
하긴.. 잘 안되서 프로젝트 다시 만들어 보고 했었으니 패키지명이 달라져서 키가 맞을 수 없었지..
https://code.google.com/apis/console/?noredirect#access
여기서 패키지명을 다시 수정해서 해보니 잘 나왔었다.






2014년 3월 13일 목요일

[Ubuntu] 썬더버드(Thunderbird)에서 Exchange Mail 사용하기




회사 사내 메일로 Exchange를 사용하고 있다.

평소 OSX의 MS Office를 이용해서 메일을 사용하기에 그럭저럭 사용했는데
프로젝트에 투입이 되며 Ubuntu를 작업 PC로 사용하다보니 방법이 달라 이렇게 포스팅..



1. 도구 - 부가기능 선택

2. exchange 검색

3. 'ExQuilla for Microsoft Exchange' 설치


4. Thunderbird 다시시작

5. 도구 - ExQuilla for Microsoft Exchange - add Microsoft Exchange Account 클릭

6. 메일주소 암호 입력


7. Manual 선택 - EWS URL 입력 - 다음 - 완료료

  EWS URL: https://[YOUR_MAIL_SERVER_DOMAIN]/EWS/Exchange.asmx





2014년 3월 10일 월요일

[Android] Google Maps API v2 - apiKey 생성하기




책에 나온 예재대로 해보니 apiKey 를 발급 받을 수 없어서 이것저것 알아보다 정리하는글..
실습은 맥(OSX) 에서 했다.




1. 인증서 지문 생성

1. java path 가 정상적으로 잡혀있는지 확인해본다.
커맨드에서 'keytool' 입력 시 다음과 같은 화면이 나오는지 확인한다.
(아래와 같이 나오면 2단계로 건너도 좋다.)


만일 위와 같이 나오지 않지만
'java'는 실행이 된다면 다음과 같이 java가 설치되어있는 곳을 확인 후 이동한다.

위의 방법도 안되어 있다면 자바가 설치되어 있지 않거나 java자체도 심볼릭이 걸려있지 않은경우다.
차라리 java를 다시 설치하는게 빠르겠다.



2. 인증서 지문을 생성.
다음과 같은 명령으로 지문을 생성한다.
'keytool -list -keystore ~/.android/debug.keystore -v'

위에서 path가 설정되지 않아서 java가 설치되어 있는 곳으로 이동한경우에는
다음과 같이 입력한다.
'./keytool -list -keystore ~/.android/debug.keystore -v'


다음과 같이 나오면 성공 (인증서 지문의 SHA1 부분을 복사해 둔다.)









2. Google Maps API v2 에 API 활성화 및 지문등록
방법은 여기에 잘 나와있다. (영어로..)
https://developers.google.com/maps/documentation/android/?csw=1


내용을 보자면 다음과 같다.


1. Google APIs Console 에서 API Project 를 생성 및 서비스 활성화

다음 사이트로 접속 후 Create project 를 클릭한다.
https://code.google.com/apis/console/



보여지는 서비스중에서 'Google Maps Android API v2' 를 찾아서 On 으로 변경한다.





이제 다음 링크로 들어간 후 왼쪽 네비게이션의 'API Access' 를 클릭한다.
https://code.google.com/apis/console/?noredirect



그 다음 'Create New Android Key...' 버튼을 클릭한다.




팝업창에 아까 복사해둔 SHA1 지문을 입력 후 뒤에 세미콜론(;)과 사용할 앱의 패키지 명을 입력 후 'Create' 버튼을 누른다.


PS. 패키지명은 자신이 만든 안드로이드앱의 AndroidManifest.xml 파일에 있다.



다음과 같이 API key가 생성이 되었다.