java - Android Studio Google Map 应用程序不再显示地图
问题描述
我一直在为一个项目开发一个小型应用程序,该项目旨在显示用户的位置并在他们四处移动时跟踪他们,同时让他们显示标记。直到今天我启动应用程序并发现它不再显示地图之前,这一切都很好。Google 徽标与缩放选项一起显示在页面底部,但地图本身永远不会加载。这是我的地图活动的代码。
import androidx.annotation.NonNull;
import androidx.core.app.ActivityCompat;
import androidx.fragment.app.FragmentActivity;
import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.location.Address;
import android.location.Criteria;
import android.location.Geocoder;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.UiSettings;
import com.google.android.gms.maps.model.BitmapDescriptor;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MapStyleOptions;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;
import com.google.android.gms.maps.GoogleMap.OnMarkerClickListener;
import com.google.firebase.firestore.FirebaseFirestore;
import java.io.IOException;
import java.util.List;
public class MapsActivity extends FragmentActivity implements OnMapReadyCallback{
private GoogleMap mMap;
LocationManager locationManager;
private static final int REQUEST_LOCATION_PERMISSION = 1;
Marker mMarker;
LocationListener locationListener;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_maps);
// Obtain the SupportMapFragment and get notified when the map is ready to be used.
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED)
{
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_LOCATION_PERMISSION);
}
locationListener = new LocationListener() {
@Override
public void onLocationChanged(Location location) {
double latitude = location.getLatitude();
double longitude = location.getLongitude();
//get the location name from latitude and longitude
Geocoder geocoder = new Geocoder(getApplicationContext());
try {
List<Address> addresses =
geocoder.getFromLocation(latitude, longitude, 1);
String result = addresses.get(0).getLocality()+":";
result += addresses.get(0).getCountryName();
LatLng latLng = new LatLng(latitude, longitude);
if (mMarker != null){
mMarker.remove();
mMarker = mMap.addMarker(new MarkerOptions().position(latLng).title(result));
mMap.setMaxZoomPreference(21);
}
else {
mMarker = mMap.addMarker(new MarkerOptions().position(latLng).title(result));
mMap.setMaxZoomPreference(21);
mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, 20.0f));
}
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onProviderDisabled(String provider) {
}
};
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 400, 0, locationListener);
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 400, 0, locationListener);
}
@Override
public void onMapReady(GoogleMap googleMap){
mMap = googleMap;
mMap.setMapStyle(MapStyleOptions.loadRawResourceStyle(this, R.raw.style_json));
//Setting Map zoom controls to be enabled
mMap.getUiSettings().setZoomControlsEnabled(true);
mMap.getUiSettings().setZoomGesturesEnabled(true);
mMap.setOnMapLongClickListener(new GoogleMap.OnMapLongClickListener(){
public void onMapLongClick(LatLng latLng){
//creating marker
MarkerOptions markerOptions = new MarkerOptions();
//set marker position
markerOptions.position(latLng);
//set latitude and longitude on marker
markerOptions.title(latLng.latitude+ " : " + latLng.longitude);
//clear the previous click position
mMap.clear();
//add marker on map
mMap.addMarker(markerOptions);
}
});
}
@Override
protected void onStop() {
super.onStop();
locationManager.removeUpdates(locationListener);
}
}
这是我在运行地图活动后重复出现的错误消息
W/System.err: java.io.IOException: grpc failed
W/System.err: at android.location.Geocoder.getFromLocation(Geocoder.java:136)
at com.example.pubapp.MapsActivity$1.onLocationChanged(MapsActivity.java:65)
at android.location.LocationManager$ListenerTransport._handleMessage(LocationManager.java:371)
at android.location.LocationManager$ListenerTransport.access$000(LocationManager.java:300)
at android.location.LocationManager$ListenerTransport$1.handleMessage(LocationManager.java:316)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
就像我昨晚说的,这个应用程序运行得非常好,从那以后我没有真正改变任何东西,除了添加了几个当前未使用的活动。我已经尝试更改 API 密钥,使用新的模拟器并在 android studio 上进行全新安装,但到目前为止没有任何效果。
解决方案
今天打开项目,发现重启我的电脑已经解决了这个问题,不再出现错误,地图显示正常。
推荐阅读
- laravel - vpc中的Laravel,无需程序访问即可访问sqs
- python - 可以结合 swig 生成的数据类型和 ctypes 函数
- reactjs - antd中如何改变Upload.Dragger的高度?
- sql - 优化oracle SQL UNION查询
- python - 通过 POST 方法发送数据以显示在 AJAX 请求中
- node.js - createWriteStream 和路径不起作用
- c# - OneTimeTearDown 中抛出异常;未标记为失败的测试
- c# - 如何在 NSubstitute 3.1 中使用 ref 参数引发委托事件?
- batch-file - 从批处理文件调用 MSXSL
- python-3.x - 如何在我的 dash 应用程序中使用多个资产文件夹?