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
;
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(
"경상북도"
).append(
" "
);
sb.append(address.getLocality()).append(
" "
);
sb.append(address.getThoroughfare()).append(
" "
);
sb.append(address.getFeatureName()).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);
}
}
catch
(IOException e) {
e.printStackTrace();
}
}
lastX = event.values[DATA_X];
lastY = event.values[DATA_Y];
lastZ = event.values[DATA_Z];
}
}
}
}