Hey,
I am *NOT *android developer proffesional but I tried to do something 
similar to what you are asking about so I think I might have an answer for 
you.
My offer for you is to simply use Criteria 
<https://developer.android.com/reference/android/location/Criteria.html>.
You can use it to get the BEST AVILABLE provider without checking it your 
self.

*How to use?*

1. create new Criteria 
<https://developer.android.com/reference/android/location/Criteria.html>
object.
2. define your criteria needs.
3. get LocationManager 
<https://developer.android.com/reference/android/location/LocationManager.html>
object.
4. use getBestProvider 
<https://developer.android.com/reference/android/location/LocationManager.html#getBestProvider(android.location.Criteria,
 
boolean)>method

On Thursday, January 26, 2017 at 9:28:58 AM UTC+2, Fhahroz Iqbal wrote:
>
> I am trying to develop an android application that gets the device 
> latitude and longitude using GPS or Network providers, whichever is 
> available for the process. The code works perfectly fine when the device's 
> GPS is on but unfortunately it never works when the device's GPS is 
> switched off.
>
>
> I want to get the device's latitude and longitude based on the available 
> providers, for example; if device's GPS is on it should get the device's 
> latitude and longitude using GPS provider and if the GPS is switched off it 
> should get the device's latitude and longitude using the network provider. 
> In my case the network provider always returns false and only works when 
> the device's GPS is switched on where as it should not bother about the 
> device GPS to be on or off it should simply get the latitude and longitude 
> based on network provider.
>
>
> I have used the fused API from Google but even that has the same issue, I 
> can only get the latitude and longitude using GPS provider and when I turn 
> off the device's GPS it never returns the required latitude and longitude 
> using network provider because network provider and GPS providers both 
> returns false when device's GPS is switched off.
>
>
> Both GPS and network provider is working on device's GPS, I want to 
> separate their process respectively.
>
>
> I am using following permissions and features
>
> <uses-permission android:name="android.permission.INTERNET" /> 
> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> 
> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
> <uses-permission android:name="android.permission.LOCATION_HARDWARE" /> 
> <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /> 
> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 
> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> 
> <uses-feature android:name="android.hardware.location" 
> android:required="true"/> 
> <uses-feature android:name="android.hardware.location.network" 
> android:required="true"/> 
> <uses-feature android:name="android.hardware.location.gps" 
> android:required="true"/>
>
> Following is my complete Java code that only works when device's GPS is on, 
> in both GPS and network cases.
>
> package com.example.administrator.locationgetter;
>
> import android.Manifest;
> import android.app.Activity;
> import android.content.pm.PackageManager;
> import android.location.Location;
> import android.location.LocationListener;
> import android.location.LocationManager;
> import android.os.Bundle;
> import android.support.design.widget.FloatingActionButton;
> import android.support.design.widget.Snackbar;
> import android.support.v4.app.ActivityCompat;
> import android.support.v7.app.AppCompatActivity;
> import android.support.v7.widget.Toolbar;
> import android.util.Log;
> import android.view.View;
> import android.view.Menu;
> import android.view.MenuItem;
> import android.widget.Toast;
>
> public class MainActivity extends Activity {
>     public static final int MY_PERMISSIONS_REQUEST = 0;
>
>     LocationManager locationManager;
>
>     private LocationListener mLocationListener;
>
>
>     private void showStatus(String st)
>     {
>         Toast.makeText(MainActivity.this,st,Toast.LENGTH_SHORT).show();
>     }
>     private LocationListener createLocationListener() {
>         return new LocationListener() {
>             @Override
>             public void onLocationChanged(Location location) {
>                 // Called when a new location is found by the network 
> location provider.
>                 Toast.makeText(MainActivity.this,"accuracy: " + 
> location.getAccuracy() + " lat: " + location.getLatitude() + " lon: " + 
> location.getLongitude(),Toast.LENGTH_SHORT).show();
>             }
>
>             public void onStatusChanged(String provider, int status, Bundle 
> extras) {
>                 showStatus(provider + " -- " + status);
>             }
>
>             public void onProviderEnabled(String provider) {
>                 showStatus(provider + " -- " + "ENABLED!");
>             }
>
>             public void onProviderDisabled(String provider) {
>                 showStatus(provider + " -- " + "DISABLED!");
>             }
>
>
>         };
>     }
>
>     @Override
>     protected void onCreate(Bundle savedInstanceState) {
>
>         super.onCreate(savedInstanceState);
>         setContentView(R.layout.activity_main);
>
>         Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
>         //setSupportActionBar(toolbar);
>
>         mLocationListener = createLocationListener();
>         FloatingActionButton fab = (FloatingActionButton) 
> findViewById(R.id.fab);
>         fab.setOnClickListener(new View.OnClickListener() {
>             @Override
>             public void onClick(View view) {
>                 Snackbar.make(view, "Replace with your own action", 
> Snackbar.LENGTH_LONG)
>                         .setAction("Action", null).show();
>             }
>         });
>     }
>
>     @Override
>     public boolean onCreateOptionsMenu(Menu menu) {
>         // Inflate the menu; this adds items to the action bar if it is 
> present.
>         getMenuInflater().inflate(R.menu.menu_main, menu);
>         return true;
>     }
>
>     @Override
>     public boolean onOptionsItemSelected(MenuItem item) {
>
>         int id = item.getItemId();
>
>         //noinspection SimplifiableIfStatement
>         if (id == R.id.action_settings) {
>             return true;
>         }
>
>         return super.onOptionsItemSelected(item);
>     }
>
>     @Override
>     public void onRequestPermissionsResult(int requestCode,
>         String permissions[], int[] grantResults) {
>         switch (requestCode) {
>             case MY_PERMISSIONS_REQUEST: {
>                 // If request is cancelled, the result arrays are empty.
>                 if (grantResults.length > 0
>                         && grantResults[0] == 
> PackageManager.PERMISSION_GRANTED) {
>                     locationManager = (LocationManager) 
> this.getSystemService(LOCATION_SERVICE);
>                     
> locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 
> 0, mLocationListener);
>
>                 } else {
>                     Toast.makeText(MainActivity.this, "So sad! Give me the 
> damn permissions!", Toast.LENGTH_SHORT).show();
>
>                 }
>                 return;
>             }
>         }
>     }
>
>     public void btnLocation(View v) {
>
>         if ((ActivityCompat.checkSelfPermission(this, 
> Manifest.permission.ACCESS_COARSE_LOCATION) != 
> PackageManager.PERMISSION_GRANTED) || 
> (ActivityCompat.checkSelfPermission(this, 
> Manifest.permission.ACCESS_FINE_LOCATION) != 
> PackageManager.PERMISSION_GRANTED )){
>             showStatus("Give me the permissions man!");
>             ActivityCompat.requestPermissions(this,
>                     new String[]{ Manifest.permission.ACCESS_COARSE_LOCATION, 
> Manifest.permission.ACCESS_FINE_LOCATION},
>                     MY_PERMISSIONS_REQUEST);
>         }
>         else
>         {
>             showStatus("Already have permission");
>             locationManager = (LocationManager) 
> this.getSystemService(LOCATION_SERVICE);
>             String locationProvider = LocationManager.NETWORK_PROVIDER;
>             Location location = 
> locationManager.getLastKnownLocation(locationProvider);
>             if(location != null)
>             {
>                 Toast.makeText(MainActivity.this,"accuracy: " + 
> location.getAccuracy() + " lat: " + location.getLatitude() + " lon: " + 
> location.getLongitude(),Toast.LENGTH_SHORT).show();
>             }
>             
> locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 
> 0, mLocationListener);
>
>         }
>     }
>     public void btnLocation1(View v) {
>
>         if ((ActivityCompat.checkSelfPermission(this, 
> Manifest.permission.ACCESS_COARSE_LOCATION) != 
> PackageManager.PERMISSION_GRANTED) || 
> (ActivityCompat.checkSelfPermission(this, 
> Manifest.permission.ACCESS_FINE_LOCATION) != 
> PackageManager.PERMISSION_GRANTED )){
>             showStatus("Give me the permissions man!");
>             ActivityCompat.requestPermissions(this,
>                     new String[]{ Manifest.permission.ACCESS_COARSE_LOCATION, 
> Manifest.permission.ACCESS_FINE_LOCATION},
>                     MY_PERMISSIONS_REQUEST);
>         }
>         else
>         {
>             showStatus("Already have permission");
>             locationManager = (LocationManager) 
> this.getSystemService(LOCATION_SERVICE);
>             String locationProvider = LocationManager.GPS_PROVIDER;
>             Location location = 
> locationManager.getLastKnownLocation(locationProvider);
>             if(location != null)
>             {
>                 Toast.makeText(MainActivity.this,"accuracy: " + 
> location.getAccuracy() + " lat: " + location.getLatitude() + " lon: " + 
> location.getLongitude(),Toast.LENGTH_SHORT).show();
>             }
>             
> locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, 
> mLocationListener);
>
>         }
>     }
> }
>
>
> I have tested the application on KitKat, Lollipop and Marshmallow, all 
> have the same results.
>
>
> If you download the baidu maps and launch the app it will ask you to grant 
> the permission for location access, just make sure that your location is 
> turned off and simply grant the location permission to baidu map you will 
> notice that it will point your location on baidu maps even if your gps or 
> location service is off.
>
>
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"Android Developers" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/android-developers.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/android-developers/329b00fc-be2f-4ed3-a3d9-338cff1ed431%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to