Architecture en couches de positionnement d'Android

L'architecture système du service de positionnement GPS Android est divisée en six couches
 : couche d'application, couche de structure du système, couche JNI, couche HAL, couche du noyau Linux et couche du périphérique matériel GPS.
Ce sont des dépendances couche par couche de haut en bas, et chaque couche dépend de la couche suivante pour compléter les services qu'elle doit fournir.
[Processus de localisation récapitulatif] : l'application de la couche d'application lance une demande de localisation et appelle l'interface API fournie par la couche Framework. À ce stade, un fil de service de localisation sera lancé. Par le biais du service de localisation LocationManagerService, le fournisseur de localisation correspondant sera appelé. , puis via la méthode native Appelée à JNI, JNI obtient GpsInterface et la transmet à l'implémentation d'une fonction de rappel de l'interface. GpsInterface est la principale implémentation de la couche HAL.

La couche supérieure est la couche d'application, qui peut installer des applications basées sur des services de localisation, et ces applications peuvent initier des demandes de localisation, telles que Baidu Maps.

La deuxième couche est la couche framework (framework layer), qui comprend l'API appelée par l'APP et l'implémentation des services système, principalement implémentés par le langage Java.
a. L'API implémentée en langage Java, c'est-à-dire le contenu du package android.location, est principalement utilisée pour être appelée par APP Directory
 : frameworks/base/location/java/android/location
b. System service implementation
directory 1 : frameworks/base/location/ Le répertoire java/com/android/internal/location
est l'implémentation interne du service Location par le Framework Directory 2 : LocationManagerService.java dans le
framework\base\services\core\java\com\android\ répertoire du serveur est l'implémentation interne du service de localisation
un package de

Il n'y a qu'un seul fichier dans la couche JNI, qui sert de lien entre le précédent et le suivant. La couche supérieure entreprend le Framework et la couche inférieure appelle la couche HAL pour implémenter l'abstraction matérielle spécifique.
Répertoire :
frameworks/base/services/core/jni/com_android_server_location_GpsLocationProvider.cpp

La quatrième couche est la couche bibliothèque partagée (couche HAL).Cette couche est implémentée par les langages C et C++.La couche cadre et la couche bibliothèque partagée utilisent JNI pour se connecter. La couche HAL équivaut à une interface de programme d'application Linux, qui exploite des périphériques matériels via des opérations telles que l'ouverture et la fermeture.
Répertoire :
hardware/qcom/gps
hardware/libhardware/include/hardware/gps.h

La cinquième couche est la couche du noyau Linux et l'ensemble du système Android est basé sur le noyau Linux.

La couche inférieure est la couche de périphérique matériel GPS

Déterminez si l'application a obtenu l'autorisation de localisation

checkPermissionGranted(Manifest.permission.ACCESS_COARSE_LOCATION)
private boolean checkPermissionGranted(String permission) {
    
    
     return this.checkPermission(permission, Process.myPid(), Process.myUid()) == PackageManager.PERMISSION_GRANTED;
}

Méthode 2
Dans le système Android avec API>=23 (6.0), vous pouvez utiliser

ActivityCompat.checkSelfPermission(this,Manifest.permission.ACCESS_FINE_LOCATION)

méthode trois

PackageManager pkgMgr = getPackageManager();
return pkgMgr.checkPermission(permission, getPackageName()) == PackageManager.PERMISSION_GRANTED;

Les méthodes 1 et 3 renvoient toujours true lorsque l'application targetSdkVerison<23, que l'application soit autorisée ou non. Si vous souhaitez l'utiliser normalement lorsque API<23, il est recommandé d'utiliser la méthode suivante 4


Méthode 4 La méthode PermissionChecker.checkPermission(this, permission, Process.myPid(), Process.myUid(), getPackageName()) == PackageManager.PERMISSION_GRANTED fournie par le système ;
cette méthode peut être utilisée avant et après 23, mais elle est préférable de faire un jugement de version, lorsqu'il est supérieur ou égal à 23, utilisez ActivityCompat.checkSelfPermission() et d'autres méthodes 4

Mode de localisation dans Android

GPS, Wi-Fi et réseaux mobiles Wi-Fi et réseaux mobiles utiliser uniquement le GPS
caractéristiques En utilisant le GPS, le WIFI et le positionnement de la station de base en même temps, la vitesse est rapide, la précision est élevée et l'effet de positionnement à l'intérieur est bon. Inconvénients : consommation de trafic, consommation électrique Utilisez uniquement le positionnement du WIFI et de la station de base, le WIFI ou la station de base est requis et l'effet intérieur est bon. Inconvénients : se fier au WIFI ou à la station de base, la précision est moyenne Ne repose pas sur le WIFI et les stations de base, l'effet intérieur est médiocre et la fiabilité extérieure est bonne. Inconvénients : mauvais effet intérieur
condition LocationManager.GPS_PROVIDER = vrai; LocationManager.NETWORK_PROVIDER = vrai ; LocationManager.GPS_PROVIDER = faux; LocationManager.NETWORK_PROVIDER = vrai ; LocationManager.GPS_PROVIDER = vrai; LocationManager.NETWORK_PROVIDER = faux ;
Que ce soit pour ouvrir les services de localisation Paramètres.Secure.LOCATION_MODE = 3 Paramètres.Secure.LOCATION_MODE = 2 Paramètres.Secure.LOCATION_MODE = 1

Remarque : Le jugement conditionnel ci-dessus fait référence à

1 Log.e("David", "GPS是否打开 " + locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER));
2 Log.e("David", "网络定位是否打开 " + locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER));

Déterminer l'état de positionnement de l'appareil dans Android

Méthode 1
Utilisez locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) et locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER),
si l'un renvoie true, cela signifie que le service de localisation du système est activé.

boolean flag = false;  
LocationManager locationManager =
        (LocationManager) getSystemService(Context.LOCATION_SERVICE);  
        // 通过GPS卫星定位  
Boolean gps = 
    locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);  
        // GPS辅助定位,AGPS,借助网络  
boolean network = 
locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);  
if (gps || network) {
    
      
        flag = true;  
} 

Méthode 2
Lorsque l'API est supérieure ou égale à 19, le locationMode renvoyé est étroitement lié au choix de l'utilisateur
Lorsque le service de localisation est désactivé, Settings.Secure.LOCATION_MODE = 0
Lorsque seul le positionnement réseau est utilisé, Settings.Secure. LOCATION_MODE = 1
Lorsque seul le positionnement GPS est utilisé, Settings.Secure.LOCATION_MODE = 2
Lors de l'utilisation du réseau et du positionnement GPS, Settings.Secure.LOCATION_MODE = 3

public boolean isLocationEnabled() {
    
    
    int locationMode = 0;
    String locationProviders;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    
    
        try {
    
    
            locationMode = Settings.Secure.getInt(getContentResolver(), Settings.Secure.LOCATION_MODE);
        } catch (Settings.SettingNotFoundException e) {
    
    
            e.printStackTrace();
            return false;
        }
        return locationMode != Settings.Secure.LOCATION_MODE_OFF;
    } else {
    
    
        locationProviders = Settings.Secure.getString(getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED);
        return !TextUtils.isEmpty(locationProviders);
    }
}

Aller à la page Définir le type de ciblage

Aller à la page Définir le type de ciblage

Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);  
startActivity(intent);  

GPS :
le niveau de positionnement peut être précis dans la rue (grâce au positionnement 24 satellites, le positionnement est précis et rapide dans les lieux extérieurs et ouverts)

AGPS :
La position déterminée par WLAN ou réseau mobile (3G/2G) (également appelée AGPS, positionnement GPS assisté. Elle
est principalement utilisée pour le positionnement à l'intérieur ou dans des endroits avec des abris denses (bâtiments ou forêts denses, etc.))

Je suppose que tu aimes

Origine blog.csdn.net/Jun_P/article/details/127036765
conseillé
Classement