Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android:在后台运行应用程序的问题_Java_Android_Service - Fatal编程技术网

Java Android:在后台运行应用程序的问题

Java Android:在后台运行应用程序的问题,java,android,service,Java,Android,Service,我试图让我的GPS在后台运行,这样它可以在我做其他事情时为我提供关于我在哪里的新信息 但每次我运行应用程序时,它都会崩溃。错误要求我使用Looper.prepare(),但我如何使用GPS来实现这一点 public class LocationLoggerService extends Service implements LocationListener { Location location; String towers; static final int uniqueID = 1394

我试图让我的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" />
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)

我在logcat中得到此错误,如下所示:

<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" />
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)
致命异常:线程819
java.lang.RuntimeException:无法在未调用Looper.prepare()的线程内创建处理程序
android.os.Handler.(Handler.java:121)
在android.location.LocationManager$ListenerTransport$1。(LocationManager.java:209)
在android.location.LocationManager$ListenerTransport。(LocationManager.java:209)
在android.location.LocationManager.\u请求LocationUpdate(LocationManager.java:687)
位于android.location.LocationManager.RequestLocationUpdate(LocationManager.java:512)
在com.example.rememberforme.LocationLoggerService.startGps(LocationLoggerService.java:81)
在com.example.rememberforme.LocationLoggerService$1.run(LocationLoggerService.java:38)
运行(Thread.java:856)

我发现您缺少服务的onCommandStart方法

@Override
public int onStartCommand(Intent intent, int flags, int startId)
{
    //this service will run until we stop it

    return START_STICKY;
}
您是否在清单文件中添加了所需的所有权限? 我不确定您需要哪一个,但其中一个或多个就可以了:

<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"/>


LogCat中的错误是什么?LogCat与您的应用程序无关-请附上适当的LogCat,其中显示您的应用程序正在运行!FWIW,这甚至不是一个错误-这是来自本地二进制NDK编译的GPS处理程序…OP:请重新编辑您的问题,不要在这些评论中放入1行日志。。。确保包含尽可能多的行,以便我们可以推断错误在哪里!我刚刚更新了我的问题@T0MM13b问题是在
startGPS
中调用
Toast
的线程是导致崩溃的原因。您需要实现一种机制,例如
runOnUiThread
,它将
Runnable
作为参数,在这种机制中,UI可以在自己的线程中制作Toast,或者实现一个处理程序(从UI线程创建)然后从线程
startGps
中将消息传递给处理程序,弹出
Toast
通知。我刚刚更新了代码。但我遇到了一个新问题。Looper.prepare()