Android - LocationListener / onProviderDisabled ...... когда устройство выключает экран, SDK = 28 - PullRequest
0 голосов

проблема: 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);
...