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

{생초보 도와주세요}응급 구조어플 졸작으로 제작중 오류로 막혔습니다.

0 추천
05-27 00:53:13.425: D/AndroidRuntime(8728): Shutting down VM
05-27 00:53:13.425: W/dalvikvm(8728): threadid=1: thread exiting with uncaught exception (group=0x4174c2a0)
05-27 00:53:13.425: E/AndroidRuntime(8728): FATAL EXCEPTION: main
05-27 00:53:13.425: E/AndroidRuntime(8728): java.lang.ArrayIndexOutOfBoundsException: length=3; index=3
 	at com.example.nam.run.onSensorChanged(run.java:97)
 	at android.hardware.SystemSensorManager$ListenerDelegate$1.handleMessage(SystemSensorManager.java:250)
 	at android.os.Handler.dispatchMessage(Handler.java:99)
 	at android.os.Looper.loop(Looper.java:137)
 	at android.app.ActivityThread.main(ActivityThread.java:4921)
 	at java.lang.reflect.Method.invokeNative(Native Method)
 	at java.lang.reflect.Method.invoke(Method.java:511)
 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038)
 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805)
	at dalvik.system.NativeStart.main(Native Method)

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

import java.io.IOException;
import java.util.List;
import java.util.Locale;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.location.Address;
import android.location.Criteria;
import android.location.Geocoder;
import android.location.Location;
import android.location.LocationManager;
import android.os.Bundle;
import android.telephony.SmsManager;

import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Toast;

public class run extends Activity implements SensorEventListener {
	private long lastTime;
	private float speed;
	private float lastX;
	private float lastY;
	private float lastZ;
	private float x, y, z;
	private static final int SHAKE_THRESHOLD = 150;// 테스트를 위해 0 하나 뺌
	private static final int DATA_X = SensorManager.AXIS_X;
	private static final int DATA_Y = SensorManager.AXIS_Y;
	private static final int DATA_Z = SensorManager.AXIS_Z;
	private static boolean chek;
	public String text;
	private SensorManager sensorManager;
	private Sensor accelerormeterSensor;

	@SuppressLint("NewApi")
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

	setContentView(R.layout.safe);
	SharedPreferences pref = getSharedPreferences("pref",
				Activity.MODE_PRIVATE);
	EditText edit1 = (EditText) this.findViewById(R.id.text1);
	CheckBox check1 = (CheckBox) findViewById(R.id.CheckBox1);
	text = pref.getString("editText", ""); // 저장된 값 불러오기
		chek = pref.getBoolean("check1", false);
		if (text.isEmpty()) {
	Toast.makeText(getBaseContext(), "전화번호가 등록되어있지않습니다",
					Toast.LENGTH_SHORT).show();
			finish();
		}
		if (!(chek)) {
	Toast.makeText(getBaseContext(), "설정되어있지않습니다", Toast.LENGTH_SHORT)
				.show();
		finish();
		}
	sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
		accelerormeterSensor = sensorManager
			.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);

	}

	@Override
	public void onStart() {
		super.onStart();
		if (accelerormeterSensor != null)
		sensorManager.registerListener(this, accelerormeterSensor,
					SensorManager.SENSOR_DELAY_GAME);
	}

	@Override
	public void onStop() {
		super.onStop();
		if (sensorManager != null)
			sensorManager.unregisterListener(this);
		finish();
	}

	public void onAccuracyChanged(Sensor sensor, int accuracy) {
	}

	public void onSensorChanged(SensorEvent event) {
		if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
			long currentTime = System.currentTimeMillis();
			long gabOfTime = (currentTime - lastTime);
			if (gabOfTime > 100) {
				lastTime = currentTime;
				x = event.values[SensorManager.AXIS_X];
				y = event.values[SensorManager.AXIS_Y];
				z = event.values[SensorManager.AXIS_Z];
	speed = Math.abs(x + y + z - lastX - lastY - lastZ) / gabOfTime
						* 10000;
		if (speed > SHAKE_THRESHOLD) {
				// 이벤트 발생!!
			LocationManager locationManager;
			String context = Context.LOCATION_SERVICE;
	locationManager = (LocationManager) getSystemService(context);

	Criteria criteria = new Criteria();
	criteria.setAccuracy(Criteria.ACCURACY_COARSE);// 정확도
	criteria.setPowerRequirement(Criteria.POWER_LOW); // 전원 소비량
	criteria.setAltitudeRequired(false); // 고도 사용여부
	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);
					
			float Bearing   = location.getBearing();
			float Speed     = location.getSpeed();
				}
				
			else if(speed < 100) {
						
	LocationManager locationManager;
	String context = Context.LOCATION_SERVICE;
	locationManager = (LocationManager) getSystemService(context);

	Criteria criteria = new Criteria();
	criteria.setAccuracy(Criteria.ACCURACY_COARSE);// 정확도
	criteria.setPowerRequirement(Criteria.POWER_LOW); // 전원 소비량
	criteria.setAltitudeRequired(false); // 고도 사용여부
	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);
						
			float Bearing   = location.getBearing();
			float Speed     = location.getSpeed();
						
					
					
			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();
						}
					}

					
		catch (IOException e) {
				// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}

				lastX = event.values[DATA_X];

				lastY = event.values[DATA_Y];

				lastZ = event.values[DATA_Z];

			}
		}
	}
}
교통 사고시 흔들림과 속도 변화를 잡아서 
 
자동으로 구조 메세지 보내는 어플을 제작중인 생 초보 입니다. 졸업 작품으로 내려고 준비중인대요.
 
저기 저기 블로그 글 읽어가며 만들어 보았는대 
 
안드로이드 런타임 오류 뜨면서 어플 구동 이후 실행 버튼만 누르면 꺼지내요 ㅠㅠ
 
도와주세요!
AErun (200 포인트) 님이 2014년 5월 27일 질문

2개의 답변

0 추천

E/AndroidRuntime(8728): java.lang.ArrayIndexOutOfBoundsException

배열 값의 인덱스범위가 초과 되었다고 하네요

보통은 로그캣에 글쓴님이 작성하신 문제지점의 .java 와 라인까지 표시해주는데 'ㅅ'

한번 확인해보세요

초보개발자ㅠ (33,870 포인트) 님이 2014년 5월 27일 답변
z = event.values[SensorManager.AXIS_Z]; 지우니까 동작하내요.
정말 감사합니다 ^^.

ㅠㅠ
이제는 List<Address> addresses = gcK.getFromLocation(latitude,
                                longitude, 1);
에서 시스템 에러가 떠버립니다.ㅠㅠ
at com.example.nam.run.onSensorChanged(run.java:160)
검색해도 안나오내요. 조금만 더 도와주시면 안될까요?
at com.example.nam.run.onSensorChanged(run.java:160) 말고
글쓴님이 작성하신 함수와 라인을 표시해줄텐데요~
에러 발생 근처 로그캣을 전부 올려주시면 도움이 될것 같아요

List<Address> addresses = gcK.getFromLocation(latitude, longitude, 1);
여기서 에러나는게 맞다면
먼저 사용한 함수의 인자값이 유효한지 확인해봐야지용

정상적이지 않다면 아래의 location 이 문제인거고
double latitude = location.getLatitude(); // 위도
double longitude = location.getLongitude(); // 경도

위의 위도 경도값 또한 정상적이지 않다면 location 이 문제인거니
아래를 확인해보시구요
Location location = locationManager.getLastKnownLocation(provider);
05-27 20:11:14.725: W/System.err(9646):     at android.os.Handler.dispatchMessage(Handler.java:99)
05-27 20:11:14.725: W/System.err(9646):     at android.os.Looper.loop(Looper.java:137)
05-27 20:11:14.725: W/System.err(9646):     at android.app.ActivityThread.main(ActivityThread.java:4921)
05-27 20:11:14.725: W/System.err(9646):     at java.lang.reflect.Method.invokeNative(Native Method)
05-27 20:11:14.725: W/System.err(9646):     at java.lang.reflect.Method.invoke(Method.java:511)
05-27 20:11:14.725: W/System.err(9646):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038)
05-27 20:11:14.725: W/System.err(9646):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805)
05-27 20:11:14.725: W/System.err(9646):     at dalvik.system.NativeStart.main(Native Method)
05-27 20:11:14.835: W/System.err(9646): java.io.IOException: Service not Available
05-27 20:11:14.835: W/System.err(9646):     at android.location.Geocoder.getFromLocation(Geocoder.java:136)
05-27 20:11:14.835: W/System.err(9646):     at com.example.nam.run.onSensorChanged(run.java:160)
05-27 20:11:14.835: W/System.err(9646):     at android.hardware.SystemSensorManager$ListenerDelegate$1.handleMessage(SystemSensorManager.java:250)
05-27 20:11:14.835: W/System.err(9646):     at android.os.Handler.dispatchMessage(Handler.java:99)
05-27 20:11:14.835: W/System.err(9646):     at android.os.Looper.loop(Looper.java:137)
05-27 20:11:14.835: W/System.err(9646):     at android.app.ActivityThread.main(ActivityThread.java:4921)
05-27 20:11:14.835: W/System.err(9646):     at java.lang.reflect.Method.invokeNative(Native Method)
05-27 20:11:14.835: W/System.err(9646):     at java.lang.reflect.Method.invoke(Method.java:511)
05-27 20:11:14.835: W/System.err(9646):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038)
05-27 20:11:14.835: W/System.err(9646):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805)
05-27 20:11:14.835: W/System.err(9646):     at dalvik.system.NativeStart.main(Native Method)
05-27 20:11:14.900: E/SpannableStringBuilder(9646): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
05-27 20:11:14.900: E/SpannableStringBuilder(9646): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
답글이 늦어서 죄송합니다. (졸작에 개인 사정까지 겹치니 늦었어요;;)
위 코드로 실행시 나타나는 로그켓입니다.
매번 도와주셔서 정말 감사합니다.^^
http://blog.naver.com/kadiro?Redirect=Log&logNo=10184211949

글쓴님과 같은 상황인 것 같네요, 참고하세요
매번 감사합니다 ^^
보고 응용해봐야 할것 같내요.
ㄷㄷ; 안에 읽어보고 어떻게 응용해야 하나 고민 중입니다;;
0 추천
아래부분이 문제인것 같습니다. 
 
event.values 부분의 x, y, z값은 0,1,2의 값을 사용해야 하는데,  AXIS_X,Y,Z 값은 1,2,3입니다. 
때문에 해당 값을 구하기 위해서는 AXIS_X... 을 사용하지 마시고, 0, 1, 2직접 사용하시면 해결 될것 같습니다. 
 
x = event.values[SensorManager.AXIS_X];
y = event.values[SensorManager.AXIS_Y];
z = event.values[SensorManager.AXIS_Z];
 
=============================================================
 
 
private static final int DATA_X = SensorManager.AXIS_X;
private static final int DATA_Y = SensorManager.AXIS_Y;
private static final int DATA_Z = SensorManager.AXIS_Z;
 
lastX = event.values[DATA_X];
lastY = event.values[DATA_Y];
lastZ = event.values[DATA_Z];
단짝 (4,980 포인트) 님이 2014년 5월 27일 답변
댓글 정말 감사합니다. ^^
...