Bonjour a tous,

Merci d'avance de votre aide, je suis certain que c'est un paramètre que je n'arrive pas à trouver et dans les tutos que j'ai utilisé cela ne correspond pas à mon besoin (où j'ai raté qq chose)

J'ai créé un site (https://natuw-dev.fr), où à un moment donné je demande la géolocalisation.
Mon besoin est: Quand la personne à décidé de dire OUI à la géolocalisation de connaitre sa position maintenant (1 seule fois ou 1 requête), j'ai pas besoin de la suivre en permanence comme un GPS.

Nom : geo.jpg
Affichages : 106
Taille : 92,2 Ko

HTML par le PHP
Code : Sélectionner tout - Visualiser dans une fenêtre à part
echo '<span id="geo_oui"  >'.$svg_oui.'</span>';
Javascript
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
 
if (document.getElementById("geo_oui")){
	var envoie1=document.getElementById("jsenvoiegeooui_accueil").value;	
	document.getElementById("geo_oui").addEventListener("click", (function(envoie1) {
			return function() {	geo_actu(envoie1);};
	})( envoie1 ));		
}
 
function geo_actu(envoie1){ 
	    navigator.geolocation.getCurrentPosition(successHandler, errorHandler,{enableHighAccuracy:false,maximumAge:10000, timeout:4000});
}
 
function successHandler(position)  {		
		var suite="oui";
		if( typeof(position.coords.latitude) == 'undefined' ){
			suite="non";
		}else{
			if(isNaN(position.coords.latitude) == true){suite="non";}
		}
		if( typeof(position.coords.longitude) == 'undefined' ){
			suite="non";
		}else{
			if(isNaN(position.coords.longitude) == true){suite="non";}
		}
		if (suite=="non"){
			geo_actu();
		}else{
					var value_pos=position.coords.latitude+','+position.coords.longitude;
					console.log(value_pos);//suite du programme
		}	
}
// Error Handler
function errorHandler(positionError)  {   
   if(positionError.code == 1) { // PERMISSION_DENIED
       alert("Error: Permission Denied! " + positionError.message);
   } else if(positionError.code == 2) { // POSITION_UNAVAILABLE
       //alert("Error: Position Unavailable! " + positionError.message);
	   geo_actu();
   } else if(positionError.code == 3) { // TIMEOUT
       //alert("Error: Timeout!" + positionError.message);
	   geo_actu();
   }
}

//au niveau de l'android.
1/webviewer =>ça marche.
2/les cookies =>ça marche aussi.
3/géolocalisation=>partiellement
J'ai 2 buggs au niveau de la géolocalisation=> je pense que c'est lié aux permissions mais pas moyen, je n'y arrive pas (vraiment désolé).

le fichier AndroidManifest.xml
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
27
28
29
30
31
32
 
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_GPS" />
    <uses-permission android:name="android.permission.ACCESS_ASSISTED_GPS" />
    <uses-permission android:name="android.permission.ACCESS_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
    <application
        android:hardwareAccelerated="true"
        android:allowBackup="true"
        android:dataExtractionRules="@xml/data_extraction_rules"
        android:fullBackupContent="@xml/backup_rules"
        android:icon="@drawable/logo_192"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/Theme.Natuw_dev"
        android:usesCleartextTraffic="true"
        tools:targetApi="31">
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
 
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>
1er/question
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 
<uses-permission android:name="android.permission.ACCESS_GPS" />
<uses-permission android:name="android.permission.ACCESS_ASSISTED_GPS" />
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
Est-ce utile de laisser ces 3lignes? (c'est en suivant des tutos mais ce ne suis pas sur que cela soit utile pour mon projet ?
et je pense que je n'ai pas besoin ACCESS_BACKGROUND_LOCATION de chercher la localisation en arrière plan?
Merci de votre réponse.





MainActivity.java (j'ai laissé uniquement ce qui est bon, j'ai retiré tous les commentaires de tests que j'ai fait notamment sur les permissions ex:checkSelfPermission )
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
 
package fr.pack.natuw_dev;
 
import androidx.appcompat.app.AppCompatActivity;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import androidx.core.app.ActivityCompat;
import android.webkit.WebView;
import android.view.WindowManager;
import android.webkit.CookieManager;
import android.webkit.GeolocationPermissions;
import android.webkit.WebChromeClient;
import android.Manifest;
 
 
public class MainActivity extends AppCompatActivity {
 
    WebView myWeb;    
    private static final int REQUEST_PERMISSIONS_REQUEST_CODE=1;
 
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
 
        super.onCreate(savedInstanceState);
        // If the Android version is lower than Jellybean, use this call to hide
        // the status bar.
            getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                    WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setContentView(R.layout.activity_main);
 
 
        myWeb = findViewById(R.id.myWeb);
 
        myWeb.getSettings().setJavaScriptEnabled(true);//autorisation java
        myWeb.getSettings().setUseWideViewPort(true);//plein ecran
        myWeb.getSettings().setLoadWithOverviewMode(true);//plein ecran       
 
        myWeb.getSettings().setGeolocationEnabled(true);
        myWeb.getSettings().setSupportZoom(true);
        myWeb.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
 
 
        myWeb.setWebChromeClient(new WebChromeClient() {
 
            @Override
            public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback) {
 
                ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.ACCESS_FINE_LOCATION},REQUEST_PERMISSIONS_REQUEST_CODE);
				callback.invoke(origin, true, false);
 
            }      
 
        });
 
        myWeb.loadUrl("https://natuw-dev.fr");
 
        if (Build.VERSION.SDK_INT >= 21) {
            CookieManager.getInstance().setAcceptThirdPartyCookies(myWeb, true);
        } else {
            CookieManager.getInstance().setAcceptCookie(true);
		}   
 
    }
    @Override
    protected void onPause() {        
        CookieManager.getInstance().flush();
        super.onPause();
    }
 
    @Override
    protected void onResume() {       
        CookieManager.getInstance().flush();
        super.onResume();
    }
 
    @Override
    protected void onDestroy() {        
        CookieManager.getInstance().flush();
        super.onDestroy();
    }
    @Override
    protected void onStop() {       
        CookieManager.getInstance().flush();
        super.onStop();
    }
 
}

2eme/questions et 1erbugg
L'idéal pour moi, c'est quand la personne clique sur le mot OUI, si il n'y a pas de permission ou c'est NON,=>on propose cet écran.
j'ai bien l'écran au bon moment grâce à ces 2lignes et le "public void onGeolocationPermissionsShowPrompt "
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.ACCESS_FINE_LOCATION},REQUEST_PERMISSIONS_REQUEST_CODE);
callback.invoke(origin, true, false);
Si la personne clique sur 1fois ou toujours autorisé=>le javascript ne fais pas la suite je pense par rapport au prompt, qui est déjà activé?
Comment corrigé cette erreur?
coté android?=>avec par exemple: qq chose qui se lance avant le prompt?
coté javascript?par exemple en relançant la fonction ?
PS important: Si j'ai cliqué sur 1fois ou toujours et que je reviens dessus (une 2ème fois), la géolocalisation marche nickel!

Nom : geo2.jpg
Affichages : 101
Taille : 67,8 Ko
pas de suite de recherche (javascript) => ni en success et ni en erreur => je suis dans un écran vide.
Nom : geo3.jpg
Affichages : 101
Taille : 52,0 Ko




3eme/questions et 2èmebugg (le plus important pour moi)
Si la personne à cliqué 2 fois sur don't allow (ne permet pas)=> si j'ai un peu compris les tutos cela est stocké dans les permissions.
et impossible de reafficher l'écran de localisation après.

Donc si la personne à cliqué sur OUI la géolocalisation(du site), puis après elle fait 2 fois don't allow (je sais c'est un peu idiot) mais la personne ne pourra plus jamais avoir le choix de la géolocalisation.
=>elle ne pourra jamais utiliser la géolocalisation même en cliquand sur le mot OUI du site (puisque l'écran de permission ne s'affiche plus)
J'ai essayé pleins de tuto sur les permissions, des commentaires partout mais rien fonctionne pour avoir l'écran de géolocalisation (en fonction du besoin)
J'ai même cru comprendre qu'il fallait recréer son écran soi-même avec un build (je suis débutant en android et java) c'est pour le moment un niveau au dessus de moi.


J'ai besoin de qq chose de simple.
Si la personne à cliqué sur OUI.
s'il n'y a pas de permission ou la permission est sur don't allow=> ecran affichage pour demander l'autorisation
si la personne clique sur:
-1fois ou toujours=> fonctionnement direct de la position ou elle se situe (javascript).
-ne permet pas=> pas de géo=> pas grave, car au bout de 5s je propose écran d'échappatoire en cas de bugg de géo =>donc la personne peut surfer ailleurs.
Si la permission est sur 1fois ou toujours=> geolocalisation direct.


Vraiment désolé de ce post, c'est un sujet qui revient régulièrement (j'ai vue pleins de tutos)=> mais je suis vraiment bloqué sur ce bugg N°2.


Encore merci de votre aide, ou de vos idées.

Cordialement

David LECUYER