gpt4 book ai didi

java - 在我使用 Google Play 服务版本 9.0.83 进行的路线跟踪 Activity 中, map 上没有显示标记

转载 作者:太空宇宙 更新时间:2023-11-04 12:29:20 25 4
gpt4 key购买 nike

在下面的代码中,我的 updateLocation 方法中的 if(map!=null && mapIsReady==true) {...} 的内容永远不会被调用。知道为什么吗?

package com.noureddine_ouertani.www.wocelli50;

import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.graphics.Color;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.net.Uri;
import android.os.Bundle;
import android.os.PowerManager;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.FragmentActivity;
import android.widget.Toast;

import com.google.android.gms.appindexing.Action;
import com.google.android.gms.appindexing.AppIndex;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.location.LocationServices;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;
import com.google.android.gms.maps.model.PolylineOptions;

import java.util.ArrayList;
import java.util.List;

public class NeueRouteAufzeichnen extends FragmentActivity implements OnMapReadyCallback, GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener {

private LocationManager locationManager;
private Location mLastLocation;
private Location previousLocation;
private long distanceTraveled;

private boolean tracking = false;
private long startTime;
private PowerManager.WakeLock wakeLock;
private boolean gpsFix;

private static final double MILLISECONDS_PER_HOUR = 100 * 60 * 60;
private static final double MILES_PER_KILOMETER = 0.621371192;
private static final int MAP_ZOOM = 18;

private List<Location> locations;

private GoogleApiClient mGoogleApiClient;

GoogleMap map;
LatLng myPosition;
boolean mapIsReady = false;

com.google.android.gms.location.LocationListener mlocationListener = new com.google.android.gms.location.LocationListener() {
@Override
public void onLocationChanged(Location location) {

updateLocation(location);
}

};

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (mGoogleApiClient == null) {
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.addApi(AppIndex.API).build();
}
setContentView(R.layout.activity_neue_route_aufzeichnen);
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
locations = new ArrayList<Location>();

}

protected void onStart() {
mGoogleApiClient.connect();
super.onStart();
// ATTENTION: This was auto-generated to implement the App Indexing API.
// See https://g.co/AppIndexing/AndroidStudio for more information.
Action viewAction = Action.newAction(
Action.TYPE_VIEW, // TODO: choose an action type.
"NeueRouteAufzeichnen Page", // TODO: Define a title for the content shown.
// TODO: If you have web page content that matches this app activity's content,
// make sure this auto-generated web page URL is correct.
// Otherwise, set the URL to null.
Uri.parse("http://host/path"),
// TODO: Make sure this auto-generated app URL is correct.
Uri.parse("android-app://com.noureddine_ouertani.www.wocelli50/http/host/path")
);
AppIndex.AppIndexApi.start(mGoogleApiClient, viewAction);
}

protected void onStop() {
mGoogleApiClient.disconnect();
super.onStop();
// ATTENTION: This was auto-generated to implement the App Indexing API.
// See https://g.co/AppIndexing/AndroidStudio for more information.
Action viewAction = Action.newAction(
Action.TYPE_VIEW, // TODO: choose an action type.
"NeueRouteAufzeichnen Page", // TODO: Define a title for the content shown.
// TODO: If you have web page content that matches this app activity's content,
// make sure this auto-generated web page URL is correct.
// Otherwise, set the URL to null.
Uri.parse("http://host/path"),
// TODO: Make sure this auto-generated app URL is correct.
Uri.parse("android-app://com.noureddine_ouertani.www.wocelli50/http/host/path")
);
AppIndex.AppIndexApi.end(mGoogleApiClient, viewAction);
}

@Override
public void onConnected(Bundle connectionHint) {
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
Toast.makeText(getApplicationContext(), "Permissions missing for mGoogleApiClient.", Toast.LENGTH_SHORT).show();
}
Toast.makeText(getApplicationContext(), "mGoogleApiClient is connected.", Toast.LENGTH_SHORT).show();
mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
if(mLastLocation!=null){
Toast.makeText(getApplicationContext(), "YES! mLastLocation!=null", Toast.LENGTH_SHORT).show();

}
}

@Override
public void onConnectionSuspended(int i) {
Toast.makeText(getApplicationContext(), "Connection of mGoogleApiClient is suspended.", Toast.LENGTH_SHORT).show();
}

public void addPoint(Location location) {
locations.add(location);
Toast.makeText(getApplicationContext(), "addPoint has been called.", Toast.LENGTH_SHORT).show();
}

@Override
public void onMapReady(GoogleMap map) {

distanceTraveled = 0;

Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);
criteria.setBearingRequired(true);
criteria.setCostAllowed(true);
criteria.setPowerRequirement(Criteria.POWER_LOW);
criteria.setAltitudeRequired(false);
locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);

Toast.makeText(getApplicationContext(), "onMapReady is called.", Toast.LENGTH_SHORT).show();
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
float LOCATION_REFRESH_DISTANCE = 5000;
long LOCATION_REFRESH_TIME = 0;
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, LOCATION_REFRESH_TIME, LOCATION_REFRESH_DISTANCE, (LocationListener) mlocationListener);
}

PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "NO Sleep");
wakeLock.acquire();
if (!mGoogleApiClient.isConnected()) {
mGoogleApiClient.connect();
}

tracking = true;
startTime = System.currentTimeMillis();
//Toast.makeText(getApplicationContext(), " mGoogleApiClient.connect()call from onMapReady!", Toast.LENGTH_SHORT).show();
//LatLng sydney = new LatLng(-34, 151);
//map.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney"));
//map.moveCamera(CameraUpdateFactory.newLatLng(sydney));
mapIsReady = true;

}


protected void updateLocation(Location location) {
Toast.makeText(getApplicationContext(), "updateLocation method called.", Toast.LENGTH_SHORT).show();
if (location != null && gpsFix == true) {
addPoint(location);

if (previousLocation != null)
distanceTraveled += location.distanceTo(previousLocation);
}

if(map!=null && mapIsReady==true) {
Toast.makeText(getApplicationContext(), " got last location ... mLastlocation displayed!", Toast.LENGTH_SHORT).show();
LatLng newPosition = new LatLng(location.getLatitude(), location.getLongitude());
map.addMarker(new MarkerOptions().position(newPosition).title("newPosition"));
map.moveCamera(CameraUpdateFactory.newLatLng(newPosition));
locations.add(mLastLocation);
}

previousLocation = location;
}

public void draw() {
Toast.makeText(getApplicationContext(), "Draw method called.", Toast.LENGTH_SHORT).show();
if (map == null) {
return;
}

PolylineOptions options = new PolylineOptions();

options.color(Color.parseColor("#CC0000FF"));
options.width(5);
options.visible(true);

for (Location locRecorded : locations) {
options.add(new LatLng(locRecorded.getLatitude(),
locRecorded.getLongitude()));
Toast.makeText(getApplicationContext(), "draw method got new location!", Toast.LENGTH_SHORT).show();



}

map.addPolyline(options);

}

@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
Toast.makeText(getApplicationContext(), "Connection of mGoogleApiClient failed.", Toast.LENGTH_SHORT).show();
}


}

我得到以下 map (没有标记)

enter image description here

PS:我仍然没有调用我的 draw() 方法。

我收到了您看到的这个日志错误。

06-24 18:50:24.488 7128-7759/com.noureddine_ouertani.www.wocelli50 E/DynamiteModule: Failed to load module descriptor class: Didn't find class "com.google.android.gms.dynamite.descriptors.com.google.android.gms.googlecertificates.ModuleDescriptor" on path: DexPathList[[zip file "/data/app/com.noureddine_ouertani.www.wocelli50-2/base.apk"],nativeLibraryDirectories=[/vendor/lib64, /system/lib64]]

在阅读了有关此日志错误的一些帖子和答案(例如 thisthis )后,我认为我发现这是一个已知的 Google Play 服务版本 9.0.83 问题,导致某些使用 GoogleApiClient(如我的)的应用出现错误。

我尝试通过以下方式解决此问题:1.Downgrading Google Play Services Manually2.Adapting dependencies after downgrading Google Play Sevices

但这并没有解决问题。

PS:这是我的 XML

<fragment xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/map"
tools:context=".NeueRouteAufzeichnen"
android:name="com.google.android.gms.maps.SupportMapFragment" />

最佳答案

当您使用 FusedLocationApi 时,您可以请求位置更新,如下所述:https://developer.android.com/training/location/receive-location-updates.html

您还需要在 onMapReady 中添加 this.map = map;

在您的示例中:

public class NeueRouteAufzeichnen extends FragmentActivity implements OnMapReadyCallback, GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener {

private Location mLastLocation;
private Location previousLocation;
private long distanceTraveled;

private boolean tracking = false;
private long startTime;
private PowerManager.WakeLock wakeLock;
private boolean gpsFix;

private static final double MILLISECONDS_PER_HOUR = 100 * 60 * 60;
private static final double MILES_PER_KILOMETER = 0.621371192;
private static final int MAP_ZOOM = 18;

private List<Location> locations;

private GoogleApiClient mGoogleApiClient;

GoogleMap map;
LatLng myPosition;
boolean mapIsReady = false;

LocationRequest mLocationRequest;

com.google.android.gms.location.LocationListener mlocationListener = new com.google.android.gms.location.LocationListener() {
@Override
public void onLocationChanged(Location location) {
updateLocation(location);
}
};

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (mGoogleApiClient == null) {
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.addApi(AppIndex.API).build();
}
setContentView(R.layout.activity_neue_route_aufzeichnen);
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
locations = new ArrayList<Location>();
}

protected void onStart() {
mGoogleApiClient.connect();
super.onStart();
// ATTENTION: This was auto-generated to implement the App Indexing API.
// See https://g.co/AppIndexing/AndroidStudio for more information.
Action viewAction = Action.newAction(
Action.TYPE_VIEW, // TODO: choose an action type.
"NeueRouteAufzeichnen Page", // TODO: Define a title for the content shown.
// TODO: If you have web page content that matches this app activity's content,
// make sure this auto-generated web page URL is correct.
// Otherwise, set the URL to null.
Uri.parse("http://host/path"),
// TODO: Make sure this auto-generated app URL is correct.
Uri.parse("android-app://com.noureddine_ouertani.www.wocelli50/http/host/path")
);
AppIndex.AppIndexApi.start(mGoogleApiClient, viewAction);
}

protected void onStop() {
mGoogleApiClient.disconnect();
super.onStop();
// ATTENTION: This was auto-generated to implement the App Indexing API.
// See https://g.co/AppIndexing/AndroidStudio for more information.
Action viewAction = Action.newAction(
Action.TYPE_VIEW, // TODO: choose an action type.
"NeueRouteAufzeichnen Page", // TODO: Define a title for the content shown.
// TODO: If you have web page content that matches this app activity's content,
// make sure this auto-generated web page URL is correct.
// Otherwise, set the URL to null.
Uri.parse("http://host/path"),
// TODO: Make sure this auto-generated app URL is correct.
Uri.parse("android-app://com.noureddine_ouertani.www.wocelli50/http/host/path")
);
AppIndex.AppIndexApi.end(mGoogleApiClient, viewAction);
}

@Override
public void onConnected(Bundle connectionHint) {
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
Toast.makeText(getApplicationContext(), "Permissions missing for mGoogleApiClient.", Toast.LENGTH_SHORT).show();
}
Toast.makeText(getApplicationContext(), "mGoogleApiClient is connected.", Toast.LENGTH_SHORT).show();
mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
if (mLastLocation != null) {
Toast.makeText(getApplicationContext(), "YES! mLastLocation!=null", Toast.LENGTH_SHORT).show();
}

mLocationRequest = LocationRequest.create();
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
mLocationRequest.setInterval(1000); // 1 SECOND
mLocationRequest.setFastestInterval(1000); // 1 SECOND
LocationServices.FusedLocationApi.requestLocationUpdates(
mGoogleApiClient, mLocationRequest, mlocationListener);
}

@Override
public void onConnectionSuspended(int i) {
Toast.makeText(getApplicationContext(), "Connection of mGoogleApiClient is suspended.", Toast.LENGTH_SHORT).show();
}

public void addPoint(Location location) {
locations.add(location);
Toast.makeText(getApplicationContext(), "addPoint has been called.", Toast.LENGTH_SHORT).show();
}

@Override
public void onMapReady(GoogleMap map) {
this.map = map;

distanceTraveled = 0;

Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);
criteria.setBearingRequired(true);
criteria.setCostAllowed(true);
criteria.setPowerRequirement(Criteria.POWER_LOW);
criteria.setAltitudeRequired(false);

Toast.makeText(getApplicationContext(), "onMapReady is called.", Toast.LENGTH_SHORT).show();

PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "NO Sleep");
wakeLock.acquire();
if (!mGoogleApiClient.isConnected()) {
mGoogleApiClient.connect();
}

tracking = true;
startTime = System.currentTimeMillis();
//Toast.makeText(getApplicationContext(), " mGoogleApiClient.connect()call from onMapReady!", Toast.LENGTH_SHORT).show();
//LatLng sydney = new LatLng(-34, 151);
//map.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney"));
//map.moveCamera(CameraUpdateFactory.newLatLng(sydney));
mapIsReady = true;

}

protected void updateLocation(Location location) {
Toast.makeText(getApplicationContext(), "updateLocation method called.", Toast.LENGTH_SHORT).show();
if (location != null && gpsFix == true) {
addPoint(location);

if (previousLocation != null)
distanceTraveled += location.distanceTo(previousLocation);
}

if (map != null && mapIsReady == true) {
Toast.makeText(getApplicationContext(), " got last location ... mLastlocation displayed!", Toast.LENGTH_SHORT).show();
LatLng newPosition = new LatLng(location.getLatitude(), location.getLongitude());
map.addMarker(new MarkerOptions().position(newPosition).title("newPosition"));
map.moveCamera(CameraUpdateFactory.newLatLng(newPosition));
locations.add(mLastLocation);
}

previousLocation = location;
}

public void draw() {
Toast.makeText(getApplicationContext(), "Draw method called.", Toast.LENGTH_SHORT).show();
if (map == null) {
return;
}

PolylineOptions options = new PolylineOptions();

options.color(Color.parseColor("#CC0000FF"));
options.width(5);
options.visible(true);

for (Location locRecorded : locations) {
options.add(new LatLng(locRecorded.getLatitude(),
locRecorded.getLongitude()));
Toast.makeText(getApplicationContext(), "draw method got new location!", Toast.LENGTH_SHORT).show();


}

map.addPolyline(options);

}

@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
Toast.makeText(getApplicationContext(), "Connection of mGoogleApiClient failed.", Toast.LENGTH_SHORT).show();
}
}

关于java - 在我使用 Google Play 服务版本 9.0.83 进行的路线跟踪 Activity 中, map 上没有显示标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38018234/

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