Android 服务中的位置管理器
Android Location Manager in Service
我曾尝试创建一个 IntentService,但后来我在 Internet 上了解到我应该改用 Service。我实际上并不知道我在代码上做错了什么。有人可以给我解释一下吗?
我正在尝试创建一个简单的服务来读取纬度和经度,即使应用程序从屏幕上滑开,最后 POST 它们到我的自定义创建 API。 GPSTracker.java
位置管理器上的应用程序似乎崩溃了
GPSTracker.java
package YOU.SOLD.YOUR.SOUL;
import android.annotation.SuppressLint;
import android.app.Service;
import android.content.Intent;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.IBinder;
import androidx.annotation.Nullable;
public class GPSTracker extends Service implements LocationListener {
LocationManager LM;
@SuppressLint("MissingPermission")
@Override
public void onCreate() {
LM.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5000, 1, this);
}
@Override
public void onDestroy() {
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onLocationChanged(Location location) {
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onProviderDisabled(String provider) {
}
}
MainActivity.java
package YOU.SOLD.YOUR.SOUL;
import android.Manifest;
import android.content.Intent;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
public class MainActivity extends AppCompatActivity {
private static final int PERMISSION_1 = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, PERMISSION_1);
Intent intent = new Intent(this, GPSTracker.class);
startService(intent);
}
}
添加到 Manifest 的权限是 COARSE 和 FINE 位置。服务也已添加为 .GPSTracker
java.lang.RuntimeException: Unable to create service YOU.SOLD.YOUR.SOUL.GPSTracker: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.location.LocationManager.requestLocationUpdates(java.lang.String, long, float, android.location.LocationListener)' on a null object reference
和
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.location.LocationManager.requestLocationUpdates(java.lang.String, long, float, android.location.LocationListener)' on a null object reference
为了修复 NullPointerException,只需初始化 LocationManager 引用。
此外,将请求位置更新的逻辑移动到 onStartCommand()
方法覆盖,并 return START_STICKY
以便自动重新启动服务。
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
LocationManager locationManager =
(LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5000, 1, this);
}
return Service.START_STICKY;
}
我曾尝试创建一个 IntentService,但后来我在 Internet 上了解到我应该改用 Service。我实际上并不知道我在代码上做错了什么。有人可以给我解释一下吗?
我正在尝试创建一个简单的服务来读取纬度和经度,即使应用程序从屏幕上滑开,最后 POST 它们到我的自定义创建 API。 GPSTracker.java
位置管理器上的应用程序似乎崩溃了GPSTracker.java
package YOU.SOLD.YOUR.SOUL;
import android.annotation.SuppressLint;
import android.app.Service;
import android.content.Intent;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.IBinder;
import androidx.annotation.Nullable;
public class GPSTracker extends Service implements LocationListener {
LocationManager LM;
@SuppressLint("MissingPermission")
@Override
public void onCreate() {
LM.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5000, 1, this);
}
@Override
public void onDestroy() {
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onLocationChanged(Location location) {
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onProviderDisabled(String provider) {
}
}
MainActivity.java
package YOU.SOLD.YOUR.SOUL;
import android.Manifest;
import android.content.Intent;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
public class MainActivity extends AppCompatActivity {
private static final int PERMISSION_1 = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, PERMISSION_1);
Intent intent = new Intent(this, GPSTracker.class);
startService(intent);
}
}
添加到 Manifest 的权限是 COARSE 和 FINE 位置。服务也已添加为 .GPSTracker
java.lang.RuntimeException: Unable to create service YOU.SOLD.YOUR.SOUL.GPSTracker: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.location.LocationManager.requestLocationUpdates(java.lang.String, long, float, android.location.LocationListener)' on a null object reference
和
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.location.LocationManager.requestLocationUpdates(java.lang.String, long, float, android.location.LocationListener)' on a null object reference
为了修复 NullPointerException,只需初始化 LocationManager 引用。
此外,将请求位置更新的逻辑移动到 onStartCommand()
方法覆盖,并 return START_STICKY
以便自动重新启动服务。
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
LocationManager locationManager =
(LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5000, 1, this);
}
return Service.START_STICKY;
}