차근차근/JAVA Script

Bridge를 이용해 js와 안드 연동 + gps 위치정보 받기

예쁜꽃이피었으면 2015. 1. 14. 15:46

http://action713.tistory.com/869 여기서 이어진다.


150114

밑에 소스는 아직 더 다듬어야 하지만 일단 기록

(문제점 :      어플실행 후 첫번째 gps정보만을 보여준다.

다른 gps정도 알 수 없음

gps검색 버튼 2번 눌러야 함)


* 하이브리드앱? 이니까 실행이 되는 앱..(바탕이 되는 앱)에 소스코드를 작성해야 한다.

* function setMessage2(jslatitude) <- 이렇게 안드로이드에서 js로 오는 함수에는 jslatitude처럼 값을 꼭 넣어줘야 한다.

   -> 안 넣으면 안드에서 js함수 못 찾음.


* 안드 브릿지는 핸들러 혹은 스레드로 만들 것


* js 함수 -> 안드 , 안드 -> js 함수 는 따로 만들어야 한다. 


   나처럼 한 함수에 js->안드->js이렇게 하면 무한 재귀호출이 생긴다.ㅜ

   

   (Maximum call stack exceeded 뭐..이런 에러남.)




150115

뺄것만 빼면 될듯. db저장하는 거랑.

* js함수 -> 안드, 안드 -> js함수 따로 만들어야 함. 그렇지 않으면 계속 무한 재귀호출

* 나의 경우 하나의 함수가 실행중인데 끝내기도 전에 다음 함수로 계속 넘어가서 null이 나오곤 했다. 

   순서를 잘 정해야 할 듯

안드로이드 쪽






public class LeafManager extends Activity implements LocationListener{

...........

WebView mWeb;

..........

    private Handler gpshan; //백키 누를시 받는 핸들러

    private double jslatitude;

private double jslongitude;

    private String zxc = null;


    //Location.java 추가중

    LocationManager location = null;

//LocationManager locationManager = null;

private static String  arg;

//Location.java 여기까지

 

    @Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

gpshan = new Handler();

..........

WebSettings setting = mWeb.getSettings();

setting.setJavaScriptEnabled(true);//자바스크립트를 실행할 수 있도록 설정

..........

mWeb.addJavascriptInterface(new AndroidBridge(), "HybridApp");

location = (LocationManager)getSystemService(Context.LOCATION_SERVICE);

..........

 

..........

//Javascript에서 호출될 함수 구현

//AndroidBridge = webview에 등록할 인터페이스 

   private class AndroidBridge{

@SuppressWarnings("unused")

public void MoveMessage(final String arg) { // must be final

gpshan.post(new Runnable() {

public void run() {

Log.d(TAG,"run()");

//원하는 동작

 

alertCheckGPS();

               }

           });

       }//MoveMessage

   }//AndroidBridge


   private void alertCheckGPS() {

    Log.d(TAG,"alertCheckGPS()함수 시작");

            AlertDialog.Builder builder = new AlertDialog.Builder(this);

            builder.setMessage("Your GPS is disabled! Would you like to enable it?")

                    .setCancelable(false)

                    .setPositiveButton("Enable GPS",

                            new DialogInterface.OnClickListener() {

                                public void onClick(DialogInterface dialog, int id) {

                                    moveConfigGPS();

                                    setConfigGPS();

                                }

                        })

                    .setNegativeButton("Do nothing",

                            new DialogInterface.OnClickListener() {

                                public void onClick(DialogInterface dialog, int id) {

                                    dialog.cancel();

                                }

                        });

            

        

            AlertDialog alert = builder.create();

            alert.show();

            Log.d(TAG,"alertCheckGPS()함수 끝");

        }//alertCheckGPS


        // GPS 설정화면으로 이동

        private void moveConfigGPS() {

            Intent gpsOptionsIntent = new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS);

            startActivity(gpsOptionsIntent);

        }

        

        

        private void setConfigGPS() {

    Toast.makeText(this,"Starting..", Toast.LENGTH_SHORT).show();

   

    Criteria criteria = new Criteria();

    criteria.setAccuracy(Criteria.NO_REQUIREMENT); 

    criteria.setPowerRequirement(Criteria.NO_REQUIREMENT);

   

    String provider = location.getBestProvider(criteria, true);

    location.requestLocationUpdates(provider,1000, 0, this);

    }

        

@Override

public void onLocationChanged(Location location) {

// TODO Auto-generated method stub

// requestLocationUpdates 메소드의 두번째와 세번째 인자값에 따라 

   // 지정된 시간의 주기마다 또는 지정된 이동거리마다 호출된다. 하지만 지정된 것과 같이 일정하게 

   // 이벤트가 발생하지는 않고 불규칙하게 발생한다.

double latitude = location.getLatitude();

double longitude = location.getLongitude();

jslatitude = latitude;

jslongitude = longitude;

//js로 보냄

mWeb.loadUrl("javascript:setMessage2('" +jslatitude+ "')");

mWeb.loadUrl("javascript:setMessage3('" +jslongitude+ "')");

mWeb.loadUrl("javascript:setMessageAll('" +jslatitude+ " ',' "+jslongitude+"')");  




//확인용

Toast.makeText(this,latitude+","+longitude,Toast.LENGTH_LONG).show();

//사용 종료 .. 한번에 찾아오는 것보다 요즘엔 갱신하도록 만드는 걸 지향한다고 한다. 하지만..난 필요없으니 멈춤

LocationManager gManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);

      gManager.removeUpdates(this);

 

}


@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

// 사용자에 의해 프로바이더가 비활성화 되었을경우 호출된다

}

}

 


jsp쪽



<script type="text/javascript">

//안드로이드를 호출

function setMessage1(){

alert("setMessage1 시작");

window.HybridApp.MoveMessage("gps 위치정보 호출1");

}

//안드로이드에서 호출

function setMessage2(jslatitude){

alert("jslatitude"+jslatitude);

document.getElementById("replaceme1").innerHTML = jslatitude;

}

function setMessage3(jslongitude){

alert("jslongitude"+jslongitude);

document.getElementById("replaceme2").innerHTML = jslongitude;

}

// 값 두개를 한번에 받고 싶은데 모르겠다.


function setMessageAll(jslatitude,jslongitude){


//안드로이드에서 받아온 값 (위도 , 경도)을 form의 data에 넣는다.

document.form1.jslatitude.value = jslatitude;

document.form1.jslongitude.value = jslongitude;



// cllajax();

}





</script>

<body>

 <form>


 <input type="hidden" name="jslatitude" value="">

 <input type="hidden" name="jslongitude" value="">



  <input type="button" id="test" value="setMessage1"  onclick="setMessage1()">

  <p id="replaceme1"></p>

  <p id="replaceme2"></p>

</form>   

 </body>

</html>



안드로이드 쪽 수정함 (gps정보받기)  

- jsp에서 위치정보 저장할지 묻고 안드로이드 넘어와서 한번더 물어봐서.






public class LeafManager extends Activity implements LocationListener{

...........

WebView mWeb;

..........

    private Handler gpshan; //백키 누를시 받는 핸들러

    private double jslatitude;

private double jslongitude;

    private String zxc = null;


    //Location.java 추가중

    LocationManager location = null;

//LocationManager locationManager = null;

private static String  arg;

//Location.java 여기까지

 

    @Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

gpshan = new Handler();

..........

WebSettings setting = mWeb.getSettings();

setting.setJavaScriptEnabled(true);//자바스크립트를 실행할 수 있도록 설정

..........

mWeb.addJavascriptInterface(new AndroidBridge(), "HybridApp");

location = (LocationManager)getSystemService(Context.LOCATION_SERVICE);

..........

 

..........

//Javascript에서 호출될 함수 구현

//AndroidBridge = webview에 등록할 인터페이스 

    private class AndroidBridge{

@SuppressWarnings("unused")

public void MoveMessage(final String arg) { // must be final

gpshan.post(new Runnable() {

public void run() {

Log.d(TAG,"run()");

//원하는 동작

   moveConfigGPS();

                }

            });

        }//MoveMessage

    }//AndroidBridge


   


        // GPS 설정화면으로 이동

        private void moveConfigGPS() {

            Intent gpsOptionsIntent = new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS);

            startActivity(gpsOptionsIntent);


 setConfigGPS();

        }

        

        

        private void setConfigGPS() {

     Toast.makeText(this,"Starting..", Toast.LENGTH_SHORT).show();

    

     Criteria criteria = new Criteria();

     criteria.setAccuracy(Criteria.NO_REQUIREMENT); 

     criteria.setPowerRequirement(Criteria.NO_REQUIREMENT);

    

     String provider = location.getBestProvider(criteria, true);

     location.requestLocationUpdates(provider,1000, 0, this);

     }

        

@Override

public void onLocationChanged(Location location) {

// TODO Auto-generated method stub

// requestLocationUpdates 메소드의 두번째와 세번째 인자값에 따라 

    // 지정된 시간의 주기마다 또는 지정된 이동거리마다 호출된다. 하지만 지정된 것과 같이 일정하게 

    // 이벤트가 발생하지는 않고 불규칙하게 발생한다.

double latitude = location.getLatitude();

double longitude = location.getLongitude();

 jslatitude = latitude;

 jslongitude = longitude;

 //js로 보냄

 mWeb.loadUrl("javascript:setMessage2('" +jslatitude+ "')");

 mWeb.loadUrl("javascript:setMessage3('" +jslongitude+ "')");

mWeb.loadUrl("javascript:setMessageAll('" +jslatitude+ " ',' "+jslongitude+"')");  




 //확인용

Toast.makeText(this,latitude+","+longitude,Toast.LENGTH_LONG).show();

//사용 종료 .. 한번에 찾아오는 것보다 요즘엔 갱신하도록 만드는 걸 지향한다고 한다. 하지만..난 필요없으니 멈춤

LocationManager gManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);

      gManager.removeUpdates(this);

 

}


@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

// 사용자에 의해 프로바이더가 비활성화 되었을경우 호출된다

}

}

 


반응형

'차근차근 > JAVA Script' 카테고리의 다른 글

함수 순차실행  (0) 2015.01.15
자바스크립트 창띄우기  (0) 2015.01.15
터치 이미지 슬라이드  (0) 2014.12.24
터치 이미지 슬라이드  (0) 2014.12.24
이미지 슬라이더(Images Slider - Responsive Web Design)  (0) 2014.12.24