проблема: LocationListener / onProviderDisabled = true, когда устройство выключает экран
- проблема возникает только в SDK 28.
-SDK <28 без проблем . </p>
- мобильный телефон с выключенным экраном и подключенным к Android Studio USB, без проблем.
- для проверки я создал mediaPlayer.setLooping (true) ... он не останавливается даже при выключенном экране.
- при включении экрана автоматически onProviderEnabled = true.
- Мне нужно каждую минуту отслеживать местоположение доставщика мотоцикла.
build.gradle
android {
compileSdkVersion 29
buildToolsVersion "29.0.3"
defaultConfig {
applicationId "br.com.yyyy.yyyyyyyy"
minSdkVersion 17
targetSdkVersion 29
versionCode 12
versionName "2.1.2"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
AndroidManifest. xml
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<application
...
<service
android:name=".BackgroundService"
android:foregroundServiceType="location"/>
...
BackgroundService. java
public class BackgroundServiceextends Service {
private final int LOCATION_INTERVAL = 60*1000;
private final int LOCATION_DISTANCE = 100;
@Override
public void onCreate() {
super.onCreate();
createNotificationChannel();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
mediaPlayer = MediaPlayer.create(this, Settings.System.DEFAULT_ALARM_ALERT_URI);
mediaPlayer.setLooping(true);
mediaPlayer.start();
initializeLocationManager();
mLocationListener = new LocationListener(LocationManager.GPS_PROVIDER);
try {
mLocationManager.requestLocationUpdates( LocationManager.GPS_PROVIDER, LOCATION_INTERVAL, LOCATION_DISTANCE, mLocationListener );
} catch (java.lang.SecurityException ex) {
// Log.i(TAG, "fail to request location update, ignore", ex);
} catch (IllegalArgumentException ex) {
// Log.i(TAG, "gps provider does not exist " + ex.getMessage());
}
startForeground(123456, getNotification());
return START_NOT_STICKY;
}
@Override
public void onDestroy() {
mediaPlayer.stop();
super.onDestroy();
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
private void createNotificationChannel() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel serviceChannel = new NotificationChannel(
Apoio.CHANNEL_ID_BACKGROUNDSERVICE,
"Em Atividade",
NotificationManager.IMPORTANCE_MAX
);
NotificationManager manager = getSystemService(NotificationManager.class);
manager.createNotificationChannel(serviceChannel);
}
}
private Notification getNotification() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
Notification.Builder builder = new Notification.Builder(getApplicationContext(),Apoio.CHANNEL_ID_BACKGROUNDSERVICE)
.setSmallIcon(R.drawable.ic_action_name)
.setContentTitle("YYYYY")
.setContentText("Em atividade!")
.setAutoCancel(true);
PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
new Intent(this, MainActivity.class), PendingIntent.FLAG_UPDATE_CURRENT);
builder.setContentIntent(contentIntent);
return builder.build();
}else {
Notification.Builder builder = new Notification.Builder(this)
.setSmallIcon(R.drawable.ic_action_name)
.setContentTitle("YYYYY")
.setContentText("Em atividade!")
.setAutoCancel(true);
//.setPriority(NotificationCompat.PRIORITY_MAX)
PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
new Intent(this, MainActivity.class), PendingIntent.FLAG_UPDATE_CURRENT);
builder.setContentIntent(contentIntent);
return builder.build();
}
}
private void initializeLocationManager() {
if (mLocationManager == null) {
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
mLocationManager = (LocationManager) getApplicationContext().getSystemService(Context.LOCATION_SERVICE);
}else{
Log.i(TAG, "initializeLocationManager: PERMISSAO OFF");
}
}
}
private class LocationListener implements android.location.LocationListener {
private final String TAG = "infoo LocationListener";
public LocationListener(String provider) {
Log.i(TAG, "LocationListener: mLastLocation=" + provider);
}
@Override
public void onLocationChanged(Location location) {
Log.i(TAG, "LocationChanged: "+location);
String vString = "location OK";
sendFirebase(vString);
}
@Override
public void onProviderDisabled(String provider) {
String vString = "onProviderDisabled: " + provider;
Log.i(TAG, vString);
sendFirebase(vString);
}
@Override
public void onProviderEnabled(String provider){
String vString = "onProviderEnabled: " + provider;
Log.i(TAG, vString );
sendFirebase(vString);
}
}
}
requestPermissions
....
if (Build.VERSION.SDK_INT >= 29 ){
permissoes = new String[]{
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_BACKGROUND_LOCATION,
Manifest.permission.WRITE_EXTERNAL_STORAGE
};
}else{
permissoes = new String[]{
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.WRITE_EXTERNAL_STORAGE
};
}
......
ActivityCompat.requestPermissions(activity, permissoes , requestCode);
......
MainActivity. java
Intent serviceIntent = new Intent(this, BackgroundService.class);
ContextCompat.startForegroundService(this, serviceIntent);