IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

Utilisation du GPS en arrière plan.


Sujet :

Android

  1. #1
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut Utilisation du GPS en arrière plan.
    Dans l'application GPS que je développe, je souhaite que mon GPS continue à me délivrer ses informations même si l'application n'est plus au premier plan.

    Mais j'ai l'impression que je ne reçois plus ses informations quand mon application passe au second plan.

    Mon smartphone est un Samsung A41 avec android 10.

    Pourtant, je pense que j'ai fait ce qu'il faut. Voici ce que j'ai fait :

    Dans le fichier "build.gradle (Module GPSNav.app) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    apply plugin: 'com.android.application'
     
    android {
        compileSdkVersion 29
        buildToolsVersion "29.0.3"
     
        defaultConfig {
            applicationId "com.example.gpsnav"
            minSdkVersion 23
            targetSdkVersion 29
        }
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            }
        }
    }
     
    dependencies {
        //noinspection GradleCompatible
        implementation 'com.android.support:support-v4:24.2.1'
    }
    Dans le fichier "androidManifest.xml" j'ai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
        <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
        <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />"
    Dans mon application, j'ai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    private static final int PERMISSION_REQUEST_GPS = 100;
     
    ...
     
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_BACKGROUND_LOCATION) != PackageManager.PERMISSION_GRANTED
    && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED
    && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
    	ActivityCompat.requestPermissions(Main.this, new String[]{
    		Manifest.permission.ACCESS_BACKGROUND_LOCATION,
    		Manifest.permission.ACCESS_COARSE_LOCATION,
    		Manifest.permission.ACCESS_FINE_LOCATION}, PERMISSION_REQUEST_GPS);
    		return;
    	}
     
    ... 
     
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    	if (requestCode == PERMISSION_REQUEST_GPS) {
    		if (grantResults[0] == PackageManager.PERMISSION_DENIED) { // Ferme l'application
    			Toast.makeText(Main.this, "Désolé !!! vous ne pouvez pas utiliser cette application sans permission", Toast.LENGTH_LONG).show();
    			finish();
    		}
    	}
    }
    Apparemment, ça ne suffit pas.

    Que faut-il faire ?

    Cordialement.

    Pierre.

  2. #2
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut
    En farfouillant sur la toile, j'ai vu qu'il fallait que j'utilise "les services".

    J'ai modifiée mon application en ce sens : elle fonctionne à l'identique, c'est déjà pas mal.

    Si j'utilise la commande "startForegroundService", ça plante au bout de quelques secondes (ce qui, compte tenu des explications sur cette commande semblerait normal vu que je n'ai pas utilisé de notification).

    L'erreur est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    E/AndroidRuntime: FATAL EXCEPTION: main
        Process: com.example.gpsnav, PID: 8027
        android.app.RemoteServiceException: Context.startForegroundService() did not then call Service.startForeground(): ServiceRecord{d56b198 u0 com.example.gpsnav/.Navig.ServiceGPS}
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2188)
            at android.os.Handler.dispatchMessage(Handler.java:107)
            at android.os.Looper.loop(Looper.java:237)
    Pour autant, plus je lis d'informations la-dessus, plus c'est fouillis dans ma tête. Je me demande du coup si mon cas relève du foreground ou du background.

    Ce que je souhaite obtenir : outre avoir les informations du GPS quand mon application est au premier plan, je souhaite que ces données continuent a être reçues quand, par exemple, j'utilise l'appareil photo et que mon application disparaît de l'écran.

    Suis-je alors dans le cas du :

    • foreground (où je comprends que c'est le GPS qui doit rester au premier plan pour toujours être actif) ;
    • ou du background (où je comprends que mon application, passée au second plan doit rester active) ?

    Cordialement.

    Pierre.

  3. #3
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut
    J'essaie de m'engager dans la voie "foreground".

    Je tombe sur un nouveau problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    E/AndroidRuntime: FATAL EXCEPTION: main
        Process: com.example.gpsnav, PID: 1984
        android.app.RemoteServiceException: Bad notification for startForeground
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2188)
            at android.os.Handler.dispatchMessage(Handler.java:107)
            at android.os.Looper.loop(Looper.java:237)
    Cette fois, c'est " Bad notification for startForeground" sans autre explication.

    J'ai essayé plusieurs propositions trouvées sur la toile et toutes me provoque cette erreur. Voici la dernière que j'ai essayée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
        private void startMyOwnForeground(){
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
     
                String NOTIFICATION_CHANNEL_ID = "com.example.simpleapp";
                String channelName = "My Background Service";
                NotificationChannel chan = new NotificationChannel(NOTIFICATION_CHANNEL_ID, channelName, NotificationManager.IMPORTANCE_NONE);
                chan.setLightColor(Color.BLUE);
                chan.setLockscreenVisibility(Notification.VISIBILITY_PRIVATE);
                NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
                assert manager != null;
                manager.createNotificationChannel(chan);
     
                NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this);
                Notification notification = notificationBuilder.setOngoing(true)
                        .setSmallIcon(R.drawable.ic_launcher)
                        .setContentTitle("App is running in background")
                        .setPriority(NotificationManager.IMPORTANCE_MIN)
                        .setCategory(Notification.CATEGORY_SERVICE)
                        .build();
                startForeground(2, notification);
            }
        }
    Est-ce que l'erreur obtenue viendrait de ceci :

    Dans tous les exemples que j'ai essayés, j'ai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this, UNE_CONSTANTE);
    or pour que cela compile, je dois ôter cette constante et écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this);
    D'où vient ce problème ? Je compile avec la version 29 (Q) comme objectif et la 23 (M) comme mini.

    Dans la doc de "NotificationCompat.Builder", on parle bien de deux paramètres.

    Je ne vois pas ce qui cloche.

    Cordialement.

    Pierre

  4. #4
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut
    C"est bien la méthode impliquant les services qui permet de garder le GPS actif même si l'application n'est plus en premier plan.

    J'ai finalement trouvé pourquoi cela ne fonctionnait pas. C'était bien lié au fait que je n'avais qu'un paramètre à donner dans le "NotificationCompat.Builder".

    En cherchant la doc sur les notifications, j'ai vu qu'il fallait avoir cette dépendance dans le fichier "build.gradle" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    dependencies {
        implementation "com.android.support:support-compat:28.0.0"
    }
    Je ne l'avais pas. J'ai remplacé celle que j'avais par celle indiquée et cette fois, j'ai pu placer les deux paramètres voulus et ... je n'ai plus eu d'erreur.

    Cette après-midi, j'ai fait une rando avec mon application que j'ai interrompue plusieurs fois avec "PlantNet", "birdNET", cette dernière application utilisant elle aussi le GPS : aucun problème de fonctionnement et d'enregistrement de trace avec mon application.

    Cordialement.

    Pierre.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Positionnement GPS en arrière plan
    Par Filmarket dans le forum Android
    Réponses: 2
    Dernier message: 19/02/2020, 19h13
  2. utiliser une image d'arrière plan
    Par alphonse62 dans le forum Interfaces Graphiques en Java
    Réponses: 3
    Dernier message: 24/05/2007, 15h20
  3. utiliser une image d'arrière plan
    Par alphonse62 dans le forum Interfaces Graphiques en Java
    Réponses: 3
    Dernier message: 24/05/2007, 10h37
  4. Impossible d'avoir un arrière plan en utilisant CSS
    Par Tartenpion dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 21/06/2005, 14h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo