Tôi giải thích bên dưới Cách nhận tốc độ hiện tại của Người dùng bằng GPS trong thiết bị Android Bằng cách sử dụng Trình quản lý vị trí của Android. Tốc độ hiện tại có thể được sử dụng theo nhiều cách cho người dùng.
Làm theo các bước đơn giản để nhận tốc độ hiện tại bằng cách sử dụng GPS
Tạo dự án mới. Thêm quyền trong tệp AndroidManifest.xml.
<uses-permission android:name=”android.permission.ACCESS_FINE_LOCATION” />
<uses-permission android:name=”android.permission. ACCESS_COARSE_LOCATION” />
<uses-permission android:name=”android.permission.INTERNET” />
Như phiên bản cao hơn của Android cần sự cho phép trong ứng dụng vì vậy chúng tôi sẽ yêu cầu sự cho phép ứng dụng theo cách này,
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();
}
ACCESS_COARSE_LOCATION được sử dụng khi chúng ta sử dụng nhà cung cấp vị trí mạng cho ứng dụng Android của chúng tôi. Tuy nhiên, ACCESS_FINE_LOCATION đang cấp quyền cho cả hai nhà cung cấp. Sự cho phép INTERNET là phải cho việc sử dụng nhà cung cấp mạng. Kiểm tra GPS trong Đã bật hoặc Không bằng cách sử dụng Trình quản lý vị trí.
isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
Tạo GPSManager.java và triển khai GpsStatus.Listener. Điều này sẽ cung cấp các cuộc gọi lại để nhận cập nhật kết nối GPS.
public class GPSManager implements android.location.GpsStatus.Listener
{
private static final int gpsMinTime = 500;
private static final int gpsMinDistance = 0;
private static LocationManager locationManager = null;
private static LocationListener locationListener = null;
private static GPSCallback gpsCallback = null;
Context mcontext;
public GPSManager(Context context) {
mcontext=context;
GPSManager.locationListener = new LocationListener() {
@Override
public void onLocationChanged(final Location location) {
if (GPSManager.gpsCallback != null) {
GPSManager.gpsCallback.onGPSUpdate(location);
}
}
@Override
public void onProviderDisabled(final String provider) {
}
@Override
public void onProviderEnabled(final String provider) {
}
@Override
public void onStatusChanged(final String provider, final int status, final Bundle extras) {
}
};
}
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();
}
});
// Showing Alert Message
alertDialog.show();
}
public GPSCallback getGPSCallback()
{
return GPSManager.gpsCallback;
}
public void setGPSCallback(final GPSCallback gpsCallback) {
GPSManager.gpsCallback = gpsCallback;
}
public void startListening(final Context context) {
if (GPSManager.locationManager == null) {
GPSManager.locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
}
final Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);
criteria.setSpeedRequired(true);
criteria.setAltitudeRequired(false);
criteria.setBearingRequired(false);
criteria.setCostAllowed(true);
criteria.setPowerRequirement(Criteria.POWER_LOW);
final String bestProvider = GPSManager.locationManager.getBestProvider(criteria, true);
if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions((Activity) context, new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, 101);
}
if (bestProvider != null && bestProvider.length() > 0) {
GPSManager.locationManager.requestLocationUpdates(bestProvider, GPSManager.gpsMinTime,
GPSManager.gpsMinDistance, GPSManager.locationListener);
}
else {
final List<String> providers = GPSManager.locationManager.getProviders(true);
for (final String provider : providers)
{
GPSManager.locationManager.requestLocationUpdates(provider, GPSManager.gpsMinTime,
GPSManager.gpsMinDistance, GPSManager.locationListener);
}
}
}
public void stopListening() {
try
{
if (GPSManager.locationManager != null && GPSManager.locationListener != null) {
GPSManager.locationManager.removeUpdates(GPSManager.locationListener);
}
GPSManager.locationManager = null;
}
catch (final Exception ex) {
ex.printStackTrace();
}
}
public void onGpsStatusChanged(int event) {
int Satellites = 0;
int SatellitesInFix = 0;
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((Activity) mcontext, new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, 101);
}
int timetofix = locationManager.getGpsStatus(null).getTimeToFirstFix();
Log.i("GPs", "Time to first fix = "+String.valueOf(timetofix));
for (GpsSatellite sat : locationManager.getGpsStatus(null).getSatellites()) {
if(sat.usedInFix()) {
SatellitesInFix++;
}
Satellites++;
}
Log.i("GPS", String.valueOf(Satellites) + " Used In Last Fix ("+SatellitesInFix+")");
}
}
Tạo giao diện gọi lại GPSCallback.java để nhận cập nhật GPS từ GPSManager.
public interface GPSCallback
{
public abstract void onGPSUpdate(Location location);
}
Cuối cùng, nhận tốc độ hiện tại từ Vị trí. sử dụng,
speed = location.getSpeed();
currentSpeed = round(speed,3,BigDecimal.ROUND_HALF_UP);
kmphSpeed = round((currentSpeed*3.6),3,BigDecimal.ROUND_HALF_UP);
cuối cùng, MainActivity.java
public class MainActivity extends Activity implements GPSCallback{
private GPSManager gpsManager = null;
private double speed = 0.0;
Boolean isGPSEnabled=false;
LocationManager locationManager;
double currentSpeed,kmphSpeed;
TextView txtview;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
txtview=(TextView)findViewById(R.id.info);
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();
}
}
public void getCurrentSpeed(View view){
txtview.setText(getString(R.string.info));
locationManager = (LocationManager)getSystemService(LOCATION_SERVICE);
gpsManager = new GPSManager(MainActivity.this);
isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
if(isGPSEnabled) {
gpsManager.startListening(getApplicationContext());
gpsManager.setGPSCallback(this);
} else {
gpsManager.showSettingsAlert();
}
}
@Override
public void onGPSUpdate(Location location) {
speed = location.getSpeed();
currentSpeed = round(speed,3,BigDecimal.ROUND_HALF_UP);
kmphSpeed = round((currentSpeed*3.6),3,BigDecimal.ROUND_HALF_UP);
txtview.setText(kmphSpeed+"km/h");
}
@Override
protected void onDestroy() {
gpsManager.stopListening();
gpsManager.setGPSCallback(null);
gpsManager = null;
super.onDestroy();
}
public static double round(double unrounded, int precision, int roundingMode) {
BigDecimal bd = new BigDecimal(unrounded);
BigDecimal rounded = bd.setScale(precision, roundingMode);
return rounded.doubleValue();
}
}
tham khảo: Get current User Speed using GPS in Android
Thanx, tôi đã nghĩ đến việc tính toán tốc độ bằng tay cho đến khi tôi tìm thấy chức năng convinience. Nhà cung cấp NETWORK đã cho tôi một giá trị 0.0. Tôi đoán điều này có nghĩa là nó không có tốc độ. Cảm ơn một lần nữa. –
những gì sẽ là đơn vị cho location.getSpeed ()? km/h, M/h, ft/giây, mtrs/sec – Prasad
Tài liệu cho biết số mét trên giây – Samuel