首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FusedLocationProviderApi致命异常: GoogleApiClient尚未连接。

FusedLocationProviderApi致命异常: GoogleApiClient尚未连接。
EN

Stack Overflow用户
提问于 2015-06-11 15:16:51
回答 1查看 1.6K关注 0票数 0

我是一个新的android开发者。我想做一个GoogleMaps应用程序,它将显示用户当前位置周围的一些位置。但我还没有捕捉到用户的位置。我看了太多的文档,谷歌的GoogleMap教程。从堆叠溢出搜索,但我找不到任何解决办法。

这是我的HaritaFragment.java

代码语言:javascript
复制
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.Intent;
import android.location.Location;
import android.location.LocationManager;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import com.google.android.gms.analytics.HitBuilders;
import com.google.android.gms.analytics.Tracker;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GooglePlayServicesUtil;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.common.api.PendingResult;
import com.google.android.gms.common.api.Status;
import com.google.android.gms.location.FusedLocationProviderApi;
import com.google.android.gms.location.LocationListener;
import com.google.android.gms.location.LocationRequest;
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.SupportMapFragment;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;
import com.parse.FindCallback;
import com.parse.Parse;
import com.parse.ParseException;
import com.parse.ParseGeoPoint;
import com.parse.ParseObject;
import com.parse.ParseQuery;

import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class HaritaFragment extends Fragment implements LocationListener, GoogleApiClient.ConnectionCallbacks,
        GoogleApiClient.OnConnectionFailedListener  {

    private static GoogleMap mGoogleMap;
    public static HashMap<Marker, Markers> mMarkersHashMap = new HashMap<Marker, Markers>();
    private ArrayList<Markers> mMyMarkersArray = new ArrayList<Markers>();
    private Map<Marker, Markers> allMarkersMap = new HashMap<Marker, Markers>();
    private static List<ParseObject>vetList = new ArrayList<ParseObject>();

    private LatLng latLng;
    private Double lat;
    private Double lng;



    private FusedLocationProviderApi fusedLocationProviderApi = LocationServices.FusedLocationApi;
    private static final long INTERVAL = 1000 * 10;
    private static final long FASTEST_INTERVAL = 1000 * 5;
    LocationRequest mLocationRequest;
    GoogleApiClient mGoogleApiClient;
    Location userLocation;
    String mLastUpdateTime;

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

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        setHasOptionsMenu(true);

        return inflater.inflate(R.layout.fragment_harita, container, false);
    }

    public void onViewCreated(View view, Bundle savedInstanceState){

    }

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if (isGooglePlayServicesAvailable()) {

            createLocationRequest();
            mGoogleApiClient = new GoogleApiClient.Builder(getActivity())
                    .addApi(LocationServices.API)
                    .addConnectionCallbacks(this)
                    .addOnConnectionFailedListener(this)
                    .build();
        }
    }

        @Override
    public void onStart() {
        super.onStart();
        mGoogleApiClient.connect();

    }

    @Override
    public void onStop() {
        super.onStop();
        //mGoogleApiClient.disconnect();
    }

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

    protected void stopLocationUpdates() {
        LocationServices.FusedLocationApi.removeLocationUpdates(
                mGoogleApiClient, this);
    }

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

        if (isGooglePlayServicesAvailable()){

            startLocationUpdates();
            setupMap();
            googleAnalyticsSendScreen();
            getAllDataFromParse();
        }
    }

    @Override
    public void onLocationChanged(Location location) {
            /*lat =  (location.getLatitude());
            lng =  (location.getLongitude());*/

        userLocation = location;
        mLastUpdateTime = DateFormat.getTimeInstance().format(new Date());
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        if (id == R.id.map_hibrit) {
            mGoogleMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
        }
        else if (id == R.id.map_standart){
            mGoogleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
        }
        else if (id == R.id.map_uydu){
            mGoogleMap.setMapType(GoogleMap.MAP_TYPE_SATELLITE);
        }
        return super.onOptionsItemSelected(item);
    }

    @Override
    public void onConnected(Bundle bundle) {

        startLocationUpdates();
    }

    protected void startLocationUpdates() {
        /*PendingResult<Status> pendingResult = LocationServices.FusedLocationApi.requestLocationUpdates(
                mGoogleApiClient, mLocationRequest, this);*/

        LocationServices.FusedLocationApi.requestLocationUpdates(
                mGoogleApiClient, mLocationRequest, this);
    }

    @Override
    public void onConnectionSuspended(int i) {

    }

    @Override
    public void onConnectionFailed(ConnectionResult connectionResult) {

    }

有logcat输出:

代码语言:javascript
复制
06-11 17:54:43.361  17655-17855/packagename E/AndroidRuntime﹕ FATAL EXCEPTION: main
    java.lang.IllegalStateException: GoogleApiClient is not connected yet.
            at com.google.android.gms.internal.fp.a(Unknown Source)
            at com.google.android.gms.common.api.w.a(Unknown Source)
            at com.google.android.gms.internal.hy.a(Unknown Source)
            at packagename.r.P(Unknown Source)
            at packagename.r.t(Unknown Source)
            at android.support.v4.app.Fragment.I(Unknown Source)
            at android.support.v4.app.w.a(Unknown Source)
            at android.support.v4.app.w.a(Unknown Source)
            at android.support.v4.app.e.run(Unknown Source)
            at android.support.v4.app.w.f(Unknown Source)
            at android.support.v4.app.w.b(Unknown Source)
            at android.support.v4.app.ac.b(Unknown Source)
            at android.support.v4.view.ViewPager.a(Unknown Source)
            at android.support.v4.view.ViewPager.c(Unknown Source)
            at android.support.v4.view.ViewPager.onMeasure(Unknown Source)
            at android.view.View.measure(View.java:13011)
            at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4706)
            at android.widget.FrameLayout.onMeasure(FrameLayout.java:293)
            at android.view.View.measure(View.java:13011)
            at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4706)
            at android.support.v7.internal.widget.ActionBarOverlayLayout.onMeasure(Unknown Source)
            at android.view.View.measure(View.java:13011)
            at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4706)
            at android.widget.FrameLayout.onMeasure(FrameLayout.java:293)
            at android.view.View.measure(View.java:13011)
            at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4706)
            at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1369)
            at android.widget.LinearLayout.measureVertical(LinearLayout.java:660)
            at android.widget.LinearLayout.onMeasure(LinearLayout.java:553)
            at android.view.View.measure(View.java:13011)
            at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4706)
            at android.widget.FrameLayout.onMeasure(FrameLayout.java:293)
            at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2163)
            at android.view.View.measure(View.java:13011)
            at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1084)
            at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2498)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:154)
            at android.app.ActivityThread.main(ActivityThread.java:4944)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:511)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
            at dalvik.system.NativeStart.main(Native Method)

有什么问题吗?我尝试了4.0.1真正的宏达电设备和4.4.4 GenyMotion与GooglePlayServices。

我想从Parse.com中获取接近位置的用户,并且必须捕获此方法的用户位置:

代码语言:javascript
复制
if (userLocation != null) {

            ParseGeoPoint parsedLocation = (new ParseGeoPoint(userLocation.getLatitude(), userLocation.getLongitude()));
            ParseQuery<ParseObject> query = ParseQuery.getQuery("Vets");
            query.fromLocalDatastore();
            query.whereNear("location", parsedLocation);
            //query.whereWithinKilometers("location",userLocation,100);
            query.setLimit(250);
            query.findInBackground(new FindCallback<ParseObject>() {
                @Override
                public void done(List<ParseObject> list, ParseException e) {

                    if (e == null) {



                    } else {

                        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
                        builder.setTitle(getString(R.string.parse_online_query_error_title));
                        builder.setMessage(getString(R.string.parse_online_query_error_message));
                        builder.setPositiveButton(android.R.string.ok, null);
                        AlertDialog dialog = builder.create();
                        dialog.show();
                    }
                }
            });
        } 

如果你告诉我另一种方法的话。这对我有好处。我不会坚持FusedLocationProviderApi。

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-11 15:57:01

看上去你把事情搞错了。在启动、暂停和恢复活动时,了解Android的顺序是很重要的。

http://developer.android.com/training/basics/activity-lifecycle/pausing.html

代码中的问题是,当您访问onResume时,mGoogleApiClient可能没有完全连接。

这是你应该得到的命令

  1. 创建mGoogleApiClient
  2. 调用mGoogleApiClient.connect();
  3. 自动调用onConnected()。

-从startLocationUpdates()内部调用onConnected ()

这样做意味着当您请求位置更新时,您的Api客户端始终是连接的。

我认为修复代码的最快方法是删除onPauseonResume方法,并在onStop中取消对onDisconnect的注释。

允许onStartonStop处理连接,然后依次处理位置更新。

祝你好运。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30784843

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档