我如何在OnMapReady方法中等待mGoogleApiClient.isConnected()== true?

时间:2016-06-20 17:10:13

标签: java android dictionary

我有一个扩展FragmentActivity的java类,并实现接口OnMapReadyCallback GoogleApiClient.ConnectionCallbacksGoogleApiClient.OnConnectionFailedListener

我的onMapReady(GoogleMap map)方法

中有这些代码
 if (!mGoogleApiClient.isConnected()) {
        mGoogleApiClient.connect();
    }

 if (mLastLocation!=null) {
        Toast.makeText(getApplicationContext(), " got last location ... mLastlocation displayed!", Toast.LENGTH_SHORT).show();
        LatLng myPosition = new LatLng(mLastLocation.getLatitude(), mLastLocation.getLongitude());
        map.addMarker(new MarkerOptions().position(myPosition).title("myPosition"));
        map.moveCamera(CameraUpdateFactory.newLatLng(myPosition));
    }else {
        Toast.makeText(getApplicationContext(), "onMapReady running mLastLocation == null", Toast.LENGTH_SHORT).show();
    }

这是我对onConnected方法

的实现
@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);
}

当我在我的应用程序中运行此活动时,toast " onMapReady运行mLastLocation == null" 出现在toast " mGoogleApiClient已连接。&# 34;

如何将(mLastLocation!=null) {..}的内容等到mGoogleApiClient.isConnected()==true

我试过了:

if (!mGoogleApiClient.isConnected()) {
        mGoogleApiClient.connect();
    }

    do{Toast.makeText(getApplicationContext(), "mGoogleApiClient getting last location", Toast.LENGTH_SHORT).show();} while (mLastLocation==null);
        Toast.makeText(getApplicationContext(), " got last location ... mLastlocation displayed!", Toast.LENGTH_SHORT).show();
        LatLng myPosition = new LatLng(mLastLocation.getLatitude(), mLastLocation.getLongitude());
        map.addMarker(new MarkerOptions().position(myPosition).title("myPosition"));
        map.moveCamera(CameraUpdateFactory.newLatLng(myPosition));

wait(2000); //wait 2 seconds是这样的:

if (!mGoogleApiClient.isConnected()) {
        mGoogleApiClient.connect();
    }

    try {
        wait(2000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    Toast.makeText(getApplicationContext(), " got last location ... mLastlocation displayed!", Toast.LENGTH_SHORT).show();
        LatLng myPosition = new LatLng(mLastLocation.getLatitude(), mLastLocation.getLongitude());
        map.addMarker(new MarkerOptions().position(myPosition).title("myPosition"));
        map.moveCamera(CameraUpdateFactory.newLatLng(myPosition));

虽然我认为这不是一个很好的最终实施,只是为了查看我在地图上的当前位置。

在第一种情况下我得到了一个黑色的屏幕,而不是我的地图,在第二种情况下看到我的地图加载了一小段时间,然后登陆了我的应用程序的其他活动。

我也尝试了这个并获得了一个屏幕而不是我的地图:

    if (!mGoogleApiClient.isConnected()) {
        mGoogleApiClient.connect();
    }

    do{
        int waiting =0;
        if (waiting <1000){waiting++;} else{waiting =0;}} while (mLastLocation==null);
    Toast.makeText(getApplicationContext(), " got last location ... mLastlocation displayed!", Toast.LENGTH_SHORT).show();
    LatLng myPosition = new LatLng(mLastLocation.getLatitude(), mLastLocation.getLongitude());
    map.addMarker(new MarkerOptions().position(myPosition).title("myPosition"));
    map.moveCamera(CameraUpdateFactory.newLatLng(myPosition));

我会感谢任何提示或帮助。

@itsBGO:

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;
LocationListener mlocationListener;
GoogleMap map;
LatLng myPosition;

@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();
    }
    locations.add(mLastLocation);

    if(map!=null) {
        Toast.makeText(getApplicationContext(), " got last location ... mLastlocation displayed!", Toast.LENGTH_SHORT).show();
        map.setMyLocationEnabled(true);
        map.setMapType(GoogleMap.MAP_TYPE_HYBRID);
        map.getUiSettings().setMapToolbarEnabled(false);
        LatLng myPosition = new LatLng(mLastLocation.getLatitude(), mLastLocation.getLongitude());
        map.addMarker(new MarkerOptions().position(myPosition).title("newPosition"));
        map.moveCamera(CameraUpdateFactory.newLatLng(myPosition));
        draw();
    }
}

@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;

            mlocationListener = new LocationListener() {
                @Override
                public void onLocationChanged(Location location) {

                    updateLocation(location);
                }

                @Override
                public void onStatusChanged(String s, int i, Bundle bundle) {

                }

                @Override
                public void onProviderEnabled(String s) {

                }

                @Override
                public void onProviderDisabled(String s) {

                }
            };

            locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, LOCATION_REFRESH_TIME, LOCATION_REFRESH_DISTANCE, mlocationListener);
        }

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

        if (mLastLocation != null && mGoogleApiClient.isConnected()) {
            map.setMyLocationEnabled(true);
            map.setMapType(GoogleMap.MAP_TYPE_HYBRID);
            map.getUiSettings().setMapToolbarEnabled(false);
            LatLng myPosition = new LatLng(mLastLocation.getLatitude(), mLastLocation.getLongitude());
            map.addMarker(new MarkerOptions().position(myPosition).title("newPosition"));
            map.moveCamera(CameraUpdateFactory.newLatLng(myPosition));
            draw();
        } else {
            Toast.makeText(getApplicationContext(), "onMapReady running BUT mLastLocation == null", Toast.LENGTH_SHORT).show();
        }


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




}


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

    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();
        LatLng newPosition = new LatLng(locRecorded.getLatitude(), locRecorded.getLongitude());
        map.addMarker(new MarkerOptions().position(newPosition).title("newPosition"));
        map.moveCamera(CameraUpdateFactory.newLatLng(newPosition));

    }

    map.addPolyline(options);

}

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

@Louis Grignon:这是我应用中的实时路线追踪活动。我添加了对map!= null的检查,我的代码的以下版本没有错误,但在地图上没有显示标记。

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();
    }
    locations.add(mLastLocation);
    int waiting =0;
    if(map!=null && mapIsReady==true) {
        Toast.makeText(getApplicationContext(), " got last location ... mLastlocation displayed!", Toast.LENGTH_SHORT).show();
        map.setMyLocationEnabled(true);
        map.setMapType(GoogleMap.MAP_TYPE_HYBRID);
        map.getUiSettings().setMapToolbarEnabled(false);
        LatLng myPosition = new LatLng(mLastLocation.getLatitude(), mLastLocation.getLongitude());
        map.addMarker(new MarkerOptions().position(myPosition).title("newPosition"));
        map.moveCamera(CameraUpdateFactory.newLatLng(myPosition));
        draw();
    }
}

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

    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();
        LatLng newPosition = new LatLng(locRecorded.getLatitude(), locRecorded.getLongitude());
        map.addMarker(new MarkerOptions().position(newPosition).title("newPosition"));
        map.moveCamera(CameraUpdateFactory.newLatLng(newPosition));

    }

    map.addPolyline(options);

}

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

}

这是我的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" />

运行时(清理并重新运行)

我得到以下红色日志
  

没找到上课   &#34; com.google.android.gms.dynamite.descriptors.com.google.android.gms.googlecertificates.moduledescriptor&#34;

首先我认为这是一个错误,直到我阅读this thread here

问题还在于我的if(map!=null && mapIsReady==true) {...}内容从未被调用过。

这是我收到的完整红色日志消息

  

/ DynamiteModule:无法加载模块描述符类:未找到   类   &#34; com.google.android.gms.dynamite.descriptors.com.google.android.gms.googlecertificates.ModuleDescriptor&#34;   在路径上:DexPathList [[zip文件   #&34; /data/app/com.noureddine_ouertani.www.wocelli50-1/base.apk"],nativeLibraryDirectories = [/供应商/ lib64下,   /系统/ lib64下]]

2 个答案:

答案 0 :(得分:0)

当mGoogleApiClient仍在连接时,您正在onMapReady方法中检查mLastLocation。

让您的类实现LocationListener并覆盖onLocationChanged,而不是在onMapReady中创建一个匿名的LocationListener。

@Override
public void onLocationChanged(Location location) {
    updateLocation(location);
}

将以下代码放在onConnected方法而不是onMapReady中。如果你的mLastLocation == null,也在else块中调用requestLocationUpdates方法。

if (mLastLocation!=null) {
    Toast.makeText(getApplicationContext(), " got last location ... mLastlocation displayed!", Toast.LENGTH_SHORT).show();
    LatLng myPosition = new LatLng(mLastLocation.getLatitude(), mLastLocation.getLongitude());
    map.addMarker(new MarkerOptions().position(myPosition).title("myPosition"));
    map.moveCamera(CameraUpdateFactory.newLatLng(myPosition));
    }else {
        Toast.makeText(getApplicationContext(), "onMapReady running mLastLocation == null", Toast.LENGTH_SHORT).show();

        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, LOCATION_REFRESH_TIME, LOCATION_REFRESH_DISTANCE, mlocationListener);
    }

将以下代码放在onLocationChanged或updateLocation方法中。

if (mLastLocation != null && mGoogleApiClient.isConnected()) {
    LatLng myPosition = new LatLng(mLastLocation.getLatitude(), mLastLocation.getLongitude());
    map.addMarker(new MarkerOptions().position(myPosition).title("newPosition"));
    map.moveCamera(CameraUpdateFactory.newLatLng(myPosition));
    draw();
} else {
    Toast.makeText(getApplicationContext(), "onMapReady running BUT mLastLocation == null", Toast.LENGTH_SHORT).show();
}

答案 1 :(得分:0)

为什么不在单独的方法中提取代码,在onConnected之后调用它,如下例所示:

您的onMapReady代码

 if (!mGoogleApiClient.isConnected()) {
   mGoogleApiClient.connect();
 } else {
   initMapLocation();     
 }

您的onConnected代码

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

您的initMapLocation代码

 private void initMapLocation() {
   if (mLastLocation!=null) {
         Toast.makeText(getApplicationContext(), " got last location ... mLastlocation displayed!", Toast.LENGTH_SHORT).show();
         LatLng myPosition = new LatLng(mLastLocation.getLatitude(), mLastLocation.getLongitude());
         map.addMarker(new MarkerOptions().position(myPosition).title("myPosition"));
         map.moveCamera(CameraUpdateFactory.newLatLng(myPosition));
     }else {
         Toast.makeText(getApplicationContext(), "onMapReady running mLastLocation == null", Toast.LENGTH_SHORT).show();
     }

无论如何,不​​要使用固定持续时间等待(因为它们仍然不可预测),甚至不太活跃的等待(因为它们密集使用处理器)。

希望有所帮助:)