是否可以在不使用GPS或互联网的情况下获取用户的当前位置?我的意思是在移动网络提供商的帮助下.
Google会通过电子邮件通知Android位置权限的更改:
我们将在2016年10月15日进行更改,这将影响使用ACCESS_FINE_LOCATION但未明确拥有"android.hardware.location.gps"使用功能的API版本21(Android 5.0,Lollipop)或更高版本的应用.展望未来,这些应用程序可以安装在没有GPS硬件的设备上.在大多数情况下,这不会成为问题,因为基于Wi-Fi和基于Cell-ID的位置为这些应用的典型操作提供了足够高的保真度.但是,任何需要GPS硬件的应用程序(例如GPS导航仪)都应该明确地将"android.hardware.location.gps"使用功能添加到其清单中.
如果您的应用需要GPS才能正常运行且您的清单声明中未包含,则您的用户可能会遇到较差的应用体验.
此外,如果您正在使用融合位置提供商并希望从GPS接收最准确的位置样本(即使用PRIORITY_HIGH_ACCURACY),则必须在应用清单中包含"android.hardware.location.gps"功能,以确保Google Play只会将您的应用分发给配备GPS传感器的设备.
您可以在Android开发者帮助中心中详细了解此更改.
要从NETWORK_PROVIDER或GPS_PROVIDER接收位置更新,您必须通过在Android清单文件中分别声明ACCESS_COARSE_LOCATION或ACCESS_FINE_LOCATION权限来请求用户的权限.没有这些权限,您的应用程序将在请求位置更新时在运行时失败.
如果您同时使用NETWORK_PROVIDER和GPS_PROVIDER,则只需要请求ACCESS_FINE_LOCATION权限,因为它包含两个提供程序的权限.ACCESS_COARSE_LOCATION的权限仅允许访问NETWORK_PROVIDER.
警告:如果您的应用针对Android 5.0(API级别21)或更高版本,则必须声明您的应用使用清单文件中的android.hardware.location.network或android.hardware.location.gps硬件功能,具体取决于您的应用程序从NETWORK_PROVIDER或GPS_PROVIDER接收位置更新.如果您的应用从这些位置提供商来源中收到位置信息,则需要声明该应用在您的应用清单中使用这些硬件功能.在Android 5.0(API 21)之前运行版本的设备上,请求ACCESS_FINE_LOCATION或ACCESS_COARSE_LOCATION权限包括对位置硬件功能的隐含请求.但是,请求这些权限不会自动请求Android 5.0(API级别21)及更高版本上的位置硬件功能.
我正在使用融合位置提供程序,目标是API 21,并使用ACCESS_FINE_LOCATION
.我没有特别关心GPS是否可用,只是报告了最准确的位置.
android.hardware.location.gps
和android.hardware.location.network
.或者这仅适用于LocationManager
融合位置?我需要android.hardware.location.gps
和android.hardware.location.network
不?
我正在使用Android O Developer预览版4 - API 26
并且似乎是新功能,例如:
hasSpeedAccuracy()
总是回来 false
getSpeedAccuracyMetersPerSecond()
总是回来 0.0
getBearingAccuracyDegrees()
总是回来 0.0
适用于两者fused
和gps
位置提供商.我在开车时试过了.所以我speed
和bearing
他们自己但不准确.
我错过了什么吗?
请参阅此处的文档
谢谢!
在基于GPS的应用中,重要的是用户启用他的GPS.如果没有,那么通常我们会显示一个对话框,说明用户" 应该从设置启用他的GPS以便能够使用此功能 ".
当用户按下OK时,他将被重定向到Settings页面,我不喜欢这个解决方案,因为它将用户从应用程序上下文中带到了设置中.
我注意到"谷歌地图"应用程序有一个更好的解决方案,即在需要GPS功能时显示一个整洁的对话框.一旦用户选择"OK" GPS将被启用直接没有任何转向的设置.
我可以在不将用户重定向到设置屏幕的情况下启用GPS,就像在"谷歌地图"应用程序中一样吗?
看看下面的图片:
由于GDPR,我需要检查用户位置是否用户来自欧盟.直到现在我找到了这些解决方案 -
1)使用电话的语言配置获取国家(如果用户使用英语美国版本可能会误导,即使他可能来自其他国家/地区).
String locale = context.getResources().getConfiguration().locale.getCountry();
Run Code Online (Sandbox Code Playgroud)
2)使用GPS获取位置(需要位置Corse权限,我不想添加,特别是因为Android 6.0+运行时权限).
private void getCountryCode(final Location location) {
Helper.log(TAG, "getCountryCode");
AsyncTask<Void, Void, String> countryCodeTask = new AsyncTask<Void, Void, String>() {
final float latitude = (float) location.getLatitude();
final float longitude = (float) location.getLongitude();
// Helper.log(TAG, "latitude: " +latitude);
List<Address> addresses = null;
Geocoder gcd = new Geocoder(mContext);
String code = null;
@Override
protected String doInBackground(Void... params) {
try {
addresses = gcd.getFromLocation(latitude, longitude, 1);
code = …
Run Code Online (Sandbox Code Playgroud) 我安装了一个虚假的位置应用程序,并设置我的位置不同.然后打开谷歌地图和微信应用,
然后我想阻止微信分析我以前收到的真实位置和新假位置.
但同样的结果,它检测到我的真实位置.
我真的很想了解他们是如何做到这一点的.有任何想法吗?
我试过的
UPDATE
即使在禁用时也使用GPS.
07-02 11:46:15.504 2346-2356 /?D/LocationManagerService:请求434a7e28 gps从com.tencent.mm请求[ACCURACY_FINE请求gps = + 1s0ms最快= + 1s0ms](10173)
结论
我正试图通过锁定屏幕显示Google位置服务(打开GPS,网络数据等)对话框.
我正在使用KeyguardManager来禁用锁定屏幕.这可以正常工作,因为我的MainActivity能够禁用锁定屏幕.但是,只要Google位置服务对话框显示,锁定屏幕就会恢复启用,屏幕会被锁定,除非我解锁屏幕,否则无法进入我的MainActivity.
我甚至试过...... Flag_Show_When_Locked,但它没有帮助.
这是我的代码:
private KeyguardLock DisableScreenLock;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
setContentView(R.main_layout);
KeyguardManager myKeyGuard = (KeyguardManager)getSystemService(Context.KEYGUARD_SERVICE);
DisableScreenLock = myKeyGuard.newKeyguardLock("disableKeyguard");
DisableScreenLock.disableKeyguard();
}
protected synchronized void GoogleApiClient_Intialize() {
Log.e(TAG, "Building GoogleApiClient");
googleApiClient = new GoogleApiClient.Builder(this)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.build();
}
protected void LocationRequest_Intialize() {
locationRequest = new LocationRequest();
locationRequest.setInterval(UPDATE_INTERVAL_IN_MILLISECONDS);
locationRequest.setFastestInterval(FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS);
locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
}
protected void LocationSettingsRequest_Builder() {
LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder();
builder.addLocationRequest(locationRequest);
locationSettingsRequest = builder.build();
}
@Override
public void onConnected(Bundle connectionHint) {
Log.e(TAG, "GoogleApiClient is connected"); …
Run Code Online (Sandbox Code Playgroud) android lockscreen android-networking location-services android-gps
我制作了一个应用程序,它有摄像头和GPS的请求,但是当我执行时,我会多次收到此警告,而不到1秒.
W/Activity:一次只能获取一组权限)
有人可以告诉我为什么吗?
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = getIntent();
mStatusCamera = intent.getStringExtra("camera");
mScannerView = new ZXingScannerView(this) {
@Override
protected IViewFinder createViewFinderView(Context context) {
return new CustomZXingScannerView(context);
}
};
List<BarcodeFormat> formats = new ArrayList<>();
mListaPassageiros = new ArrayList<>();
formats.add(BarcodeFormat.QR_CODE);
setContentView(mScannerView);
int currentapiVersion = android.os.Build.VERSION.SDK_INT;
if (currentapiVersion >= android.os.Build.VERSION_CODES.M) {
if (!checkPermission()) {
requestPermission();
} else {
executarDepoisDaPermissao();
}
}
}
private boolean checkPermission() {
return (ContextCompat.checkSelfPermission(getApplicationContext(), CAMERA) == PackageManager.PERMISSION_GRANTED
&& ContextCompat.checkSelfPermission(getApplicationContext(), ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED
&& ContextCompat.checkSelfPermission(getApplicationContext(), …
Run Code Online (Sandbox Code Playgroud) 我的 LocationRequest 设置为 PRIORITY_HIGH_ACCURACY。但是在小米红米 Note 5 设备中,如果我在位置设置对话框中按下确定按钮,它总是通过 onActivityResult() 方法返回 0,并且我得到“com.google.android.gms.common.api.ResolvableApiException: 6: RESOLUTION_REQUIRED”。但我已经在其他一些设备上测试过它工作正常。我在片段内使用了启用/未启用 gps 检查。
/////Code that prompts up the dialog
SettingsClient client = LocationServices.getSettingsClient(getActivity ());
Task<LocationSettingsResponse> task = client.checkLocationSettings(builder.build());
task.addOnSuccessListener(getActivity (), new OnSuccessListener<LocationSettingsResponse>() {
@Override
public void onSuccess(LocationSettingsResponse locationSettingsResponse) {
// All location settings are satisfied. The client can initialize
// location requests here.
// ...
}
});
task.addOnFailureListener(getActivity (), new OnFailureListener () {
@Override
public void onFailure(@NonNull Exception e) {
if (e instanceof ResolvableApiException) {
// Location settings are …
Run Code Online (Sandbox Code Playgroud) 我只是尝试将我们的应用程序的目标和编译 API 级别更新为 29(Android 10),并注意到我无法再编译,因为LocationManager.addNmeaListener
只接受OnNmeaMessageListener
(在 API 级别 24 中引入)而不是旧的和已弃用的GpsStatus.NmeaListener
(因此,我得到“不兼容”类型:NmeaListener 不能转换为 OnNmeaMessageListener ")。
我知道这addNmeaListener(NmeaListener)
在以前的版本中已被弃用,我准备重构我的代码以针对不同的 API 级别进行分支,但是由于我找不到任何名称不同的弃用方法或 LocationManager 的任何兼容库,似乎没有办法如果我以 Android 10 为目标,则访问 Android 6 设备上的 NMEA 数据(在某些时候这将是强制性的)。
关于如何在旧设备上获取 NMEA 数据的任何建议?
如果有人对如何避免 NMEA 数据有想法,请补充一点背景知识:我们的应用程序“phyphox”旨在让学生使用手机中的传感器进行物理实验。在旧设备(Android 4+)上运行对我们来说很重要,因为在物理教育中使用智能手机传感器对于资金很少的学校和学生尤其有价值。同时,我们希望所有设备(新/旧、Android/iOS)都有可比较的实验结果。因此,我们需要 NMEA 数据来计算大地水准面以上的高度,而不是 WGS84 椭球以上的高度(由 提供Location.getAltitude()
,因此学生得到一致和可比的结果。因此,也欢迎任何关于实现这一目标的替代方法的建议。
您可以在此处查看 API 28 的当前代码:
gps android android-compatibility android-api-levels android-gps