Java tutorial
/* * Copyright (C) 2013 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package dev.application.taxivip.helpers; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import java.util.Locale; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import dev.application.taxivip.R; import android.content.Context; import android.location.Address; import android.location.Location; import android.net.ConnectivityManager; import android.net.NetworkInfo; /** * Defines app-wide constants and utilities */ public final class LocationUtils { // Debugging tag for the application public static final String APPTAG = "LocationSample"; // Name of shared preferences repository that stores persistent state public static final String SHARED_PREFERENCES = "com.example.android.location.SHARED_PREFERENCES"; // Key for storing the "updates requested" flag in shared preferences public static final String KEY_UPDATES_REQUESTED = "com.example.android.location.KEY_UPDATES_REQUESTED"; /* * Define a request code to send to Google Play services * This code is returned in Activity.onActivityResult */ public final static int CONNECTION_FAILURE_RESOLUTION_REQUEST = 9000; /* * Constants for mlocation update parameters */ // Milliseconds per second public static final int MILLISECONDS_PER_SECOND = 1000; // The update interval public static final int UPDATE_INTERVAL_IN_SECONDS = 5; // A fast interval ceiling public static final int FAST_CEILING_IN_SECONDS = 1; // Update interval in milliseconds public static final long UPDATE_INTERVAL_IN_MILLISECONDS = MILLISECONDS_PER_SECOND * UPDATE_INTERVAL_IN_SECONDS; // A fast ceiling of update intervals, used when the app is visible public static final long FAST_INTERVAL_CEILING_IN_MILLISECONDS = MILLISECONDS_PER_SECOND * FAST_CEILING_IN_SECONDS; // Create an empty string for initializing strings public static final String EMPTY_STRING = new String(); private static final int TWO_MINUTES = 1000 * 60 * 2; /** * Get the mlatitude and mlongitude from the Location object returned by * Location Services. * * @param currentLocation A Location object containing the current mlocation * @return The mlatitude and mlongitude of the current mlocation, or null if no * mlocation is available. */ public static String getLatLng(Context context, Location currentLocation) { // If the mlocation is valid if (currentLocation != null) { // Return the mlatitude and mlongitude as strings return context.getString(R.string.latitude_longitude, currentLocation.getLatitude(), currentLocation.getLongitude()); } else { // Otherwise, return the empty string return EMPTY_STRING; } } /** * Verifico que halla al menos una conexion activa a internet * @param context * @return true o false */ public static boolean networkAvailable(Context context) { //Context context = getApplicationContext(); ConnectivityManager connectMgr = (ConnectivityManager) context .getSystemService(Context.CONNECTIVITY_SERVICE); if (connectMgr != null) { NetworkInfo[] netInfo = connectMgr.getAllNetworkInfo(); if (netInfo != null) { for (NetworkInfo net : netInfo) { if (net.getState() == NetworkInfo.State.CONNECTED) { return true; } } } } return false; } public static List<Address> getStringFromLocation(double lat, double lng) throws ClientProtocolException, IOException, JSONException { String address = String.format(Locale.getDefault(), "http://maps.googleapis.com/maps/api/geocode/json?latlng=%1$f,%2$f&sensor=true&components=country:CO®ion=co&language=" + Locale.getDefault().getCountry(), lat, lng); HttpGet httpGet = new HttpGet(address); HttpClient client = new DefaultHttpClient(); HttpResponse response; StringBuilder stringBuilder = new StringBuilder(); List<Address> retList = null; response = client.execute(httpGet); HttpEntity entity = response.getEntity(); InputStream stream = entity.getContent(); int b; while ((b = stream.read()) != -1) { stringBuilder.append((char) b); } JSONObject jsonObject = new JSONObject(); jsonObject = new JSONObject(stringBuilder.toString()); retList = new ArrayList<Address>(); if ("OK".equalsIgnoreCase(jsonObject.getString("status"))) { JSONArray results = jsonObject.getJSONArray("results"); for (int i = 0; i < results.length(); i++) { JSONObject result = results.getJSONObject(i); String indiStr = result.getString("formatted_address"); Address addr = new Address(Locale.getDefault()); addr.setAddressLine(0, indiStr); retList.add(addr); } } return retList; } /** Determines whether one Location reading is better than the current Location fix * @param location The new Location that you want to evaluate * @param currentBestLocation The current Location fix, to which you want to compare the new one */ protected boolean isBetterLocation(Location location, Location currentBestLocation) { if (currentBestLocation == null) { // A new location is always better than no location return true; } // Check whether the new location fix is newer or older long timeDelta = location.getTime() - currentBestLocation.getTime(); boolean isSignificantlyNewer = timeDelta > TWO_MINUTES; boolean isSignificantlyOlder = timeDelta < -TWO_MINUTES; boolean isNewer = timeDelta > 0; // If it's been more than two minutes since the current location, use the new location // because the user has likely moved if (isSignificantlyNewer) { return true; // If the new location is more than two minutes older, it must be worse } else if (isSignificantlyOlder) { return false; } // Check whether the new location fix is more or less accurate int accuracyDelta = (int) (location.getAccuracy() - currentBestLocation.getAccuracy()); boolean isLessAccurate = accuracyDelta > 0; boolean isMoreAccurate = accuracyDelta < 0; boolean isSignificantlyLessAccurate = accuracyDelta > 200; // Check if the old and new location are from the same provider boolean isFromSameProvider = isSameProvider(location.getProvider(), currentBestLocation.getProvider()); // Determine location quality using a combination of timeliness and accuracy if (isMoreAccurate) { return true; } else if (isNewer && !isLessAccurate) { return true; } else if (isNewer && !isSignificantlyLessAccurate && isFromSameProvider) { return true; } return false; } /** Checks whether two providers are the same */ private boolean isSameProvider(String provider1, String provider2) { if (provider1 == null) { return provider2 == null; } return provider1.equals(provider2); } }