import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.pm.PackageManager; import android.location.Address; import android.location.Geocoder; import android.os.Bundle; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.support.v4.content.LocalBroadcastManager; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.TextView; import java.io.IOException; import java.util.ArrayList; import java.util.List; public class MainActivity extends AppCompatActivity { private ArrayList<String> permissionsToRequest; private ArrayList<String> permissionsRejected = new ArrayList(); private ArrayList<String> permissions = new ArrayList(); private final static int ALL_PERMISSIONS_RESULT = 101; LocationTrack gpsTracker; List<Address> addresses; Geocoder geocoder; private TextView displayTv,displayAddress; private static final String TAG = MainActivity.class.getSimpleName(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); displayTv = (TextView)findViewById(R.id.tvDisplay); displayAddress = (TextView)findViewById(R.id.tvAddress); try { if (ContextCompat.checkSelfPermission(getApplicationContext(), android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED ) { ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION}, 101); } } catch (Exception e){ e.printStackTrace(); } gpsTracker = new LocationTrack(MainActivity.this); if(gpsTracker.canGetLocation()){ double latitude = gpsTracker.getLatitude(); double longitude = gpsTracker.getLongitude(); displayTv.setText(String.valueOf(latitude)+" "+String.valueOf(longitude)); }else{ gpsTracker.showSettingsAlert(); } LocalBroadcastManager.getInstance(this).registerReceiver( new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String latitude = intent.getStringExtra(LocationTrack.EXTRA_LATITUDE); String longitude = intent.getStringExtra(LocationTrack.EXTRA_LONGITUDE); if (latitude != null && longitude != null) { displayAddress.setText("Service started" + "\n Latitude : " + latitude + "\n Longitude: " + longitude); } } }, new IntentFilter(LocationTrack.ACTION_LOCATION_BROADCAST) ); } }
import android.Manifest; import android.app.Service; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.pm.PackageManager; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.Bundle; import android.os.IBinder; import android.provider.Settings; import android.support.v4.app.ActivityCompat; import android.support.v4.content.LocalBroadcastManager; import android.support.v7.app.AlertDialog; import android.util.Log; import android.widget.Toast; import java.util.List; import static android.content.ContentValues.TAG; /** * Created by namratha.asher on 12/21/2018. */ public class LocationTrack extends Service implements LocationListener { private final Context mContext; // flag for GPS status boolean isGPSEnabled = false; // flag for network status boolean isNetworkEnabled = false; // flag for GPS status boolean canGetLocation = false; Location location; // location double latitude; // latitude double longitude; // longitude // The minimum distance to change Updates in meters private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; // 10 meters // The minimum time between updates in milliseconds private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1; // 1 minute // Declaring a Location Manager protected LocationManager locationManager; public static final String ACTION_LOCATION_BROADCAST = LocationTrack.class.getName() + "LocationBroadcast"; public static final String EXTRA_LATITUDE = "extra_latitude"; public static final String EXTRA_LONGITUDE = "extra_longitude"; public LocationTrack(Context context) { this.mContext = context; getLocation(); } public Location getLocation() { try { locationManager = (LocationManager) mContext.getSystemService(LOCATION_SERVICE); // getting GPS status isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); // isGPSEnabled = false; // getting network status /* isNetworkEnabled = locationManager .isProviderEnabled(LocationManager.NETWORK_PROVIDER);*/ isNetworkEnabled = false; if (!isGPSEnabled && !isNetworkEnabled) { // no network provider is enabled } else { this.canGetLocation = true; // First get location from Network Provider if (isNetworkEnabled) { //check the network permission if (ActivityCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions((MainActivity) mContext, new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, 101); } locationManager.requestLocationUpdates( LocationManager.NETWORK_PROVIDER, 0, 0, this); Log.d("Network", "Network"); if (locationManager != null) { /* location = locationManager .getLastKnownLocation(LocationManager.NETWORK_PROVIDER);*/ List<String> providers = locationManager.getProviders(true); Location bestLocation = null; for (String provider : providers) { Location l = locationManager.getLastKnownLocation(provider); if (l == null) { continue; } if (bestLocation == null || l.getAccuracy() < bestLocation.getAccuracy()) { // Found best last known location: %s", l); bestLocation = l; } } if (bestLocation != null) { latitude = bestLocation.getLatitude(); longitude = bestLocation.getLongitude(); } } } // if GPS Enabled get lat/long using GPS Services if (isGPSEnabled) { if (location == null) { //check the network permission if (ActivityCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions((MainActivity) mContext, new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, 101); } 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; } /** * Stop using GPS listener * Calling this function will stop using GPS in your app * */ public void stopUsingGPS(){ if(locationManager != null){ locationManager.removeUpdates(LocationTrack.this); } } /** * Function to get latitude * */ public double getLatitude(){ if(location != null){ latitude = location.getLatitude(); } // return latitude return latitude; } /** * Function to get longitude * */ public double getLongitude(){ if(location != null){ longitude = location.getLongitude(); } // return longitude return longitude; } /** * Function to check GPS/wifi enabled * @return boolean * */ public boolean canGetLocation() { return this.canGetLocation; } /** * Function to show settings alert dialog * On pressing Settings button will lauch Settings Options * */ public void showSettingsAlert(){ AlertDialog.Builder alertDialog = new AlertDialog.Builder(mContext); // Setting Dialog Title alertDialog.setTitle("GPS is settings"); // Setting Dialog Message alertDialog.setMessage("GPS is not enabled. Do you want to go to settings menu?"); // On pressing Settings button alertDialog.setPositiveButton("Settings", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog,int which) { Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); mContext.startActivity(intent); } }); // on pressing cancel button alertDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.cancel(); } }); alertDialog.show(); } @Override public void onLocationChanged(Location location) { Log.v("TEST****", "IN ON LOCATION CHANGE, lat=" + latitude + ", lon=" + longitude); // Toast.makeText(this,"Loc",Toast.LENGTH_LONG).show(); if (location != null) { Log.d(TAG, "== location != null"); //Send result to activities sendMessageToUI(String.valueOf(location.getLatitude()), String.valueOf(location.getLongitude())); } } private void sendMessageToUI(String lat, String lng) { Log.d(TAG, "Sending info..."); Intent intent = new Intent(ACTION_LOCATION_BROADCAST); intent.putExtra(EXTRA_LATITUDE, lat); intent.putExtra(EXTRA_LONGITUDE, lng); LocalBroadcastManager.getInstance(this).sendBroadcast(intent); } @Override public void onProviderDisabled(String provider) { } @Override public void onProviderEnabled(String provider) { } @Override public void onStatusChanged(String provider, int status, Bundle extras) { } @Override public IBinder onBind(Intent arg0) { return null; } }
Layout
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" tools:context=".MainActivity" android:layout_height="match_parent"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/btn" android:layout_centerInParent="true" android:text="GET LOCATION" /> <TextView android:id="@+id/tvDisplay" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/btn" android:layout_centerHorizontal="true" android:layout_marginTop="39dp" android:text="TextView" /> <TextView android:id="@+id/tvAddress" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_alignStart="@+id/btn" android:layout_marginStart="15dp" android:layout_marginTop="75dp" android:text="TextView" /> </RelativeLayout>
No comments:
Post a Comment