gpt4 book ai didi

java - 退出 MapView 后,GPS 位置始终在通知托盘中保持 Activity 状态

转载 作者:行者123 更新时间:2023-12-02 02:51:56 25 4
gpt4 key购买 nike

原始标题:

"Location set by GPS" still remains active after LocationServices.FusedLocationApi.removeLocationUpdates()


编辑后的标题:

GPS Location always remains active in notification tray after exit MapView

我想退出 map Activity 后立即禁止删除“GPS 设置的位置”和顶部通知托盘中的位置图标,但事实并非如此。

我在 stackoverflow 中使用某人的代码,该代码仅使用以下变量:

GoogleMap mGoogleMap;
MapView mapView;
LocationRequest mLocationRequest;
GoogleApiClient mGoogleApiClient;
Location mLastLocation;
Marker mCurrLocationMarker;
MapLocationListener mapLocationListener;

我尝试过的:

@Override
public void onPause() {
super.onPause();
//stop location updates when Activity is no longer active
if (mGoogleApiClient != null) {
LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, mapLocationListener);
if(mGoogleApiClient != null){
mGoogleApiClient = null;
}
if(mapView != null){
mapView = null;
}
if(mGoogleMap != null){
mGoogleMap = null;
}
if(mLocationRequest != null){
mLocationRequest = null;
}
if(mLastLocation != null){
mLastLocation = null;
}
if(mCurrLocationMarker != null){
mCurrLocationMarker = null;
}
if(mapLocationListener != null){
mapLocationListener = null;
}
}
activity.finish();
}

我知道为我的引用分配 null 不应该是解决方案,因为定位进程在系统后台运行而不使用我的应用程序引用。
并且,位置监听器是 no更新时间更长,但它只是没有像其他应用程序那样禁用顶部的位置图标。
我想要的:
退出 map 后立即禁用“GPS 设置的位置”和顶部通知托盘中的位置图标 Activity 。我不想让我的用户认为我正在进行“位置黑客”

我发现的内容:
我发现的所有解决方案都在使用LocationManager.removeUpdate 我没有它。我如何在我的 Activity 中声明它?这真的能解决我的问题吗?

编辑:附加代码:
使用 Daniel Nugent的回答...

import android.content.Context;
import android.content.Intent;
import android.location.Location;
import android.location.LocationManager;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.KeyEvent;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;

import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationServices;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.MapView;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;

import static android.Manifest.permission.ACCESS_FINE_LOCATION;
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
import static android.location.LocationManager.GPS_PROVIDER;
import static android.location.LocationManager.NETWORK_PROVIDER;

/**
* Created by elliotching on 11-Apr-17.
*/

public class ActivityMaps_ extends MyCustomActivity {

GoogleMap mGoogleMap;
MapView mapView;
LocationRequest mLocationRequest;
GoogleApiClient mGoogleApiClient;
Location mLastLocation;
Marker mCurrLocationMarker;
MapLocationListener mapLocationListener;
LocationManager locManager;

Button buttonSaveLocation;

double[] markerLocation;

private final static int mapZoomLevel = 18;

Context context = this;
AppCompatActivity activity = (AppCompatActivity) context;

private class GoogleApiClientConnection implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener {

@Override
public void onConnected(Bundle bundle) {

Log.d("onConnected", "onConnected.");
mLocationRequest = new LocationRequest();
mLocationRequest.setInterval(1000);
mLocationRequest.setFastestInterval(50);
mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
if (ContextCompat.checkSelfPermission(context,
ACCESS_FINE_LOCATION)
== PERMISSION_GRANTED) {
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, mapLocationListener);
}

}

@Override
public void onConnectionSuspended(int i) {
}

@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
}
}

private class MapLocationListener implements com.google.android.gms.location.LocationListener {
@Override
public void onLocationChanged(Location location) {
// DO MY LOCATION UPDATE...
}
}

private class OnMapReady implements OnMapReadyCallback {

@Override
public void onMapReady(GoogleMap googleMap) {
Log.d("onMapReady", "onMapReady.");
mGoogleMap = googleMap;
mGoogleMap.setOnMapClickListener(new OnMapTouched());

//if device OS SDK >= 23 (Marshmallow)
if (Build.VERSION.SDK_INT >= 23) {
//IF Location Permission already granted
if (ContextCompat.checkSelfPermission(context, ACCESS_FINE_LOCATION) == PERMISSION_GRANTED) {

buildGoogleApiClient();
mGoogleMap.setMyLocationEnabled(true);

} else {

// Request Location Permission
checkLocationPermission();

}
}

//if device OS is version 5 Lollipop and below ( <= SDK_22 )
else {

if (checkLocationPermission_v22()) {

buildGoogleApiClient();
mGoogleMap.setMyLocationEnabled(true);

} else {

// AlertDialog TO EXIT MAP...

}
}
}
}

private class OnMapTouched implements GoogleMap.OnMapClickListener {

@Override
public void onMapClick(LatLng latLng) {
// CHANGE MY MARKER...
}
}

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

// createMyView = setContentView(...)
createMyView(R.layout.activity_maps, R.id.toolbar);

mapLocationListener = new MapLocationListener();

buttonSaveLocation = (Button) findViewById(R.id.button_save_location);
buttonSaveLocation.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
saveLocation();
}
});


mapView = (MapView) findViewById(R.id.mapView);
mapView.onCreate(savedInstanceState);

mapView.getMapAsync(new OnMapReady());

mapView.onResume();


}

private void saveLocation() {
Intent i = new Intent();
i.putExtra("savedlocation", markerLocation);
setResult(RESULT_OK, i);
this.onPause();
}

@Override
public void onPause() {
super.onPause();

if (mGoogleApiClient != null && mapLocationListener != null) {
Log.d("FusedLocationApi", "run!");
LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, mapLocationListener);
}

activity.finish();
}

protected synchronized void buildGoogleApiClient() {

Log.d("buildGoogleApiClient", "buildGoogleApiClient.");
GoogleApiClientConnection g = new GoogleApiClientConnection();
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addConnectionCallbacks(g)
.addOnConnectionFailedListener(g)
.addApi(LocationServices.API)
.build();
mGoogleApiClient.connect();

}

private boolean checkLocationPermission_v22() {
locManager = (LocationManager) context.getSystemService(LOCATION_SERVICE);
if (locManager.isProviderEnabled(GPS_PROVIDER) ||
locManager.isProviderEnabled(NETWORK_PROVIDER)) {
return true;
} else {
return false;
}
}

public static final int FR_PERMISSIONS_REQUEST_CODE_LOCATION = 99;

private void checkLocationPermission() {
if (ContextCompat.checkSelfPermission(context, ACCESS_FINE_LOCATION) != PERMISSION_GRANTED) {

ActivityCompat.requestPermissions(activity, new String[]{ACCESS_FINE_LOCATION}, FR_PERMISSIONS_REQUEST_CODE_LOCATION);

}
}

@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {

switch (requestCode) {
case FR_PERMISSIONS_REQUEST_CODE_LOCATION: {

if (grantResults.length > 0 && grantResults[0] == PERMISSION_GRANTED) {

if (ContextCompat.checkSelfPermission(this, ACCESS_FINE_LOCATION) == PERMISSION_GRANTED) {

if (mGoogleApiClient == null) {
buildGoogleApiClient();
}
mGoogleMap.setMyLocationEnabled(true);
}

} else {

// AlertDialog to EXIT MAP...

}
return;
}
}
}

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (Build.VERSION.SDK_INT > 5
&& keyCode == KeyEvent.KEYCODE_BACK
&& event.getRepeatCount() == 0) {

this.onPause();
return true;
}
return super.onKeyDown(keyCode, event);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == android.R.id.home) {
this.onPause();
return true;
}
return super.onOptionsItemSelected(item);
}

}

最佳答案

使用此类进行位置跟踪。

public class FusedLocationTracker implements LocationListener, GoogleApiClient.OnConnectionFailedListener, GoogleApiClient.ConnectionCallbacks {
Context context;

protected GoogleApiClient mGoogleApiClient;
GoogleMap googleMap;
LocationRequest mLocationRequest;
Location mCurrentLocation = null;
private static final long INTERVAL = 1000 * 5;
private static final long FASTEST_INTERVAL = 1000 * 1;
String TAG = "LocationTracker";
boolean isGPSEnabled, wifiStatus;
WifiManager wifiManager;
FusedLocationDataInterface fusedLocationDataInterface;

public FusedLocationTracker(Context context){
this.context = context;
wifiManager = (WifiManager)this.context.getSystemService(Context.WIFI_SERVICE);
wifiStatus = wifiManager.isWifiEnabled();
if (!wifiStatus){
wifiManager.setWifiEnabled(true);
wifiManager.startScan();
}
createLocationRequest();
buildGoogleApiClient();
}

public void createLocationRequest() {
mLocationRequest = new LocationRequest();
mLocationRequest.setInterval(INTERVAL);
mLocationRequest.setFastestInterval(FASTEST_INTERVAL);
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);

Log.d(TAG, "createLocationRequest");
}

protected synchronized void buildGoogleApiClient() {
Log.d(TAG, "buildGoogleApiClient");
mGoogleApiClient = new GoogleApiClient.Builder(context)
.addApi(LocationServices.API)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.build();

mGoogleApiClient.connect();
}

@Override
public void onConnected(@Nullable Bundle bundle) {
Log.d(TAG, "onConnected");
startLocationUpdates();
}

public void startLocationUpdates() {
Log.d(TAG, "startLocationUpdates");
if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION)!= PackageManager.PERMISSION_GRANTED
&& ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return;
}
PendingResult<Status> pendingResult = LocationServices.FusedLocationApi.requestLocationUpdates(
mGoogleApiClient, mLocationRequest, this);
}

@Override
public void onConnectionSuspended(int i) {
Log.d(TAG, "onConnectionSuspended");
mGoogleApiClient.connect();
}

@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
Log.d(TAG, "onConnectionSuspended");
}

@Override
public void onLocationChanged(Location location) {
Log.d(TAG, "onLocationChanged");
if (location != null) {
fusedLocationDataInterface = (FusedLocationDataInterface) context;
fusedLocationDataInterface.getFusedLocationData(location);
}
}

public void stopLocationUpdates() {
Log.d(TAG, "stopLocationUpdates");
if (mGoogleApiClient.isConnected()) {
LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this);
if (!wifiStatus){
wifiManager.setWifiEnabled(false);
}
}
}
}

创建写入位置的接口(interface)

public interface FusedLocationDataInterface {
public void getFusedLocationData(Location location);
}

在主 Activity 的onCreate()方法中创建FusedLocationTracker.class类的对象并在 Activity 中实现接口(interface)。

重写此方法

@Override
public void getFusedLocationData(Location location) {
LatLng locate = new LatLng(location.getLatitude(), location.getLongitude());
mMap.addMarker(new MarkerOptions().title("My Location").position(locate));
mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(locate, 16.0f));
}

如果您想停止位置服务,请调用stopLocationUpdates()

关于java - 退出 MapView 后,GPS 位置始终在通知托盘中保持 Activity 状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43692439/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com