GPSをバックグラウンドで実行しようとしているので、何か他のことをしているときに自分がどこにいるかについての新しい情報を得ることができます。
しかし、アプリケーションを実行するたびにクラッシュします。エラーで使用したいのです Looper.prepare()
が、GPSでそれを行うにはどうすればよいですか?
public class LocationLoggerService extends Service implements LocationListener {
Location location;
String towers;
static final int uniqueID = 1394885;
Thread runner;
boolean keepRunning;
public LocationManager locationManager;
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
keepRunning = true;
runner = new Thread(null, new Runnable() {
public void run() {
startGps();
}
});
runner.start();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// this service will run until we stop it
return START_STICKY;
}
@Override
public void onLocationChanged(Location location) {
location = locationManager.getLastKnownLocation(towers);
String hey1 = Double.toString(location.getLatitude());
String hey2 = Double.toString(location.getLongitude());
Toast.makeText(this,
"TEST onLocationChanged:" + "Lat: " + hey1 + "Long: " + hey2,
Toast.LENGTH_LONG).show();
}
@Override
public void onProviderEnabled(String s) {
}
@Override
public void onProviderDisabled(String s) {
}
@Override
public void onStatusChanged(String s, int i, Bundle b) {
}
@Override
public void onDestroy() {
super.onDestroy();
Toast.makeText(this, "MyAlarmService.onDestroy()", Toast.LENGTH_LONG)
.show();
}
public void startGps() {
locationManager = (LocationManager) this
.getSystemService(Context.LOCATION_SERVICE);
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
2000, 0, this);
location = locationManager.getLastKnownLocation(towers);
String hey1 = Double.toString(location.getLatitude());
String hey2 = Double.toString(location.getLongitude());
Toast.makeText(this, "StartGPS: Lat: " + hey1 + "Long: " + hey2,
Toast.LENGTH_LONG).show();
}
}
私のマニフェストには、以下に示すように次の権限があります。
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_GPS" />
<service
android:name="LocationLoggerService"
android:enabled="true"
android:exported="false"
android:label="LocationLoggerService" />
以下に示すように、logcatでこのエラーが発生します。
FATAL EXCEPTION: Thread-819
java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
at android.os.Handler.<init>(Handler.java:121)
at android.location.LocationManager$ListenerTransport$1.<init>(LocationManager.java:209)
at android.location.LocationManager$ListenerTransport.<init>(LocationManager.java:209)
at android.location.LocationManager._requestLocationUpdates(LocationManager.java:687)
at android.location.LocationManager.requestLocationUpdates(LocationManager.java:512)
at com.example.rememberforme.LocationLoggerService.startGps(LocationLoggerService.java:81)
at com.example.rememberforme.LocationLoggerService$1.run(LocationLoggerService.java:38)
at java.lang.Thread.run(Thread.java:856)