onLocationChanged永远不会被称为模拟器 [英] onLocationChanged never gets called Emulator

查看:63
本文介绍了onLocationChanged永远不会被称为模拟器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

package com.ecsmon.android.core;

import static com.ecsmon.android.constants.Constants.log;

import java.io.IOException;
import java.util.List;

import android.annotation.SuppressLint;
import android.content.Context;
import android.location.Address;
import android.location.Criteria;
import android.location.Geocoder;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;

@SuppressLint("NewApi")
public class GPSManager {

    private double currentLatitude = 0d;
    private double currentLongitude = 0d;
    private static Context mCtx;
    private Location lastLocationBestProvider = null;
    private LocationManager mLocationManager;
    private GPSListenerImpl mGPSListener;
    private com.ecsmon.android.core.LocationListener mOutListener;
    private boolean enabled = false;
    private GPSListenerImpl mNETListener;

    public GPSManager(Context ctx, com.ecsmon.android.core.LocationListener locationListener) {
    mCtx = ctx;
    mLocationManager = (LocationManager) ctx.getSystemService(Context.LOCATION_SERVICE);
    mOutListener = locationListener;
    }

    /**
     * Start location updates
     */
    public void start() {
    log("#### Started tracking");
    lastLocationBestProvider = getLastLocationFromBestProvider();
    if (lastLocationBestProvider != null) {
        currentLatitude = lastLocationBestProvider.getLatitude();
        currentLongitude = lastLocationBestProvider.getLongitude();
        log("lat" + currentLatitude + " long " + currentLongitude);
    } else {
        log("last loaction is null");
    }
//  mGPSListener = new GPSListenerImpl("GPS");
    mNETListener = new GPSListenerImpl("NET");

    mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 1, mNETListener);
//  mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 1, mGPSListener);

    }

    private class GPSListenerImpl implements LocationListener {
    private String name = "";
    public GPSListenerImpl(String name) {
        log("listener created" + name);
        this.name = name;
    }

    public void onLocationChanged(Location loc) {
        log("######### LOCATION CHANGED CALLED!!!!!!!!!!!!!!!!! ##############");
        if (loc != null) {
        log("######### location changed " + loc.getAccuracy());
        currentLatitude = loc.getLatitude();
        currentLongitude = loc.getLongitude();
        mOutListener.update(currentLongitude, currentLatitude);
        } else {
        log("location is null");
        }
    }

    public void onProviderDisabled(String provider) {
        log("provider disabled > " + name);
    }

    public void onProviderEnabled(String provider) {
        log("provider enabled > " + name);
    }

    public void onStatusChanged(String provider, int status, Bundle extras) {
        log("status changed");
    }
    }

    /**
     * Return last location saved in phone or null
     * 
     * @return Location
     */
    public Location getLastLocationFromBestProvider() {
    if (!enabled) {
        return null;
    }
    try {
        LocationManager lm = (LocationManager) mCtx.getSystemService(Context.LOCATION_SERVICE);
        Criteria criteria = new Criteria();
        criteria.setAccuracy(Criteria.ACCURACY_COARSE);
        criteria.setAltitudeRequired(false);
        criteria.setBearingRequired(false);
        criteria.setCostAllowed(true);
        String strLocationProvider = lm.getBestProvider(criteria, true);
        Location location = lm.getLastKnownLocation(strLocationProvider);
        if (location != null) {
        return location;
        }
        return null;
    } catch (Exception e) {
        log(e.getMessage());
        return null;
    }
    }

    /**
     * Returns human readable address from longitude and latitude
     * 
     * @param latitude
     * @param longitude
     * @return
     */
    public String getAddress(Double latitude, Double longitude) {
    if (!enabled) {
        return null;
    }
    String m = "";
    try {
        if (!Geocoder.isPresent()) {
        return null;
        }
        Geocoder geo = new Geocoder(mCtx);
        List<Address> addresses = geo.getFromLocation(latitude, longitude, 1);
        if (addresses.isEmpty()) {
        return null;
        } else {
        if (addresses.size() > 0) {
            m = addresses.get(0).getFeatureName() + ", " + addresses.get(0).getLocality() + ", "
                + addresses.get(0).getCountryName();
        }
        }
    } catch (IOException ie) {
        log("No connection.");
        return null;
    } catch (Exception e) {
        log("Can't read adress from this cordinates : lat = " + latitude + " long " + longitude); //
        return null;
    }
    return m;
    }

    /**
     * Removes all location updates
     */
    public void stop() {
    try {
        mLocationManager.removeUpdates(mGPSListener);
        mLocationManager.removeUpdates(mNETListener);
    } catch (Exception e) {

    }

    }

}

这是我获取当前位置的主要类,并且永不调用onLocationChanged.我在模拟器上进行即时测试,并通过模拟器控制"发送模拟经度和纬度.请帮助这让我发疯:(

This is my main class for fetching current location and onLocationChanged never gets called. Im testing on emulator, and sending mock longitude and latitude via Emulator Control. Please Help this is driving me mad :(

推荐答案

Stefan是正确的.您需要做两件事.

Stefan was right. You need to do 2 things.

  1. 授予访问模拟位置的权限.到目前为止,这需要在src/debug/AndroidManifest.xml下的特殊清单文件中指定.创建该xml并向其中添加此权限:

uses-permission android:name ="android.permission.ACCESS_MOCK_LOCATION"

uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"

  1. 确保您的位置管理器已挂接到GPS提供商而不是网络提供商.该信息可以在这里找到:

http://developer.android.com/guide/topics/location/strategies.html#MockData

这篇关于onLocationChanged永远不会被称为模拟器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆