繁体   English   中英

Google Play服务版本9.0.83的路线跟踪活动中地图上未显示任何标记

[英]No marker displayed on the map in my route tracking activity with Google Play Services version 9.0.83

在下面的代码中,我的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();
}


}

我得到以下地图(没有标记)

在此输入图像描述

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

我看到你的日志错误。

06-24 18:50:24.488 7128-7759 / com.noureddine_ouertani.www.wocelli50 E / DynamiteModule:无法加载模块描述符类:未找到类“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下]]

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

我尝试通过以下方式解决此问题:1。 手动降级Google Play服务 2. 在降级Google Play服务后调整依赖关系

但这并没有解决问题。

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

你还需要添加this.map = map; 在你的onMapReady

在你的例子中:

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();
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM