Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/180.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当设备没有互联网时,Android LocationManager位置更新不会启动_Android_Geolocation_Location_Android Location_Locationlistener - Fatal编程技术网

当设备没有互联网时,Android LocationManager位置更新不会启动

当设备没有互联网时,Android LocationManager位置更新不会启动,android,geolocation,location,android-location,locationlistener,Android,Geolocation,Location,Android Location,Locationlistener,我正在开发一款完全离线的设备,自从上次升级到安卓6.0.1以来,它一直没有连接到互联网 有一段时间,这个应用程序运行得非常好,使用Google Play服务FusedLocationApi,它会每秒钟更新一次,并完成它应该做的事情。在我对代码的其他部分做了一些更改之后,它突然停止了工作,我不知道为什么。我认为这可能是谷歌Play服务的一个问题,所以我按照中的指示将其与Android的定位服务进行了切换 我删除了与问题无关的代码。我可能无意中删掉了一些变量,但我在安卓工作室工作,那里没有遗漏任何变

我正在开发一款完全离线的设备,自从上次升级到安卓6.0.1以来,它一直没有连接到互联网

有一段时间,这个应用程序运行得非常好,使用Google Play服务FusedLocationApi,它会每秒钟更新一次,并完成它应该做的事情。在我对代码的其他部分做了一些更改之后,它突然停止了工作,我不知道为什么。我认为这可能是谷歌Play服务的一个问题,所以我按照中的指示将其与Android的定位服务进行了切换

我删除了与问题无关的代码。我可能无意中删掉了一些变量,但我在安卓工作室工作,那里没有遗漏任何变量,所以这可能不是问题所在。我正在使用Butterknife,因此有一些注释

以下是从应用程序创建到使用开关打开和关闭位置请求的Logcat:

08-01 11:04:53.289 11532-11532/mil.navy.nrl.androidrobocontroller W/System: ClassLoader referenced unknown path: /data/app/mil.navy.nrl.androidrobocontroller-1/lib/arm
08-01 11:04:53.534 11532-11532/mil.navy.nrl.androidrobocontroller W/System: ClassLoader referenced unknown path: /data/app/mil.navy.nrl.androidrobocontroller-1/lib/arm
08-01 11:04:53.869 11532-11532/mil.navy.nrl.androidrobocontroller W/art: Before Android 4.1, method android.graphics.PorterDuffColorFilter android.support.graphics.drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffColorFilter, android.content.res.ColorStateList, android.graphics.PorterDuff$Mode) would have incorrectly overridden the package-private method in android.graphics.drawable.Drawable
08-01 11:04:54.057 11532-11574/mil.navy.nrl.androidrobocontroller D/OpenGLRenderer: Use EGL_SWAP_BEHAVIOR_PRESERVED: true
08-01 11:04:54.118 11532-11574/mil.navy.nrl.androidrobocontroller I/Adreno-EGL: <qeglDrvAPI_eglInitialize:379>: QUALCOMM Build: 10/21/15, 369a2ea, I96aee987eb
08-01 11:04:54.120 11532-11574/mil.navy.nrl.androidrobocontroller I/OpenGLRenderer: Initialized EGL, version 1.4
08-01 11:04:56.439 11532-11532/mil.navy.nrl.androidrobocontroller V/TrackActivity: Requested location
08-01 11:04:56.440 11532-11532/mil.navy.nrl.androidrobocontroller V/TrackActivity: Permission android.permission.ACCESS_FINE_LOCATION has been granted.
08-01 11:04:56.440 11532-11532/mil.navy.nrl.androidrobocontroller V/TrackActivity: Location updates requested
08-01 11:04:56.445 11532-11532/mil.navy.nrl.androidrobocontroller V/TrackActivity: Check checked and updated.
08-01 11:04:58.791 11532-11532/mil.navy.nrl.androidrobocontroller V/TrackActivity: Permission android.permission.ACCESS_FINE_LOCATION has been granted.
08-01 11:04:58.794 11532-11532/mil.navy.nrl.androidrobocontroller V/TrackActivity: Check unchecked and updated.
StartLocationUpdate

package com.example.app;

import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.SwitchCompat;
import android.util.Log;
import android.widget.EditText;
import android.widget.RelativeLayout;

import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnCheckedChanged;

public class TrackActivity extends AppCompatActivity implements LocationListener,
        ActivityCompat.OnRequestPermissionsResultCallback {

    private static final String LOG_TAG = "TrackActivity";
    private static final boolean SHOW_VERBOSE = true;
    private static final int REQUEST_FINE_LOCATION_UPDATE = 1;
    private static final int REQUEST_END_LOCATION_UPDATES = 2;

    protected LocationManager mLocationManager;

    private Location mBestLocation;

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

        // ButterKnife bind method. REQUIRED FOR ANNOTATIONS TO WORK.
        ButterKnife.bind(this);
    }

    @Override
    protected void onStart() {

        mLocationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);

        super.onStart();
    }

    @Override
    protected void onStop() {
        // startLocationUpdates(); <--- Made a typo here
        endLocationUpdates();
        super.onStop();
    }
protected void startLocationUpdates() {
    if (SHOW_VERBOSE) Log.v(LOG_TAG, "Requested location");

    if (checkRequestPermission(Manifest.permission.ACCESS_FINE_LOCATION, REQUEST_FINE_LOCATION_UPDATE)) {
        // TODO: Add high accuracy 1 Hz Location Updates

        if (SHOW_VERBOSE) Log.v(LOG_TAG, "Location updates requested");

        mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
        mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, this);
    }
}
protected void endLocationUpdates() {
    if (checkRequestPermission(
            Manifest.permission.ACCESS_FINE_LOCATION, REQUEST_END_LOCATION_UPDATES)) {
        mLocationManager.removeUpdates(this);
    }
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {

}

@Override
public void onProviderEnabled(String provider) {
    if(SHOW_VERBOSE) Log.v(LOG_TAG, "Provider enabled");
}

@Override
public void onProviderDisabled(String provider) {
    if(SHOW_VERBOSE) Log.v(LOG_TAG, "Provider disabled");
}
endLocationUpdate

package com.example.app;

import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.SwitchCompat;
import android.util.Log;
import android.widget.EditText;
import android.widget.RelativeLayout;

import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnCheckedChanged;

public class TrackActivity extends AppCompatActivity implements LocationListener,
        ActivityCompat.OnRequestPermissionsResultCallback {

    private static final String LOG_TAG = "TrackActivity";
    private static final boolean SHOW_VERBOSE = true;
    private static final int REQUEST_FINE_LOCATION_UPDATE = 1;
    private static final int REQUEST_END_LOCATION_UPDATES = 2;

    protected LocationManager mLocationManager;

    private Location mBestLocation;

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

        // ButterKnife bind method. REQUIRED FOR ANNOTATIONS TO WORK.
        ButterKnife.bind(this);
    }

    @Override
    protected void onStart() {

        mLocationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);

        super.onStart();
    }

    @Override
    protected void onStop() {
        // startLocationUpdates(); <--- Made a typo here
        endLocationUpdates();
        super.onStop();
    }
protected void startLocationUpdates() {
    if (SHOW_VERBOSE) Log.v(LOG_TAG, "Requested location");

    if (checkRequestPermission(Manifest.permission.ACCESS_FINE_LOCATION, REQUEST_FINE_LOCATION_UPDATE)) {
        // TODO: Add high accuracy 1 Hz Location Updates

        if (SHOW_VERBOSE) Log.v(LOG_TAG, "Location updates requested");

        mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
        mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, this);
    }
}
protected void endLocationUpdates() {
    if (checkRequestPermission(
            Manifest.permission.ACCESS_FINE_LOCATION, REQUEST_END_LOCATION_UPDATES)) {
        mLocationManager.removeUpdates(this);
    }
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {

}

@Override
public void onProviderEnabled(String provider) {
    if(SHOW_VERBOSE) Log.v(LOG_TAG, "Provider enabled");
}

@Override
public void onProviderDisabled(String provider) {
    if(SHOW_VERBOSE) Log.v(LOG_TAG, "Provider disabled");
}
检查请求权限

protected boolean checkRequestPermission(String permission, int requestCode) {
    int permissionCheck = ContextCompat.checkSelfPermission(this, permission);
    if(permissionCheck == PackageManager.PERMISSION_GRANTED) {
        if(SHOW_VERBOSE) Log.v(LOG_TAG, "Permission " + permission + " has been granted.");
        return true;
    } else {
        ActivityCompat.requestPermissions(this,
                new String[]{permission},
                requestCode);
    }

    return false;
}
onRequestPermissionsResult

@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
    switch (requestCode) {
        case REQUEST_FINE_LOCATION_ONCE:
            if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED)
                startLocationUpdates();
            break;
        case REQUEST_FINE_LOCATION_UPDATE:
            if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED)
                startLocationUpdates();
            break;
        case REQUEST_END_LOCATION_UPDATES:
            if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED)
                endLocationUpdates();
            break;
    }
}
onLocationChanged

@OnCheckedChanged(R.id.track_send_location_switch)
void onCheckChanged(boolean checked) {
    if (checked) {
        // Unrelated code cut.

        startLocationUpdates();

        if (SHOW_VERBOSE) Log.v(LOG_TAG, "Check checked and updated.");
    } else {
        endLocationUpdates();

        // Unrelated code cut

        if (SHOW_VERBOSE) Log.v(LOG_TAG, "Check unchecked and updated.");
    }
}
@Override
public void onLocationChanged(Location location) {
    if(SHOW_VERBOSE) Log.v(LOG_TAG, "Location request returned");

    Location locationToUse;

    if(isBetterLocation(location, mBestLocation)) {
        locationToUse = location;
        mBestLocation = location;
    } else {
        locationToUse = mBestLocation;
    }

    if(SHOW_VERBOSE) Log.v(LOG_TAG, "onLocationChanged()");

    // Rest of app's code is ommited.
    doThingWithLocation(locationToUse);
}
LocationListener方法

package com.example.app;

import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.SwitchCompat;
import android.util.Log;
import android.widget.EditText;
import android.widget.RelativeLayout;

import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnCheckedChanged;

public class TrackActivity extends AppCompatActivity implements LocationListener,
        ActivityCompat.OnRequestPermissionsResultCallback {

    private static final String LOG_TAG = "TrackActivity";
    private static final boolean SHOW_VERBOSE = true;
    private static final int REQUEST_FINE_LOCATION_UPDATE = 1;
    private static final int REQUEST_END_LOCATION_UPDATES = 2;

    protected LocationManager mLocationManager;

    private Location mBestLocation;

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

        // ButterKnife bind method. REQUIRED FOR ANNOTATIONS TO WORK.
        ButterKnife.bind(this);
    }

    @Override
    protected void onStart() {

        mLocationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);

        super.onStart();
    }

    @Override
    protected void onStop() {
        // startLocationUpdates(); <--- Made a typo here
        endLocationUpdates();
        super.onStop();
    }
protected void startLocationUpdates() {
    if (SHOW_VERBOSE) Log.v(LOG_TAG, "Requested location");

    if (checkRequestPermission(Manifest.permission.ACCESS_FINE_LOCATION, REQUEST_FINE_LOCATION_UPDATE)) {
        // TODO: Add high accuracy 1 Hz Location Updates

        if (SHOW_VERBOSE) Log.v(LOG_TAG, "Location updates requested");

        mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
        mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, this);
    }
}
protected void endLocationUpdates() {
    if (checkRequestPermission(
            Manifest.permission.ACCESS_FINE_LOCATION, REQUEST_END_LOCATION_UPDATES)) {
        mLocationManager.removeUpdates(this);
    }
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {

}

@Override
public void onProviderEnabled(String provider) {
    if(SHOW_VERBOSE) Log.v(LOG_TAG, "Provider enabled");
}

@Override
public void onProviderDisabled(String provider) {
    if(SHOW_VERBOSE) Log.v(LOG_TAG, "Provider disabled");
}
定位策略指南中的方法

protected boolean isBetterLocation(Location location, Location currentBestLocation) {
    if(currentBestLocation == null)
        return true;

    long timeDelta = location.getTime() - currentBestLocation.getTime();
    boolean isSignificantlyNewer = timeDelta > 10000;
    boolean isSignificantlyOlder = timeDelta < -10000;
    boolean isNewer = timeDelta > 0;

    if (isSignificantlyNewer) {
        return true;
        // If the new location is more than two minutes older, it must be worse
    } else if (isSignificantlyOlder) {
        return false;
    }

    // Check whether the new location fix is more or less accurate
    int accuracyDelta = (int) (location.getAccuracy() - currentBestLocation.getAccuracy());
    boolean isLessAccurate = accuracyDelta > 0;
    boolean isMoreAccurate = accuracyDelta < 0;
    boolean isSignificantlyLessAccurate = accuracyDelta > 200;

    // Check if the old and new location are from the same provider
    boolean isFromSameProvider = isSameProvider(location.getProvider(),
            currentBestLocation.getProvider());

    // Determine location quality using a combination of timeliness and accuracy
    if (isMoreAccurate) {
        return true;
    } else if (isNewer && !isLessAccurate) {
        return true;
    } else if (isNewer && !isSignificantlyLessAccurate && isFromSameProvider) {
        return true;
    }
    return false;
}

/** Checks whether two providers are the same */
private boolean isSameProvider(String provider1, String provider2) {
    if (provider1 == null) {
        return provider2 == null;
    }
    return provider1.equals(provider2);
}
受保护的布尔值isBetterLocation(位置-位置,位置-当前最佳位置){
如果(currentBestLocation==null)
返回true;
long-timeDelta=location.getTime()-currentBestLocation.getTime();
布尔值isSignificantlyNewer=timeDelta>10000;
布尔值Issignificantlolder=timeDelta<-10000;
布尔值isNewer=timeDelta>0;
如果(非常重要){
返回true;
//如果新位置比原来的位置早两分钟以上,情况肯定会更糟
}else if(Issignificantlolder){
返回false;
}
//检查新的位置修复是否更精确
int accuracyDelta=(int)(location.getAccuracy()-currentBestLocation.getAccuracy());
布尔值IslesAccurate=accuracyDelta>0;
布尔值IsmorePrecision=精度偏差<0;
布尔值不太精确=精度偏差>200;
//检查新旧位置是否来自同一提供商
布尔值isFromSameProvider=isSameProvider(location.getProvider(),
currentBestLocation.getProvider());
//结合及时性和准确性确定定位质量
如果(更准确){
返回true;
}else if(isNewer&!islesAccurate){
返回true;
}else if(较新且不太准确且来自SameProvider){
返回true;
}
返回false;
}
/**检查两个提供程序是否相同*/
专用布尔值isSameProvider(字符串提供程序1、字符串提供程序2){
if(provider1==null){
返回provider2==null;
}
返回provider1.equals(provider2);
}
AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.app">

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

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name="com.example.app.TrackActivity"
            android:windowSoftInputMode="stateHidden">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <action android:name=".TrackActivity" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>


任何帮助都将不胜感激!谢谢

结果是我没有很好的GPS信号,这就是导致我出现问题的原因。我以为我坐在窗户旁边很好,但连接到GPS要花很长时间(@cYrixmorten建议超过15分钟)。如果有足够的时间,它可以连接到GPS,但我发现,一旦我走到外面,它几乎可以立即连接


如果有人需要测试GPS服务,我使用了GPS测试应用程序。

您等了多久?离线既可以防止网络定位(那么你怎么会在代码中请求它呢?)也可以防止A-GPS。导致GPS有时似乎需要很长时间才能锁定,尤其是在一段时间内没有使用GPS的情况下。我会说,要么让我连接到互联网再试一次,要么让它请求GPS至少15分钟,看看会发生什么。当然,最好在设备和晴朗的天空之间设置尽可能少的障碍物。我试着让它保持15分钟,但什么也没发生。但我确实注意到,前几天我在onStop()中意外启动更新时,将其单独放置了一个小时。然后它收到了更新。再过两个小时就不行了。谢谢!我很惊讶,因为通常我在里面至少能得到一些信号。