2016-11-29 5 views
5

Je veux implémenter Enable/Disable mobile data and GPS settings. J'ai cherché l'API Android disponible d'activer/désactiver les données mobiles et les paramètres GPS et ci-dessous sont mes conclusions.Données mobiles et GPS ON/OFF par programme - Android ci-dessus 5.0 aussi

Activer/Désactiver les données mobiles - 1. Il est possible d'activer/désactiver dans < 5.0 OS Android. 2. À partir du système d'exploitation Android 5.0+, il n'est pas encore possible pour une application non-système d'activer/désactiver les données mobiles. À partir de la version 5.0 ou supérieure, nous obtenons cette exception tout en faisant la même chose - ce qui n'est pas à utiliser par des applications tierces. Causé par: java.lang.SecurityException:Neither user 10314 nor current process has android.permission.MODIFY_PHONE_STATE.

Existe-t-il des solutions possibles/disponibles? Paramètres du GPS - 1. Nous sommes en mesure d'utiliser l'adresse ON par programmation, mais nous n'avons pas encore trouvé le moyen de la désactiver (à l'exception de l'approche Intent). Tout le monde sait comment désactiver le GPS (Emplacement par programme) sans passer aux paramètres via l'intention.

Merci à l'avance.

+0

removeLocationUpdates d'appel() à stopusingGPS. –

+0

Demandez-vous l'autorisation d'exécution à l'utilisateur dans votre application? –

+0

@ArpitPatel Je suis à la recherche d'un moyen de l'exécuter, mais à partir de l'application. – Manmohan

Répondre

1

Nous changeons le réglage GPS sans passer à l'écran de réglage à l'aide SettingsApi

Pour vérifier si le GPS est activé ou désactivé, vous devez vérifier comme ci-dessous,

public class GPSActivity extends AppCompatActivity implements View.OnClickListener, GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener { 

private static String TAG = "GPSActivity"; 

// Required for setting API 
protected static final int REQUEST_CHECK_SETTINGS = 0x1; 
GoogleApiClient googleApiClient; 

private Button mBtnGPS; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_gps); 

    mBtnGPS = (Button) findViewById(R.id.btnGPS); 

    mBtnGPS.setOnClickListener(this); 
} 

@Override 
public void onClick(View view) { 
    switch (view.getId()) { 
     case R.id.btnGPS: 
      // Check GPS 
      checkGps(); 
      break; 
    } 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    Log.d(TAG, "onActivityResult(" + requestCode + "," + resultCode + "," + data); 
    if (requestCode == REQUEST_CHECK_SETTINGS) { 
     googleApiClient = null; 
     checkGps(); 
    } 
} 

public void checkGps() { 
    if (googleApiClient == null) { 
     googleApiClient = new GoogleApiClient.Builder(GPSActivity.this) 
       .addApiIfAvailable(LocationServices.API) 
       .addConnectionCallbacks(this).addOnConnectionFailedListener(this).build(); 
     googleApiClient.connect(); 

     LocationRequest locationRequest = LocationRequest.create(); 
     locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
     locationRequest.setInterval(30 * 1000); 
     locationRequest.setFastestInterval(5 * 1000); 
     LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder() 
       .addLocationRequest(locationRequest); 

     builder.setAlwaysShow(true); // this is the key ingredient 

     PendingResult<LocationSettingsResult> result = LocationServices.SettingsApi 
       .checkLocationSettings(googleApiClient, builder.build()); 
     result.setResultCallback(new ResultCallback<LocationSettingsResult>() { 
      @Override 
      public void onResult(LocationSettingsResult result) { 
       final Status status = result.getStatus(); 
       final LocationSettingsStates state = result 
         .getLocationSettingsStates(); 
       switch (status.getStatusCode()) { 
        case LocationSettingsStatusCodes.SUCCESS: 
         Log.i("GPS", "SUCCESS"); 
         //getFbLogin(); 
         break; 
        case LocationSettingsStatusCodes.RESOLUTION_REQUIRED: 
         Log.i("GPS", "RESOLUTION_REQUIRED"); 
         // Location settings are not satisfied. But could be 
         // fixed by showing the user 
         // a dialog. 
         try { 
          // Show the dialog by calling 
          // startResolutionForResult(), 
          // and check the result in onActivityResult(). 
          status.startResolutionForResult(GPSActivity.this, REQUEST_CHECK_SETTINGS); 
         } catch (IntentSender.SendIntentException e) { 
          // Ignore the error. 
         } 
         break; 
        case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE: 
         Log.i("GPS", "SETTINGS_CHANGE_UNAVAILABLE"); 
         // Location settings are not satisfied. However, we have 
         // no way to fix the 
         // settings so we won't show the dialog. 
         break; 
        case LocationSettingsStatusCodes.CANCELED: 
         Log.i("GPS", "CANCELED"); 
         break; 
       } 
      } 
     }); 
    } 
} 

@Override 
public void onConnected(Bundle bundle) { 

} 

@Override 
public void onConnectionSuspended(int i) { 

} 

@Override 
public void onConnectionFailed(ConnectionResult connectionResult) { 

} 

}

Voici le Documentation

+0

J'ai utilisé le même code pour l'activer. Je cherche à le désactiver. S'il vous plaît dites-moi si vous le savez. – Manmohan

+0

Peut-être pas possible. Parce que dans la documentation officielle de google, je ne pouvais pas trouvé. Nous devons donc naviguer dans l'écran de réglage. @Manmohan –

0

Voici comment démarrer le service de localisation, à partir de GPS et fournisseurs de réseau (Wi-Fi/données).

LocationManager locationManager = (LocationManager)getContext().getSystemService(Context.LOCATION_SERVICE); 
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,0,0,locationListener);   
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,0,0,locationListener); 

Si vous souhaitez arrêter d'écouter les mises à jour d'emplacement, exécutez ce code: locationManager.removeUpdates(locationListener);

La seule ligne de code arrêterait l'écoute pour toutes les mises à jour de localisation, quel que soit le fournisseur (GPS/réseau), parce que le LocationManager ne se soucie pas d'où viennent les mises à jour.

Dans votre cas, je suppose que vous savez comment créer une interface utilisateur pour laisser l'utilisateur décider d'utiliser ou non le GPS/réseau. Et puis, vous pouvez faire quelque chose comme ceci:

if (useGPS) { 
    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,0,0,locationListener); 
} 
if (useNetwork) { 
    locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,0,0,locationListener); 
} 

Si l'utilisateur a activé les deux fournisseurs, les mises à jour de localisation pourraient être plus précises. Et si l'utilisateur a désactivé les deux fournisseurs, cela n'a pas d'importance. Comme aucune mise à jour ne viendra à l'emplacement LocationListener, et il devrait être ce que l'utilisateur voulait.

Soit dit en passant, voici le code pour créer le LocationListener:

LocationListener locationListener = new LocationListener() { 
     @Override 
     public void onLocationChanged(Location location) { 
      // you may add some logic here to determine whether the new location update is more accurate than the previous one 
      if (isBetterLocation(location,currentBestLocation)) { 
       currentBestLocation = location; 
      } 
     } 

     @Override 
     public void onStatusChanged(String provider, int status, Bundle extras) { 
     } 

     @Override 
     public void onProviderEnabled(String provider) { 
     } 

     @Override 
     public void onProviderDisabled(String provider) { 
     } 
    };