问题描述
我正在尝试构建一个应用程序,以提供围绕固定标记航行的导航。它将有一个仪表板,提供速度,航向,指向下一个标记的值,并允许从列表中选择下一个标记。我有一个工作版本,其中所有LocationServices都位于MainActivity中,但是我想将位置代码移到一个单独的类中,并将位置包连续传递回MainActivity进行显示。为了解决这个问题,我从this youtube video重新创建了一个简单的应用,其中包含一些我的小修改。该应用程序成功运行,并在LocationServices类内生成的logcat消息连续产生纬度和经度。如何将这些信息(locationResult)返回给MainActivity,以便提取需要在UI上显示的值?
我已经在该主题上进行了广泛的搜索,并尝试了很多方法,但没有发现任何可以满足我需求的东西。我已经尝试阅读文档,但是找不到关于如何执行我认为应该是常见任务的解释。
一般来说,我是Java和OOP的新手,这是我的第一篇文章,所以请忍着无知。
MainActivity.java
package com.sail.gps_ext3;
import ...
public class MainActivity extends AppCompatActivity {
private static final int REQUEST_CODE_LOCATION_PERMISSION = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
startLocationService();
//...
}
@Override
public void onRequestPermissionsResult(int requestCode,@NonNull String[] permissions,@NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode,permissions,grantResults);
if (requestCode == REQUEST_CODE_LOCATION_PERMISSION && grantResults.length > 0) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
startLocationService();
} else {
Toast.makeText(this,"Permission denied!",Toast.LENGTH_SHORT).show();
}
}
}
private boolean isLocationServiceRunning() {
ActivityManager activityManager =
(ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
if (activityManager != null) {
Log.e("Loc service running","");
for (ActivityManager.RunningServiceInfo service :
activityManager.getRunningServices(Integer.MAX_VALUE)) {
if (LocationService.class.getName().equals(service.service.getClassName())) {
if (service.foreground) {
return true;
}
}
}
return false;
}
return false;
}
private void startLocationService() {
if (!isLocationServiceRunning()) {
Intent intent = new Intent(getApplicationContext(),LocationService.class);
intent.setAction(Constants.ACION_START_LOCATION_SERVICE);
startService(intent);
Toast.makeText(this,"Location service started",Toast.LENGTH_SHORT).show();
}
}
//...
}
LocationService.java
package com.sail.gps_ext3;
import ...
public class LocationService extends Service {
private LocationCallback locationCallback = new LocationCallback() {
@Override
public void onLocationResult(LocationResult locationResult) {
super.onLocationResult(locationResult);
if(locationResult != null && locationResult.getLastLocation() != null) {
double latitude = locationResult.getLastLocation().getLatitude();
double longitude = locationResult.getLastLocation().getLongitude();
Log.d("LOCATION_UPDATE",latitude + "," + longitude);
}
}
};
@Nullable
@Override
public IBinder onBind(Intent intent) {
throw new UnsupportedOperationException("Not yet implemented");
}
private void startLocationService() {
String channelId = "location_notification_channel";
notificationmanager notificationmanager =
(notificationmanager) getSystemService(Context.NOTIFICATION_SERVICE);
Intent resultIntent = new Intent();
PendingIntent pendingIntent = PendingIntent.getActivity(
getApplicationContext(),resultIntent,PendingIntent.FLAG_UPDATE_CURRENT
);
NotificationCompat.Builder builder = new NotificationCompat.Builder(
getApplicationContext(),channelId
);
//...
LocationRequest locationRequest = new LocationRequest();
locationRequest.setInterval(4000);
locationRequest.setFastestInterval(2000);
locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
LocationServices.getFusedLocationProviderClient(this)
.requestLocationUpdates(locationRequest,locationCallback,Looper.getMainLooper());
startForeground(Constants.LOCATION_SERVICE_ID,builder.build());
}
private void stopLocationService() {
LocationServices.getFusedLocationProviderClient(this)
.removeLocationUpdates(locationCallback);
stopForeground(true);
stopSelf();
}
@Override
public int onStartCommand(Intent intent,int flags,int startId) {
if (intent != null) {
String action = intent.getAction();
if (action != null) {
if (action.equals(Constants.ACION_START_LOCATION_SERVICE)) {
startLocationService();
}else if (action.equals(Constants.ACTION_STOP_LOCATION_SERVICE)) {
stopLocationService();
}
}
}
return super.onStartCommand(intent,flags,startId);
}
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)