如何在Android中锁定屏幕时长按电源按钮启用GPS?
Posted
技术标签:
【中文标题】如何在Android中锁定屏幕时长按电源按钮启用GPS?【英文标题】:how to enable GPS on long key press of power button while screen is locked in Android? 【发布时间】:2014-02-10 06:08:29 【问题描述】:我正在开发一个应用程序,当用户在设备实际锁定为模式/屏幕锁定模式时长按电源键按钮时,发送用户在所选联系人号码上的当前位置。那么如何启用 GPS 以使其自动启用并获取当前的经度和纬度。
【问题讨论】:
【参考方案1】:首先,您需要注意按键,并且有一些很好的信息here。
这是一个获取经度和纬度的例子:
public class GPSTracker extends Service implements LocationListener
private final Context mContext;
//flag for GPS Status
boolean isGPSEnabled = false;
//flag for network status
boolean isNetworkEnabled = false;
boolean canGetLocation = false;
Location location;
double latitude;
double longitude;
//The minimum distance to change updates in metters
private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; //10 metters
//The minimum time beetwen updates in milliseconds
private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1; // 1 minute
//Declaring a Location Manager
protected LocationManager locationManager;
public GPSTracker(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);
//getting network status
isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
if (!isGPSEnabled && !isNetworkEnabled)
// no network provider is enabled
else
this.canGetLocation = true;
//First get location from Network Provider
if (isNetworkEnabled)
locationManager.requestLocationUpdates(
LocationManager.NETWORK_PROVIDER,
MIN_TIME_BW_UPDATES,
MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
Log.d("Network", "Network");
if (locationManager != null)
location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
updateGPSCoordinates();
//if GPS Enabled get lat/long using GPS Services
if (isGPSEnabled)
if (location == null)
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);
updateGPSCoordinates();
catch (Exception e)
//e.printStackTrace();
Log.e("Error : Location", "Impossible to connect to LocationManager", e);
return location;
public void updateGPSCoordinates()
if (location != null)
latitude = location.getLatitude();
longitude = location.getLongitude();
/**
* Stop using GPS listener
* Calling this function will stop using GPS in your app
*/
public void stopUsingGPS()
if (locationManager != null)
locationManager.removeUpdates(GPSTracker.this);
/**
* Function to get latitude
*/
public double getLatitude()
if (location != null)
latitude = location.getLatitude();
return latitude;
/**
* Function to get longitude
*/
public double getLongitude()
if (location != null)
longitude = location.getLongitude();
return longitude;
/**
* Function to check GPS/wifi enabled
*/
public boolean canGetLocation()
return this.canGetLocation;
/**
* Function to show settings alert dialog
*/
public void showSettingsAlert()
AlertDialog.Builder alertDialog = new AlertDialog.Builder(mContext);
//Setting Dialog Title
alertDialog.setTitle(R.string.GPSAlertDialogTitle);
//Setting Dialog Message
alertDialog.setMessage(R.string.GPSAlertDialogMessage);
//On Pressing Setting button
alertDialog.setPositiveButton(R.string.settings, new DialogInterface.OnClickListener()
@Override
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(R.string.cancel, new DialogInterface.OnClickListener()
@Override
public void onClick(DialogInterface dialog, int which)
dialog.cancel();
);
alertDialog.show();
/**
* Get list of address by latitude and longitude
* @return null or List<Address>
*/
public List<Address> getGeocoderAddress(Context context)
if (location != null)
Geocoder geocoder = new Geocoder(context, Locale.ENGLISH);
try
List<Address> addresses = geocoder.getFromLocation(latitude, longitude, 1);
return addresses;
catch (IOException e)
//e.printStackTrace();
Log.e("Error : Geocoder", "Impossible to connect to Geocoder", e);
return null;
/**
* Try to get AddressLine
* @return null or addressLine
*/
public String getAddressLine(Context context)
List<Address> addresses = getGeocoderAddress(context);
if (addresses != null && addresses.size() > 0)
Address address = addresses.get(0);
String addressLine = address.getAddressLine(0);
return addressLine;
else
return null;
/**
* Try to get Locality
* @return null or locality
*/
public String getLocality(Context context)
List<Address> addresses = getGeocoderAddress(context);
if (addresses != null && addresses.size() > 0)
Address address = addresses.get(0);
String locality = address.getLocality();
return locality;
else
return null;
/**
* Try to get Postal Code
* @return null or postalCode
*/
public String getPostalCode(Context context)
List<Address> addresses = getGeocoderAddress(context);
if (addresses != null && addresses.size() > 0)
Address address = addresses.get(0);
String postalCode = address.getPostalCode();
return postalCode;
else
return null;
/**
* Try to get CountryName
* @return null or postalCode
*/
public String getCountryName(Context context)
List<Address> addresses = getGeocoderAddress(context);
if (addresses != null && addresses.size() > 0)
Address address = addresses.get(0);
String countryName = address.getCountryName();
return countryName;
else
return null;
@Override
public void onLocationChanged(Location location)
@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 intent)
return null;
【讨论】:
以上是关于如何在Android中锁定屏幕时长按电源按钮启用GPS?的主要内容,如果未能解决你的问题,请参考以下文章