没有使用 fusedLocationAPI.requestLocationUpdates 调用 onLocationChanged

Posted

技术标签:

【中文标题】没有使用 fusedLocationAPI.requestLocationUpdates 调用 onLocationChanged【英文标题】:onLocationChanged does not get called using fusedLocationAPI.requestLocationUpdates 【发布时间】:2016-11-14 11:44:21 【问题描述】:

我一直在尝试使用 fusedLocationApi 来获取我当前的位置。我正在使用带有模拟 Nexus 6 的 android studio。根据在线文档 https://developer.android.com/training/location/receive-location-updates.html?hl=es 我们可以使用以下方式请求位置更新:

FusedLocationApi.requestLocationUpdates

然后回调转到:

onLocationChanged(位置位置)

但是,onLocationChanged 根本没有被调用。如果是这样,它会在日志中打印一些东西,因为我在那里放了一个 Log.d 行。请注意,确实会调用 startLocationUpdates()。下面是我的代码。如果有人能对此有所了解,那就太好了=)我对Android真的很陌生,所以我有点无能为力。会不会是模拟器(GPS,.. idk)导致了这个问题?

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback,
    GoogleApiClient.ConnectionCallbacks,
    GoogleApiClient.OnConnectionFailedListener, LocationListener 

private GoogleMap mMap; // google map works well just as default project
private GoogleApiClient mGoogleApiClient;
public static final String TAG = MapsActivity.class.getSimpleName();
private LocationRequest mLocationRequest;
private static final int REQUEST_LOCATION = 2;
private Location location;

@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_maps);
    SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
            .findFragmentById(R.id.map);
    mapFragment.getMapAsync(this);

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

    mLocationRequest = LocationRequest.create()
            .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
            .setInterval(1000)
            .setFastestInterval(100);
 

@Override
public void onConnected(@Nullable Bundle bundle) 
    if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
            && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) 
        ActivityCompat.requestPermissions(this, new String[]android.Manifest.permission.ACCESS_FINE_LOCATION,
                REQUEST_LOCATION);
     else 
        location = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
        if (location == null) 
            startLocationUpdates();
        
        else 
            handleNewLocation(location);
        ;
    


protected void startLocationUpdates() 
    Log.d(TAG, "Requesting location updates");
    LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
    

@Override
public void onLocationChanged(Location location) 
    String msg = "Updated Location: " +
            Double.toString(location.getLatitude()) + "," +
            Double.toString(location.getLongitude());
    Log.d(TAG, msg);

manifest.xml

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

Gradle 构建:

dependencies 
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:24.0.0'
    compile 'com.google.android.gms:play-services:9.0.0'

【问题讨论】:

【参考方案1】:

您确定您的 GPS 已打开吗?您可以尝试通过 Google Google 在 GitHub 上浏览此示例项目。在这个项目中,他们还提供了检查位置服务是否启用的代码。如果不是,用户将收到一条消息,以便他们可以激活他们的位置服务。

/*
 * Copyright (C) 2012 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.example.mapdemo;

import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.GoogleMap.OnMyLocationButtonClickListener;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;

import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.widget.Toast;

/**
 * This demo shows how GMS Location can be used to check for changes to the users location.  The
 * "My Location" button uses GMS Location to set the blue dot representing the users location.
 * Permission for @link android.Manifest.permission#ACCESS_FINE_LOCATION is requested at run
 * time. If the permission has not been granted, the Activity is finished with an error message.
 */
public class MyLocationDemoActivity extends AppCompatActivity
        implements
        OnMyLocationButtonClickListener,
        OnMapReadyCallback,
        ActivityCompat.OnRequestPermissionsResultCallback 

    /**
     * Request code for location permission request.
     *
     * @see #onRequestPermissionsResult(int, String[], int[])
     */
    private static final int LOCATION_PERMISSION_REQUEST_CODE = 1;

    /**
     * Flag indicating whether a requested permission has been denied after returning in
     * @link #onRequestPermissionsResult(int, String[], int[]).
     */
    private boolean mPermissionDenied = false;

    private GoogleMap mMap;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.my_location_demo);

        SupportMapFragment mapFragment =
                (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);
    

    @Override
    public void onMapReady(GoogleMap map) 
        mMap = map;

        mMap.setOnMyLocationButtonClickListener(this);
        enableMyLocation();
    

    /**
     * Enables the My Location layer if the fine location permission has been granted.
     */
    private void enableMyLocation() 
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
                != PackageManager.PERMISSION_GRANTED) 
            // Permission to access the location is missing.
            PermissionUtils.requestPermission(this, LOCATION_PERMISSION_REQUEST_CODE,
                    Manifest.permission.ACCESS_FINE_LOCATION, true);
         else if (mMap != null) 
            // Access to the location has been granted to the app.
            mMap.setMyLocationEnabled(true);
        
    

    @Override
    public boolean onMyLocationButtonClick() 
        Toast.makeText(this, "MyLocation button clicked", Toast.LENGTH_SHORT).show();
        // Return false so that we don't consume the event and the default behavior still occurs
        // (the camera animates to the user's current position).
        return false;
    


    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
            @NonNull int[] grantResults) 
        if (requestCode != LOCATION_PERMISSION_REQUEST_CODE) 
            return;
        

        if (PermissionUtils.isPermissionGranted(permissions, grantResults,
                Manifest.permission.ACCESS_FINE_LOCATION)) 
            // Enable the my location layer if the permission has been granted.
            enableMyLocation();
         else 
            // Display the missing permission error dialog when the fragments resume.
            mPermissionDenied = true;
        
    

    @Override
    protected void onResumeFragments() 
        super.onResumeFragments();
        if (mPermissionDenied) 
            // Permission was not granted, display error dialog.
            showMissingPermissionError();
            mPermissionDenied = false;
        
    

    /**
     * Displays a dialog with error message explaining that the location permission is missing.
     */
    private void showMissingPermissionError() 
        PermissionUtils.PermissionDeniedDialog
                .newInstance(true).show(getSupportFragmentManager(), "dialog");
    


【讨论】:

【参考方案2】:

老问题,但除非我上次尝试后发生了变化,否则模拟器不知道它的位置。你必须给它发送坐标。

【讨论】:

以上是关于没有使用 fusedLocationAPI.requestLocationUpdates 调用 onLocationChanged的主要内容,如果未能解决你的问题,请参考以下文章

没有使用重要位置监控的互联网没有位置坐标

有没有使用xware的

使用 AVAudioPlayer 没有声音

[JavaScript]有没有办法在没有终端的情况下使用 Cloudinary

为啥我没有成功以编程方式使用 segue?

ServiceStack RedisMessageQueueClient:错误没有返回到ReplyTo地址,也没有使用RetryAttempts?