2012-12-17 3 views
0

J'ai une application Android qui utilise google map et a une fonction pour montrer l'emplacement actuel. J'ai reçu peu de commentaires disant que "l'emplacement actuel ne vient pas même si le GPS est allumé." Je l'ai essayé avec deux appareils, mais je ne pouvais pas voir le problème mais hier j'ai fait face à la question sur mon téléphone aussi où il fonctionnait bien plus tôt.Je suis parfois incapable d'obtenir l'emplacement actuel même lorsque le GPS est allumé mais que le Wifi est éteint, pourquoi?

La solution que j'ai trouvée est que si l'emplacement actuel ne se présente pas, alors éteignez le wi-fi et utilisez Internet mobile pour obtenir l'emplacement actuel et il a commencé à apparaître. Je sais que ça a l'air un peu bizarre mais ça a marché pour moi. S'il vous plaît me suggérer les changements nécessaires dans mon code, si quelque chose me manque. Je ne peux pas suggérer la solution de contournement ci-dessus pour les utilisateurs de mon application.

locMgr = (LocationManager)getSystemService(Context.LOCATION_SERVICE); 
boolean enabled = locMgr.isProviderEnabled(LocationManager.GPS_PROVIDER); 
cEnabled = getIntent().getExtras().getBoolean("cEnabled"); 

if (!enabled && !cEnabled) { 
    AlertDialog.Builder alt_bld = new AlertDialog.Builder(this); 
    alt_bld.setMessage("Would you like to activate GPS?\n(recommended- Yes)") 
     .setCancelable(false) 
     .setPositiveButton("Yes", new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int id) { 
       Intent intent = new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS); 
       startActivity(intent); 
      } 
     }) 
     .setNegativeButton("No", new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int id) { 
       dialog.cancel(); 
      } 
     }); 

    AlertDialog alert = alt_bld.create(); 
    // Title for AlertDialog 
    alert.setTitle("Activate GPS?"); 
    // Icon for AlertDialog 
    alert.setIcon(R.drawable.location1); 
    alert.show();  
} 

ImageButton clocButton = (ImageButton) findViewById(R.id.cLoc); 
clocButton.setOnTouchListener(new OnTouchListener() { 
    public boolean onTouch(View v, MotionEvent event) { 
    getToMyLocation(); 
     return false; 
    } 
}); 

private void getToMyLocation() { 
    mapView.invalidate(); 
    Criteria criteria = new Criteria(); 
    String provider = locMgr.getBestProvider(criteria, false); 
    Location lastLoc = locMgr.getLastKnownLocation(provider); 
    if(lastLoc != null) { 
     GeoPoint lastPoint = new GeoPoint((int)(lastLoc.getLatitude()*1E6), (int)(lastLoc.getLongitude()*1E6)); 
     center = lastPoint; 
     showLocation(lastPoint); 
    } 
    else 
    { 
     Toast.makeText(mContext, "Waiting for current location", Toast.LENGTH_SHORT).show(); 
    } 

    myLocOverlay.enableMyLocation(); 
    myLocOverlay.runOnFirstFix(new Runnable() { 
     public void run() { 
      GeoPoint loc = myLocOverlay.getMyLocation(); 
      mapView.getController().setCenter(loc); 
      center = loc; 
     } 
    }); 
} 

private void showLocation(GeoPoint location) { 
    if (location != null) { 
     myLocOverlay.enableMyLocation(); 
     mapView.getController().animateTo(location); 
    } 
} 

J'ai ajouté des autorisations suivantes dans le fichier manifeste:

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

Répondre

0

J'ai utilisé le tutoriel Développeurs Android Making Your App Location-Aware avant et il a bien fonctionné pour moi. Avez-vous regardé à travers cela et l'avez comparé à votre propre code?

Vous pouvez voir quelque chose qui vous manque, ou une meilleure façon de mettre en œuvre certaines parties de celui-ci, ce qui peut résoudre ces problèmes.

+0

Je définis des critères par défaut pour l'emplacement et la recherche du meilleur fournisseur, mais il semble, fournisseur de chaîne = locMgr.getBestProvider (critères, faux); renvoyer un fournisseur null. mais pourquoi? – piyush

Questions connexes