我有一个应用程序(称为 A),它运行一个模拟从蓝牙 GPS 获得的位置的服务,以便在另一个应用程序中使用它(称为 B):
- A(具有获取蓝牙 GPS 位置的服务)
- android系统中的模拟位置
- B(从安卓系统获取位置)
一切都适用于Android 7.0,但在Android 8.0(Oreo)中,应用程序B不会读取从蓝牙获得的位置,也就是说,我认为是因为模拟位置的问题,因为日志总是打印这一行:
E PassiveLocationListener_FLP: isFromMockProvider, return
我用来模拟该位置的代码是:
private void changeToMockLocation() {
Log.i(TAG, "changeToMockLocation()");
Location newLocation = new Location(PROVIDER_NAME);
newLocation.setLatitude(mNMEAData.getLatitude());
newLocation.setLongitude(mNMEAData.getLongitude());
newLocation.setAccuracy(mNMEAData.getAccuracy());
newLocation.setTime(System.currentTimeMillis());
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
newLocation.setElapsedRealtimeNanos(SystemClock.elapsedRealtimeNanos());
}
// Set mock location.
if (ActivityCompat.checkSelfPermission(
mContext, android.Manifest.permission.ACCESS_FINE_LOCATION)
== PackageManager.PERMISSION_GRANTED) {
try {
mLocationManager.setTestProviderLocation(PROVIDER_NAME, newLocation);
} catch (Exception e) {
Log.e(TAG, "Error while setting test provider location: " + e);
}
}
}
问题是,我没有看到打印的异常,所以我认为这个过程是正确的,但就像 Android 不允许我这样做,出于某种我无法弄清楚的原因。
在清单中我声明了ALLOW_MOCK_LOCATION
权限,并且允许该应用程序在Developer Settings中模拟位置。
我究竟做错了什么?
提前致谢,祝您有美好的一天。