将应用程序置于后台并关闭华为MyA-L22的屏幕时,GPS位置更新将停止更新

时间:2018-12-24 14:04:08

标签: android service location huawei

我有一个带有前台服务的android应用程序,用于侦听gps位置更新,我仅将LocationManager与gps提供程序一起使用。

我有这段代码:

        Intent intent = new Intent(this, LocationUpdateReceiver.class);

        PendingIntent pi = PendingIntent.getBroadcast(this, 0, intent,
                PendingIntent.FLAG_UPDATE_CURRENT);

        this.locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, this.INTERVAL, 0.0f, pi);

我正在通过接收器获取位置更新。屏幕打开时,它可以正常工作,但是当我关闭设备屏幕时,它将停止获取位置更新。它可以在我的redmi 5设备上运行,并且按预期运行。但是我的问题是关于华为的。

注意: this.INTERVAL = 10000; 我正在使用唤醒锁定来防止设备进入休眠状态,如下所示:

    PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
    PowerManager.WakeLock wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "TAG:");
    wakeLock.aquire();

我在Manifist.xml中的服务也是这样

          <service android:name="com.arttech.services.LocationService" android:enabled="true" />

最后,我正在显示有关前台服务的通知,如下所示:

    Notification.Builder ongoing = new Notification.Builder(getBaseContext()).setSmallIcon(R.drawable.logo).setContentTitle("Location Service").setOngoing(true);
    if (Build.VERSION.SDK_INT >= 26) {
        ongoing.setChannelId("myChannelID");

    }
    notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

    notificationManager.notify(NOTIFICATIONID, ongoing.build());     

有人可以帮助我解决这个问题吗?我奋斗了一个多月,却一无所获。

谢谢

更新:

我也尝试通过电池设置手动将我的应用添加为受保护的应用,但是我得到了相同的行为。我测试了一个名为relive的应用程序,它完美记录了GPS位置。我在做什么错了?

更新: 这是我的OnStartCommand代码:

@Override
public int onStartCommand(Intent intent, int flags, int startId) {

    Log.d("omar","Service Started");
    LocationObserver.getInstance().addObserver(this);


    int SDK_INT = android.os.Build.VERSION.SDK_INT;
    if (SDK_INT > 8)
    {
        Log.d("omar_build",SDK_INT+"");

        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
                .permitAll().build();
        StrictMode.setThreadPolicy(policy);


    }

    CreateConnectionInstance(); // Connect to socket

    startTracking();
    isLocationServiceRunning = true;

    return START_STICKY;
}

2 个答案:

答案 0 :(得分:0)

这可能是由于华为等定制品牌施加了限制。您应该将应用添加到手机白名单中。请检查以下链接How to WhiteList app in Doze mode Android 6.0

更新: 进行这两个更改,然后检查

  1. 将唤醒锁获取到onStartCommand
  2. 大约需要时间获取唤醒锁
  3. 在服务销毁或服务工作完成时释放唤醒锁
logging.pattern.console=<custom pattern>

答案 1 :(得分:0)

也许这可以从通用软件中帮助您

https://commonsware.com/blog/2015/11/18/another-doze-edge-case-foreground.html

  

带有部分WakeLock的前台服务应该阻止打ze模式,大概是着眼于音乐播放器等。但是,Nalevka先生discovered认为,如果具有前台服务的进程也具有前台活动,则打ze模式将再次接管。

     

Dianne Hackborn建议的解决方法是拆分前景   服务到一个单独的过程中。由于似乎没有   链接到特定的Google+评论的方法,您需要向下滚动   评论列表on this post进行交流。