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 |