2017-06-09 1 views
0

voici mon problème:Android: ne peut pas obtenir l'emplacement par WIFI sur Android TV

Je le code (de cette tuto):

public Location getLocation(Context act) { 
    try { 
     locationManager = (LocationManager) mContext 
       .getSystemService(LOCATION_SERVICE); 

     // getting GPS status 
     isGPSEnabled = locationManager 
       .isProviderEnabled(LocationManager.GPS_PROVIDER); 

     // getting network status 
     isNetworkEnabled = locationManager 
       .isProviderEnabled(LocationManager.NETWORK_PROVIDER); 

     if (!isGPSEnabled && !isNetworkEnabled) { 
      // no network provider is enabled 
     } else { 
      this.canGetLocation = true; 
      if (ContextCompat.checkSelfPermission(act, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { 
        // First get location from Network Provider 
        if (isNetworkEnabled) { 
         locationManager.requestLocationUpdates(
           LocationManager.NETWORK_PROVIDER, 
           MIN_TIME_BW_UPDATES, 
           MIN_DISTANCE_CHANGE_FOR_UPDATES, this); 
         Log.d("Network", "Network"); 
         if (locationManager != null) { 
          location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); 
          if (location != null) { 
           latitude = location.getLatitude(); 
           longitude = location.getLongitude(); 
          } 
         } 
        } 
       // if GPS Enabled get lat/long using GPS Services 

       if (isGPSEnabled) { 
        if (location == null) { 
         locationManager.requestLocationUpdates(
           LocationManager.GPS_PROVIDER, 
           MIN_TIME_BW_UPDATES, 
           MIN_DISTANCE_CHANGE_FOR_UPDATES, this); 
         Log.d("GPS Enabled", "GPS Enabled"); 
         if (locationManager != null) { 
          location = locationManager 
            .getLastKnownLocation(LocationManager.GPS_PROVIDER); 
          if (location != null) { 
           latitude = location.getLatitude(); 
           longitude = location.getLongitude(); 
          } 
         } 
        } 
       } 
      } 
     } 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    return location; 
} 

Il fonctionne très bien sur AVD et téléphone, mais avec TV Android, ça ne marchera pas.

Mon Android TV est sur « utiliser Wifi pour estimer l'emplacement » (et « sur » bien sûr), donc je pense que même s'il n'y a pas GPS_PROVIDER au moins devrait continuer NETWORK_PROVIDER mais isNetworkEnabled = locationManager.isProviderEnabled (LocationManager.NETWORK_PROVIDER); est toujours faux.

Je précise que j'ai le wifi sur ma télévision et quand j'ai entré google map dans mon navigateur, il m'a trouvé.

Quelqu'un peut-il s'il vous plaît me aider à comprendre pourquoi il ne fonctionne pas ou proposer une autre solution pour obtenir mon emplacement (en dehors du service Google Play, mon téléviseur ne l'a pas installé) ...

EDIT

Mon manifeste:

<!-- lire dans la carte sd --> 
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 
<!-- écrire dans la carte sd --> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<!--location --> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
<!-- accès à internet --> 
<uses-permission android:name="android.permission.INTERNET" /> 
<!-- accès à l'état de la connection internet --> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<!-- pour enlever le bouton recent app --> 
<uses-permission android:name="android.permission.REORDER_TASKS" /> 
<!-- pour l'AccountManager --> 
<uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS"/> 
<!-- pareil je crois --> 
<uses-permission android:name="android.permission.GET_ACCOUNTS" /> 
<!-- Pour delete les accounts --> 
<uses-permission android:name="android.permission.MANAGE_ACCOUNTS" /> 

<uses-permission android:name="android.permission.BLUETOOTH" /> 

<uses-feature 
    android:name="android.hardware.touchscreen" 
    android:required="false" /> 
<uses-feature 
    android:name="android.software.leanback" 
    android:required="true" /> 
<uses-feature 
    android:name="android.hardware.faketouch" 
    android:required="false" /> 
<uses-feature 
    android:name="android.hardware.telephony" 
    android:required="false" /> 
<uses-feature 
    android:name="android.hardware.camera" 
    android:required="false" /> 
<uses-feature 
    android:name="android.hardware.nfc" 
    android:required="false" /> 
<uses-feature 
    android:name="android.hardware.location.gps" 
    android:required="false" /> 

<uses-feature android:name="android.hardware.location.network"/> 

<uses-feature 
    android:name="android.hardware.microphone" 
    android:required="false" /> 
<uses-feature 
    android:name="android.hardware.sensor" 
    android:required="false" /> 

<supports-screens 
    android:largeScreens="true" 
    android:normalScreens="false" 
    android:requiresSmallestWidthDp="720" 
    android:smallScreens="false" 
    android:xlargeScreens="true" /> 
+0

dernier emplacement de l'utilisateur Quelle est votre Version Android? Si Marshmellow (6.x), avez-vous obtenu des permissions d'exécution? – dustblue

+0

@dustblue Mon min SDK est 21 et max 25, ma TV est sur API 22, et oui j'ai la permission de temps d'exécution – Kolopox

+0

@dustblue Je mets mon manifeste en question si vous voulez – Kolopox

Répondre

0

vous pouvez consulter cette thread dans laquelle il a déclaré que vous aurez seulement besoin de ces autorisations en vous manifester:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
<uses-permission android:name="android.permission.INTERNET" /> 

remplacer ensuite la condition de vérifier si vous le GPS est activé:

if (isGPSEnabled) { 
    if (location == null) { 
     locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, MIN_TIME_BW_UPDATES,MIN_DISTANCE_CHANGE_FOR_UPDATES, (LocationListener)this); 
     Log.d("GPS Enabled", "GPS Enabled"); 
     if (locationManager != null) { 
      location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); 
      if (location != null) { 
       latitude = location.getLatitude(); 
       longitude = location.getLongitude(); 
      } 
     } 
    } 
} //end-if isGPSEnabled 

Références supplémentaires:

Hope this helps!

+0

Désolé pour la réponse en retard, le code que vous m'avez donné est celui que j'utilise déjà et j'ai déjà les permissions. La chose qui dérange est la partie: ** Certains état interne est prêt pour l'emplacement du réseau **, je ne sais pas si mon état est prêt ou non:/et j'ai essayé de mettre ** isNetworkEnabled = locationManager.isProviderEnabled (LocationManager. NETWORK_PROVIDER); ** à true mais quand je le fais, ma position est nulle ... – Kolopox

0

Vous pouvez utiliser l'API LocationServices dans les services Google Play pour obtenir l'emplacement de l'utilisateur.C'est un "FusedLocationProvider", incorporant une variété d'entrées, y compris Wi-Fi pour déterminer l'emplacement d'un utilisateur.

Première: Ajouter la COARSE_LOCATION permission:

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>

init votre objet:

FusedLocationProviderClient mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this); 

Et passer à travers un auditeur

mFusedLocationClient.getLastLocation() 
    .addOnSuccessListener(this, new OnSuccessListener<Location>() { 
     @Override 
     public void onSuccess(Location location) { 
      // Got last known location. In some rare situations this can be null. 
      if (location != null) { 
       // ... 
      } 
     } 
    });