NETWORK_PROVIDER 不能在 android 中工作

Posted

技术标签:

【中文标题】NETWORK_PROVIDER 不能在 android 中工作【英文标题】:NETWORK_PROVIDER not Working in android 【发布时间】:2015-08-21 11:58:09 【问题描述】:

我为用户构建应用程序以获取最后位置或当前位置。我同时使用NETWORK_PROVIDERGPS_PROVIDER。我对NETWORK_PROVIDER 没什么问题。

1.当我在 Micromax 单元 2 中使用 NEWTWORK_PROVIDER 时,应用程序崩溃,而当我使用 GPS_PROVIDER 时,应用程序运行良好。在使用这两个提供商时,相同的应用程序在三星和 XIOMI 设备上运行良好。这背后有什么原因吗?

    NETWORK_PROVIDER 是否仅支持受限版本?

    如果某些设备不支持NETWORK_PROVIDER,那么在没有 GPS 的情况下如何获取当前位置?

这是我的代码:

    private void beginAcquiringLocation() 

    //Log.d(TAG, "Beginning location acquisition");
    logStatus("Requesting location update.");

    // we don't want to be killed while handling data transmission in another thread
    // to guarantee we don't take an eternal lock even in case of bugs, set a timeout
    acquireWakeLock(WAKELOCK_TIME_DEFAULT);

    LocationManager locationManager =(LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
    Criteria crit = new Criteria();
    String provider = locationManager.getBestProvider(crit, false);
    Location location = locationManager.getLastKnownLocation(provider);

    Log.d("LOCATION>>>>>>>>>>>", String.valueOf(location));

    Log.d("Provider---------->>>>>>>>", provider);
     // no significant time or distance minima, we'll decide if it's usable when we get a coord
    locationManager.requestLocationUpdates(provider, 500, 0, this);

    if(String.valueOf(location).equals("null"))

        locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 500, 0, this);
        Location l=locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
        Log.d("-------Location default----->>>>>>>", String.valueOf(l));


    
    // next action in process is in the callback upon receiving a location update

    // to prevent endless listening if no updates are ever received, we need to schedule a timeout
    timeoutHandler.removeCallbacks(timeoutTask);
    timeoutHandler.postDelayed(timeoutTask, timeoutDelay);

【问题讨论】:

我不知道崩溃的原因,也许一些日志可以帮助。您知道哪个命令导致错误以及引发了什么异常吗?无论如何要小心: getLastKnownLocation 不会输出上述行提供的位置。您绝对应该使用回调来存储该位置 【参考方案1】:
    Micromax Unit 2 有一个 A-GPS,所以如果应用程序崩溃很奇怪:你有更多关于此的日志吗? 对我来说,有 3 种情况:
    gps –> (GPS, AGPS) 需要权限 android.permission.ACCESS_FINE_LOCATION。 网络 –> (AGPS, CellID, WiFi MACID)需要任一权限 android.permission.ACCESS_COARSE_LOCATION 或 android.permission.ACCESS_FINE_LOCATION。 被动 –> (CellID, WiFi MACID) 需要权限 android.permission.ACCESS_FINE_LOCATION,虽然如果 GPS 不是 启用此提供程序可能只会返回粗略的修复。

如果您需要更多信息,可以参考:http://developerlife.com/tutorials/?p=1375

【讨论】:

【参考方案2】:

您可以通过以下代码获取 Gps 或网络提供商是否可用。

mLocationManager = (LocationManager) context.getSystemService(LOCATION_SERVICE);
boolean isGPSEnabled = mLocationManager.isProviderEnabled
                                                 (LocationManager.GPS_PROVIDER);
boolean isNetworkEnabled = mLocationManager.isProviderEnabled
                                             (LocationManager.NETWORK_PROVIDER);

但我强烈建议您使用融合位置。检查this 和this。

【讨论】:

【参考方案3】:

不要使用旧的LocationManager,你应该使用谷歌新的 Fused Location API 连接到 Google Play 服务,你可以获得最后一个已知位置和当前位置,这里是如何获得最后一个已知位置:

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



public class MainActivity extends ActionBarActivity implements
    ConnectionCallbacks, OnConnectionFailedListener 
...
@Override
public void onConnected(Bundle connectionHint) 
    mLastLocation = LocationServices.FusedLocationApi.getLastLocation(
            mGoogleApiClient);
    if (mLastLocation != null) 
        mLatitudeText.setText(String.valueOf(mLastLocation.getLatitude()));
        mLongitudeText.setText(String.valueOf(mLastLocation.getLongitude()));
      
  

更多详情请查看官方示例here

在你的 Manifest.xml 中:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="com.google.android.gms.location.sample.basiclocationsample" >

  <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
</manifest>

【讨论】:

【参考方案4】:

我说的是废话,你用这个吗?

<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_WIFI_STATE" />

【讨论】:

我认为你的回答不好,因为没有此权限,应用程序无法在任何设备上运行@Oscar LT

以上是关于NETWORK_PROVIDER 不能在 android 中工作的主要内容,如果未能解决你的问题,请参考以下文章

为啥在 android 中使用 NETWORK_PROVIDER 时 location.getSpeed() 总是返回 0?

Android:getLastKnownLocation(LocationManager.NETWORK_PROVIDER) 在现实生活中多久返回一次 null?

LocationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER) 在 Galaxy S7 上总是返回 NULL(仅限)

如何检查 LocationManager.NETWORK_PROVIDER 是不是可用?

如何同时使用 GPS 和 NETWORK_PROVIDER,并且结果几乎没有错误

LocationManager 他的 Network_Provider 不会启用