java - Android Geolocation 在模拟器中工作但在手机中不工作
问题描述
我用地理定位制作了一个简单的应用程序,它在文本视图中显示用户的当前位置,如纬度、经度和地理编码器城市名称国家名称邮政编码等。
一切都在模拟器中完美运行,但由于某种原因,我的手机无法检索到该位置。
模拟器运行的是 android 7.1,而我的手机运行的是 android 7.0,但这应该不是问题,因为我在制作应用程序时考虑了 6.0 marshmallow。
这是代码
“主要活动”
package com.example.slimshady.LocationInfoApp;
import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.location.Address;
import android.location.Geocoder;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Build;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import java.util.List;
import java.util.Locale;
public class MainActivity extends AppCompatActivity {
LocationManager locationManager;
LocationListener locationListener;
Geocoder geocoder;
TextView latitude, longitude, city, postcode, country;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
latitude = (TextView)findViewById(R.id.latitude);
longitude = (TextView) findViewById(R.id.longitude);
city = (TextView)findViewById(R.id.city);
postcode = (TextView)findViewById(R.id.postcode);
country = (TextView)findViewById(R.id.country);
locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
locationListener = new LocationListener() {
@Override
public void onLocationChanged(Location location) {
updateLocationInfo(location);
}
@Override
public void onStatusChanged(String s, int i, Bundle bundle) {
}
@Override
public void onProviderEnabled(String s) {
}
@Override
public void onProviderDisabled(String s) {
}
};
// asking permission starts here
if (Build.VERSION.SDK_INT < 23){
// api level lower than 23 so no need to ask for permission
try {
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0,0, locationListener);
}
catch (SecurityException e){
e.printStackTrace();
}
}
else {
// api level greater than or equal to 23 checking if has permission if not VVVV this condition
// means go ask for permission
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 0);
}
else{
// means api level greater than or equal to 23 and already has permission
// so no need to go out and ask for permission
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0,0, locationListener);
// last known location because we went to this part means we have been here before
Location lastKnownLocation = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
if (lastKnownLocation != null) {
updateLocationInfo(lastKnownLocation);
}
}
}
// asking permission ends here
}
public void updateLocationInfo(Location location) {
geocoder = new Geocoder(getApplicationContext(), Locale.getDefault());
try {
List<Address> locationAddress = geocoder.getFromLocation(location.getLatitude(), location.getLongitude(),1);
if (locationAddress != null && locationAddress.size() > 0) {
latitude.setText("Latitude: "+String.valueOf(locationAddress.get(0).getLatitude()));
longitude.setText("Longitude: "+String.valueOf(locationAddress.get(0).getLongitude()));
city.setText("City: "+String.valueOf(locationAddress.get(0).getLocality()));
postcode.setText("Post Code: "+String.valueOf(locationAddress.get(0).getPostalCode()));
country.setText("Country: "+String.valueOf(locationAddress.get(0).getCountryName()));
}
}
catch (Exception e){
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
startListening();
}
}
public void startListening(){
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED){
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0,0, locationListener);
}
}
}
代码简单而基本,一切都应该正常工作,但由于某种原因它没有。
我的意思是我的物理设备中的 GPS 接收器可以与谷歌地图一起使用,所以我知道它没有损坏。
但是相同的代码在我的手机上不起作用,我已经添加了所有权限:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET"/>
看到相同的应用程序在我的物理设备上不起作用,这是我的物理设备的屏幕截图
如您所见,该位置已打开,并且在弹出窗口中询问时我已授予权限。最后但并非最不重要的一点是表明 GPS 接收器可以正常工作并且在我的物理设备中没有损坏。
解决方案
您的设备可以通过多种方式自行定位。当它们不是时,它们经常被混淆为“GPS”。
- GPS(全球定位系统)这是一个全球导航卫星系统 (GNSS),它依靠来自轨道卫星星座的信号来定位设备。GPS 特指美国国防部部署的卫星星座。替代品包括 GLONASS(俄罗斯)和 Galileo(欧洲)。
- 网络这使用 WiFi 或蓝牙信号来定位您的设备。该设备扫描发射器 ID,然后通过其 Internet 连接将这些 ID 发送到服务器以在数据库中查找。服务器以位置响应。
您的代码当前使用 only LocationManager.GPS_PROVIDER
,它仅使用卫星来定位您的设备。谷歌地图可能正在使用网络位置,当 GPS 被禁用时,它仍然可以工作。
我怀疑您需要:
- 添加
LocationManager.NETWORK_PROVIDER
或 - 在您的设备上启用 GPS。这是在设置和位置下的某个地方。
推荐阅读
- mysql - 尽管有索引,但 MySQL 的选择查询性能很差
- go - “go build -buildmode=c-shared”编译的dll,如何隐藏导出的goruntime函数?
- swift - 在 alamofire manger 类 swift 中添加公钥固定
- c# - 如何在 CSV 文件中随机生成一个单词
- vuejs2 - 当滚动条在VueJs中到达底部时如何执行功能
- node.js - 使用从另一个模块(node.js)导入的函数
- apache-spark - pyspark 加入两个数据框并按最近日期保留行
- elasticsearch - 我们可以将 char_filter 应用于 elasticsearch 中的自定义标记器吗?
- python - 序列化程序被多次调用 Django python
- image - 如何获取在您管理的 Facebook 页面上发表评论的人的用户名和照片?