Skip to content

Commit

Permalink
gps
Browse files Browse the repository at this point in the history
  • Loading branch information
ic005k committed Feb 11, 2025
1 parent 14d5605 commit 3ba2d8c
Show file tree
Hide file tree
Showing 2 changed files with 122 additions and 47 deletions.
78 changes: 73 additions & 5 deletions android/src/com/x/MyActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,8 @@
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;

import android.location.GpsSatellite;
import android.location.GpsStatus;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
Expand All @@ -143,6 +145,7 @@
public class MyActivity
extends QtActivity
implements Application.ActivityLifecycleCallbacks {

public static boolean isDark = false;
private static MyActivity m_instance = null;
private static SensorManager mSensorManager;
Expand Down Expand Up @@ -215,6 +218,7 @@ public class MyActivity
private double totalDistance = 0;
private double latitude = 0;
private double longitude = 0;
private String strGpsStatus = "None";

public MyActivity() {
}
Expand Down Expand Up @@ -690,18 +694,77 @@ public void onProviderEnabled(String provider) {
public void onProviderDisabled(String provider) {
}
};

}

private final GpsStatus.Listener gpsStatusListener = new GpsStatus.Listener() {
@Override
public void onGpsStatusChanged(int event) {
if (locationManager != null) {
GpsStatus gpsStatus = locationManager.getGpsStatus(null);
switch (event) {
case GpsStatus.GPS_EVENT_SATELLITE_STATUS:
Iterable<GpsSatellite> satellites = gpsStatus.getSatellites();
Iterator<GpsSatellite> it = satellites.iterator();
int satelliteCount = 0;
StringBuilder statusText = new StringBuilder();
while (it.hasNext()) {
GpsSatellite satellite = it.next();
satelliteCount++;
statusText.append("卫星 ").append(satelliteCount).append(" 强度: ")
.append(satellite.getSnr()).append("\n");
}
statusText.insert(0, "可见卫星数量: ").append(satelliteCount).append("\n");
strGpsStatus = statusText.toString();
break;
case GpsStatus.GPS_EVENT_FIRST_FIX:
// 首次定位成功
break;
case GpsStatus.GPS_EVENT_STARTED:
// GPS启动
break;
case GpsStatus.GPS_EVENT_STOPPED:
// GPS停止
break;
}
}
}
};

public String getGpsStatus() {
return strGpsStatus;
}

public double startGpsUpdates() {
totalDistance = 0;
latitude = 0;
longitude = 0;
if (locationManager != null) {
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
5000, // 更新间隔时间(毫秒)
1, // 最小距离变化(米)
locationListener);
return 1;
// 检测是否有定位权限
int permission = ActivityCompat.checkSelfPermission(
this,
"android.permission.ACCESS_FINE_LOCATION");
if (permission != PackageManager.PERMISSION_GRANTED) {
// 没有定位权限,去申请定位权限,会弹出对话框
ActivityCompat.requestPermissions(this,
new String[] { "android.permission.ACCESS_FINE_LOCATION" },
1);
}

if (ActivityCompat.checkSelfPermission(this,
"android.permission.ACCESS_FINE_LOCATION") == PackageManager.PERMISSION_GRANTED) {
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
3000, // 更新间隔时间(毫秒)
1, // 最小距离变化(米)
locationListener);

// 添加GPS状态侦听
if (locationManager != null) {
locationManager.addGpsStatusListener(gpsStatusListener);
}

return 1;
}
}
return 0;
}
Expand Down Expand Up @@ -729,6 +792,11 @@ public double stopGpsUpdates() {
if (locationManager != null && locationListener != null) {
try {
locationManager.removeUpdates(locationListener);

// 停止GPS状态侦听
if (locationManager != null) {
locationManager.removeGpsStatusListener(gpsStatusListener);
}
} catch (SecurityException e) {
e.printStackTrace();
}
Expand Down
91 changes: 49 additions & 42 deletions src/Steps/Steps.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -452,32 +452,38 @@ void Steps::setScrollBarPos(double pos) {
}

void Steps::startRecordMotion() {
requestLocationPermissions();
// requestLocationPermissions(); // 已在安卓中调用

#ifdef Q_OS_ANDROID
#else
m_positionSource = QGeoPositionInfoSource::createDefaultSource(this);
if (m_positionSource) {
// connect(m_positionSource, &QGeoPositionInfoSource::positionUpdated, this,
// &Steps::positionUpdated);
connect(m_positionSource, SIGNAL(positionUpdated(QGeoPositionInfo)), this,
SLOT(positionUpdated(QGeoPositionInfo)));
connect(m_positionSource, &QGeoPositionInfoSource::positionUpdated, this,
&Steps::positionUpdated);
m_positionSource->setUpdateInterval(2000);
} else {
mw_one->ui->lblGpsInfo->setText(tr("No GPS signal..."));
mw_one->ui->btnGPS->setText(tr("Start"));
return;
}
#endif

timer = new QTimer(this);
connect(timer, &QTimer::timeout, this, [this]() {
m_time = m_time.addSecs(1);

QString strGpsStatus;
#ifdef Q_OS_ANDROID
// 获取总运动距离
jdouble distance =
m_activity.callMethod<jdouble>("getTotalDistance", "()D");
m_distance = distance;
m_distance = (double)distance / 1000.00;
latitude = m_activity.callMethod<jdouble>("getLatitude", "()D");
longitude = m_activity.callMethod<jdouble>("getLongitude", "()D");
QAndroidJniObject jstrGpsStatus =
m_activity.callObjectMethod<jstring>("getGpsStatus");
if (jstrGpsStatus.isValid()) strGpsStatus = jstrGpsStatus.toString();
#else

#endif

if (m_time.second() != 0) {
Expand All @@ -488,49 +494,50 @@ void Steps::startRecordMotion() {
strMotionTime = tr("Duration") + " : " + m_time.toString("hh:mm:ss");
mw_one->ui->lblGpsInfo->setText(strDistance + " " + strMotionTime +
"\n" + QString::number(latitude) + " - " +
QString::number(longitude));
QString::number(longitude) + "\n" +
strGpsStatus);
emit timeChanged();
});

if (m_positionSource) {
#ifdef Q_OS_ANDROID

m_activity = QtAndroid::androidActivity();
if (m_activity.isValid()) {
QAndroidJniObject locationService = m_activity.callObjectMethod(
"getSystemService", "(Ljava/lang/String;)Ljava/lang/Object;",
QAndroidJniObject::fromString("location").object<jstring>());
if (locationService.isValid()) {
// listenerWrapper = QAndroidJniObject("com/x/LocationListenerWrapper",
// "(Landroid/content/Context;)V",
// m_activity.object<jobject>());

if (listenerWrapper.isValid()) {
} else {
}

if (m_activity.callMethod<jdouble>("startGpsUpdates", "()D") == 0) {
qWarning() << "LocationManager is null";
mw_one->ui->lblGpsInfo->setText("LocationManager is null...");
mw_one->ui->btnGPS->setText(tr("Start"));
return;
}
m_activity = QtAndroid::androidActivity();
if (m_activity.isValid()) {
QAndroidJniObject locationService = m_activity.callObjectMethod(
"getSystemService", "(Ljava/lang/String;)Ljava/lang/Object;",
QAndroidJniObject::fromString("location").object<jstring>());
if (locationService.isValid()) {
// listenerWrapper = QAndroidJniObject("com/x/LocationListenerWrapper",
// "(Landroid/content/Context;)V",
// m_activity.object<jobject>());

if (listenerWrapper.isValid()) {
} else {
}

if (m_activity.callMethod<jdouble>("startGpsUpdates", "()D") == 0) {
qWarning() << "LocationManager is null";
mw_one->ui->lblGpsInfo->setText("LocationManager is null...");
mw_one->ui->btnGPS->setText(tr("Start"));
return;
}
}
}

#else
if (m_positionSource) {
m_positionSource->startUpdates();
}
#endif

m_time = QTime(0, 0);
timer->start(1000);
m_distance = 0;
m_speed = 0;
emit distanceChanged(m_distance);
emit timeChanged();
m_time = QTime(0, 0);
timer->start(1000);
m_distance = 0;
m_speed = 0;
emit distanceChanged(m_distance);
emit timeChanged();

mw_one->ui->btnGPS->setText(tr("Stop"));
}
mw_one->ui->btnGPS->setText(tr("Stop"));
}

void Steps::positionUpdated(const QGeoPositionInfo& info) {
Expand All @@ -547,13 +554,15 @@ void Steps::positionUpdated(const QGeoPositionInfo& info) {
}

void Steps::stopRecordMotion() {
if (m_positionSource) {
m_positionSource->stopUpdates();
}
timer->stop();

#ifdef Q_OS_ANDROID
m_distance = m_activity.callMethod<jdouble>("stopGpsUpdates", "()D");
#else
if (m_positionSource) {
m_positionSource->stopUpdates();
}
delete m_positionSource;
#endif

ShowMessage* msg = new ShowMessage(this);
Expand All @@ -562,8 +571,6 @@ void Steps::stopRecordMotion() {
tr("Speed") + " : " + QString::number(speed, 'g', 2) + " km/h";
msg->showMsg("Knot", strDistance + "\n\n" + strMotionTime + "\n\n" + strSpeed,
1);

delete m_positionSource;
}

bool Steps::requestLocationPermissions() {
Expand Down

0 comments on commit 3ba2d8c

Please sign in to comment.