마스터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일 답변
댓글 정말 감사합니다. ^^
...