2016-11-29 20 views
5

Enable/Disable mobile data and GPS settings uygulamak istiyorum. Mobil veriyi etkinleştirme/devre dışı bırakma ve mevcut GPS ayarları için mevcut Android API'yı aradım ve aşağıda benim bulgularım var.Mobil veri ve GPS AÇIK/KAPALI programatik - Android yukarıda 5.0 de

Mobil veriyi etkinleştirme/devre dışı bırakma - 1. < 5.0 Android işletim sisteminde etkinleştirmek/devre dışı bırakmak mümkündür. 2. 5.0+ Android işletim sisteminden, sistem dışı bir uygulamanın mobil verileri etkinleştirmesini/devre dışı bırakması henüz mümkün değildir. 5.0 veya üstü ile aynı şeyi yaparken bu istisnayı alıyoruz - Hangi Üçüncü taraf uygulamaları tarafından kullanılmaz. Nedeni: java.lang.SecurityException:Neither user 10314 nor current process has android.permission.MODIFY_PHONE_STATE.

Mevcut/mevcut çözümler var mı?

GPS Ayarları - 1. Programatik olarak AÇIK konumdayız ancak henüz devre dışı bırakmanın bir yolunu bulamadık (Niyet yaklaşımı hariç).

Herkes niyet yoluyla ayarlarına taşımadan GPS (Yer programlı) devre dışı bırakma biliyorum.

Teşekkürler.

+0

çağrı removeLocationUpdates() stopusingGPS için: Bu arada

, burada LocationListener oluşturmak için kod. –

+0

Uygulamanızda kullanıcı için çalışma süresi izni mi istiyorsun? –

+0

@ArpitPatel Uygulamanın içinden, ancak bunu gerçekleştirmenin bir yolunu arıyorum. – Manmohan

cevap

1

Biz GPS AÇIK veya KAPALI kontrol etmek

SettingsApi kullanarak ayar ekranına taşımadan GPS ayarını değiştirerek, sen aşağıda gibi kontrol etmek zorunda

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) { 

} 

}

İşte gelen, Bu konum hizmetini başlatmak için nasıl Documentation

+0

Etkinleştirmek için aynı kodu kullandım. Onu devre dışı bırakmak için arıyorum. Lütfen bunu biliyorsan söyle. – Manmohan

+0

Mümkün değil. Çünkü google resmi dokümantasyonunda bulunamadı. Bu yüzden ayar ekranında gezinmek zorundayız. @Manmohan –

0

olduğunu GPS ve Ağ (Wi-Fi/veri) sağlayıcıları.

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

olsun, yer güncellemeleri için dinleme durdurmak bu kodu çalıştırmak istiyorsanız: locationManager.removeUpdates(locationListener);

kod tek satır bakılmaksızın sağlayıcısına (GPS/Ağ) olarak herhangi bir yere güncellemeleri için dinleme durdurulur, Çünkü LocationManager güncellemelerin nereden geldiğini umursamıyor. Senin durumunda

, sana kullanıcı GPS/Ağ kullanıp kullanmayacağına karar vermek bazı UI oluşturmayı biliyorum varsayalım. Kullanıcı her iki sağlayıcıları etkin olursa

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

, konum güncellemeleri daha doğru olabilir: Ve sonra, böyle bir şey yapabilirsiniz. Ve eğer kullanıcı her iki sağlayıcıyı da devre dışı bıraktıysa, önemli değil. LocationListener'a hiçbir güncelleme gelmeyeceğinden ve kullanıcının istediği gibi olması gerektiğinden.

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) { 
     } 
    };