마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

[초보]경도 위도 질문입니다.

0 추천
 E/SensorManager(9503): thread start
 E/SensorManager(9503): =======>>> Sensor Thread Running <<<========
 D/memalloc(9503): ion: 
Mapped buffer base:0x53812000 size:4096000 offset:0 fd:71
 D/memalloc(9503): ion: 
Mapped buffer base:0x542ca000 size:4096000 offset:0 fd:77
 W/IInputConnectionWrapper(9503): 
getSelectedText on inactive InputConnection
 D/memalloc(9503): ion: Unmapping buffer  base:0x53ee2000 size:4096000
 D/memalloc(9503): ion: Unmapping buffer  base:0x53812000 size:4096000
 W/IInputConnectionWrapper(9503): setComposingText on inactive InputConnection
 W/dalvikvm(9503): 
threadid=1: thread exiting with uncaught exception (group=0x40c1b1f8)
 E/AndroidRuntime(9503): FATAL EXCEPTION: main
 E/AndroidRuntime(9503): java.lang.NullPointerException
 E/AndroidRuntime(9503):
at com.example.nam.run.onSensorChanged(run.java:133)
 E/AndroidRuntime(9503): 
at android.hardware.SensorManager$ListenerDelegate$1.handleMessage(SensorManager.java:635)
E/AndroidRuntime(9503):
at android.os.Handler.dispatchMessage(Handler.java:99)
 E/AndroidRuntime(9503):at android.os.Looper.loop(Looper.java:137)
 E/AndroidRuntime(9503): 
at android.app.ActivityThread.main(ActivityThread.java:4512)
 E/AndroidRuntime(9503): 
at java.lang.reflect.Method.invokeNative(Native Method)
 E/AndroidRuntime(9503): 
at java.lang.reflect.Method.invoke(Method.java:511)
 E/AndroidRuntime(9503): 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:794)
 E/AndroidRuntime(9503): 	
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:561)
 E/AndroidRuntime(9503): 	
at dalvik.system.NativeStart.main(Native Method)


public void onSensorChanged(SensorEvent event) {
		if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
			long currentTime = System.currentTimeMillis();
			long gabOfTime = (currentTime - lastTime);
			if (gabOfTime > 1) {
				lastTime = currentTime;
				x = event.values[SensorManager.DATA_X];
				y = event.values[SensorManager.DATA_Y];
				z = event.values[SensorManager.DATA_Z];
	speeds = Math.abs(x + y + z - lastX - lastY - lastZ) / gabOfTime
						* 1;
				if (speeds > SHAKE_THRESHOLD) {
					// 이벤트 발생!!
					
					
LocationManager locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);

	Criteria criteria = new Criteria();
	criteria.setAccuracy(Criteria.ACCURACY_COARSE);// 정확도
	criteria.setPowerRequirement(Criteria.POWER_LOW); // 전원 소비량
	criteria.setAltitudeRequired(true); // 고도 사용여부
	criteria.setBearingRequired(true); //
	criteria.setSpeedRequired(true); // 속도
	criteria.setCostAllowed(true); // 금전적비용

String provider = locationManager.getBestProvider(criteria,true);
Location location = locationManager.getLastKnownLocation(provider);
double latitude = location.getLatitude(); // 위도
double longitude = location.getLongitude(); // 경도
			
	Geocoder gcK = new Geocoder(getApplicationContext(),Locale.KOREA);
	if (startTime == -1) {startTime = location.getTime();
	}// 현재 위치 거리 및 속도 구하기.
	  float distance[] = new float[1];
  Location.distanceBetween(beforeLocation.getLatitude(), beforeLocation.getLongitude(),
location.getLatitude(), location.getLongitude(), distance);
long delay = location.getTime() - startTime;
	double speed = distance[0]/delay;
	double speedKMH = speed * 3600;
		// 전 위치 저장.
		beforeLocation = location;
				
	if(speedKMH > 1) {
         try {
List<Address> addresses = gcK.getFromLocation(latitude,longitude, 1);
			StringBuilder sb = new StringBuilder();
			if (addresses.size() > 0) {
			for (Address addr : addresses) {
			sb.append(addr.getMaxAddressLineIndex()					.insert(0, "-살려주세요-\n");
		for (int i = 0; i < addr.getMaxAddressLineIndex(); i++)
		sb.append(addr.getAddressLine(i)).append("<< \n\n");
		}
	Address address = addresses.get(0);
	sb.delete(7, 8);
	sb.append(address.getCountryName()).append(" ");
	//sb.append(address.getPostalCode()).append(" ");
	sb.append("경상북도").append(" "); // 가라코드
	sb.append(address.getLocality()).append(" ");
	sb.append(address.getThoroughfare()).append(" ");
	sb.append(address.getFeatureName()).append("\n");

	// sb.append(tStr).append("\n");
	// sb.append(tStrLocal).append("\n");

	Toast.makeText(getBaseContext(), sb.toString(),
	Toast.LENGTH_SHORT).show();
	SmsManager sms = SmsManager.getDefault();
	sms.sendTextMessage(text, null, sb.toString()
+ "에서 사고발생. 구조를 요청합니다. ", null, null);
setContentView(R.layout.not_safe);
// finish();
	}
}

위 노란 글씨 부분에 경위도 갑을 못 받아서 

실행시 계속 오류가 납니다; 다른 해결책 없을 까요?? 

구글링해서 개발자분들의 블로그 글도 참고하고 몇일째 수정해보지만 

생초보라 그런지 막막합니다. 

어떻게 코드를 적어넣어야 하나요?? 도와주세요.

AErun (200 포인트) 님이 2014년 6월 14일 질문

2개의 답변

0 추천
onLocationChanged에서 위도 경도값을 받아와보세요
안티푸라면 (6,700 포인트) 님이 2014년 6월 15일 답변
댓글 감사합니다^^;
하지만 제가 초보라서;; 어떻게 코드를 입력해야 할지 감지 안잡히내요;;
몇가지 추측한 것으로 넣어 보긴 했는대 오류 투성이내요 ㅠㅠ.
괜찮으시면 약간의 예를 적어주실래요?
제가 너무 초보라서 한 줄로는 어떻게 입력해야 하는지 혼란스럽내요 ㅠㅠ
0 추천

onSensorChanged 는 생각보다 상당히 빈번히 불려집니다.(셋팅값에 따라 다르긴하지만)

그래서

locationManager, criteria, provider 이런것은 액티비티 시작할때 셋팅해놓으시고

위/경도 값은 onLocationChanged에서 주기적으로 변경되게한다음

speeds > SHAKE_THRESHOLD 일때 주소를 가져오되 가져올때에는 스레드를 사용하는것을 추천합니다.

nicehee (73,100 포인트) 님이 2014년 6월 15일 답변
조언 감사합니다.
안티푸라면님의 글 보고 몇가지 시도 중이었는대
대략적인 코드 틀을 생각 할수 있게 되었습니다^^만;;
역시 쉽지 않군요.ㄷㄷ;
혹시 괜찮으시면 예를 조금 적어주시면 안될까요?
제가 생각한 코드와 의도 하신 코드가 약간 다른 거 같아서요.
...