1
Good afternoon, everyone.
I’m using Google Maps in my app and was working before but stopped working.
The app breaks while the map is being loaded. I’ve researched enough on the internet and no solution solved the problem.
From what little I understood it’s as if the app isn’t able to set the location points on the map but I’m not sure that’s the problem.
I have the Google Maps API key within the project.
Follow code and log below.
Manifest.xml
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_shop"
android:label="@string/app_name"
android:roundIcon="@mipmap/achei_aqui_round"
android:supportsRtl="true"
android:theme="@style/AppTheme"
>
<uses-library android:name="org.apache.http.legacy" android:required="false"/>
<activity android:name="com.acheiAqui.View.SplashScreenActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="com.acheiAqui.View.HomeActivity" />
<activity android:name="com.acheiAqui.Control.LoginActivity" />
<activity android:name="com.acheiAqui.Control.RegisterUserActivity"></activity>
<activity android:name="com.acheiAqui.Control.RegisterInfoShopActivity" />
<activity android:name="com.acheiAqui.Control.RegisterFoodListActivity" />
<activity android:name="com.acheiAqui.Control.RegisterLocationActivity" />
<activity android:name="com.acheiAqui.View.ProfileShopActivity" />
<meta-data
android:name="com.google.android.geo.API_KEY"
android:value="@string/google_maps_key" />
</application>
build.Gradle
apply plugin: 'com.android.application'
android {
compileSdkVersion 30
defaultConfig {
applicationId "acheiaqui.com.acheiaqui"
minSdkVersion 19
targetSdkVersion 30
versionCode 1
versionName "1.1"
testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'
vectorDrawables.useSupportLibrary = true
buildToolsVersion "29.0.2"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'androidx.constraintlayout:constraintlayout:2.0.1'
implementation 'androidx.annotation:annotation:1.1.0'
implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
implementation 'androidx.navigation:navigation-fragment:2.3.0'
implementation 'androidx.navigation:navigation-ui:2.3.0'
// implementation group: 'com.android.tools.build', name: 'gradle', version: '3.2.1'
implementation 'com.google.firebase:firebase-database:19.4.0'
implementation 'com.google.firebase:firebase-storage:19.2.0'
implementation 'com.google.firebase:firebase-auth:19.4.0'
implementation 'com.google.firebase:firebase-database:19.4.0'
implementation group: 'com.google.android.gms', name: 'play-services-maps', version: '17.0.0'
implementation group: 'com.google.android.gms', name: 'play-services-location', version: '17.0.0'
implementation group: 'com.google.android.gms', name: 'play-services-analytics', version: '17.0.0'
implementation group: 'com.google.android.gms', name: 'play-services-nearby', version: '17.0.0'
testImplementation 'junit:junit:4.13'
androidTestImplementation 'androidx.test.ext:junit:1.1.2'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
//Picaso for Photos
implementation group: 'com.squareup.picasso', name: 'picasso', version: '2.8'
//Material Design
implementation 'com.google.android.material:material:1.3.0-alpha02'
}
apply plugin: 'com.google.gms.google-services'
Java homeactivity.
package com.acheiAqui.View;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Build;
import android.provider.Settings;
import androidx.appcompat.app.AlertDialog;
import androidx.core.app.ActivityCompat;
import androidx.fragment.app.FragmentActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
import com.acheiAqui.Control.LoginActivity;
import com.acheiAqui.Model.Shop;
import com.acheiAqui.Control.RegisterInfoShopActivity;
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.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.CameraPosition;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;
import java.util.ArrayList;
import java.util.Map;
import acheiaqui.com.acheiAqui.R;
public class HomeActivity extends FragmentActivity implements OnMapReadyCallback, LocationListener {
private GoogleMap mMap;
private Marker currentLocationMaker;
private LatLng currentLocationLatLong;
private DatabaseReference mDatabase;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
mDatabase = FirebaseDatabase.getInstance().getReference();
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
Intent intent = getIntent();
intent.getExtras();
if(intent.hasExtra("success")){
Toast.makeText(this, intent.getStringExtra("success"), Toast.LENGTH_SHORT).show();
}
mapFragment.getMapAsync(this);
startGettingLocations();
getMarkers();
}
//funcao que carrega o mapa quando o aplicativo e aberto
public void onMapReady(GoogleMap googleMap)
{
mMap = googleMap;
/*
MarkerOptions markerShop = new MarkerOptions();
markerShop.icon(BitmapDescriptorFactory.fromResource(R.mipmap.ic_shop));
MarkerOptions markerAtualLocation = new MarkerOptions();
markerAtualLocation.icon(BitmapDescriptorFactory.fromResource(R.mipmap.ic_shop_round));*/
}
//funcao que pega a localizacao atual do cliente, caso este permita que sua localizacao seja utilizada,
// plota um marcador no mapa e coloca foco do mapa nessa atual localizacao
public void onLocationChanged(Location location) {
//quando a localizacao atual do usuario mudar, ele retira o marcador anterior, caso tenha existido, e cria outro
if (currentLocationMaker != null) {
currentLocationMaker.remove();
}
//adiciona o marcador com a localizacao atual do usuario
currentLocationLatLong = new LatLng(location.getLatitude(), location.getLongitude());
MarkerOptions markerOptions = new MarkerOptions();
markerOptions.position(currentLocationLatLong);
markerOptions.title("Localização atual");
markerOptions.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_GREEN));
currentLocationMaker = mMap.addMarker(markerOptions);
currentLocationMaker.setDraggable(true); //permite que o marcador possa ser trocado de lugar
//quando a localizacao atual do usuario muda, o foco do mapa muda para o ponto atual do usuario e aumenta
//o zoom do mapa, mostrando mais detalhes do mesmo
CameraPosition cameraPosition = new CameraPosition.Builder().zoom(17).target(currentLocationLatLong).build();
mMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
//Toast.makeText(this, "Localização atualizada", Toast.LENGTH_SHORT).show();
getMarkers();
}
private ArrayList<String> findUnAskedPermissions(ArrayList<String> wanted) {
ArrayList<String> result = new ArrayList<>();
for (String perm : wanted) {
if (!hasPermission(perm)) {
result.add(perm);
}
}
return result;
}
private boolean hasPermission(String permission) {
if (canAskPermission()) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
return (checkSelfPermission(permission) == PackageManager.PERMISSION_GRANTED);
}
}
return true;
}
//caso a versao do celular seja maior que a marshmallow, o aplicativo pergunta se pode usar a localizacao
//do usuario, caso contrario, ele ja tem essa informacao a partir das confifuracoes do arquivo do manifest
private boolean canAskPermission() {
return (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP_MR1);
}
//funcao que verifica se o GPS do usuario esta ativado, e caso nao esteja, perguna ao mesmo se deseja ativa-lo
public void showSettingsAlert() {
AlertDialog.Builder alertDialog = new AlertDialog.Builder(this);
alertDialog.setTitle("GPS desativado!");
alertDialog.setMessage("Ativar GPS?");
alertDialog.setPositiveButton("Sim", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
startActivity(intent);
}
});
alertDialog.setNegativeButton("Não", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
alertDialog.show();
}
//funcao que pega a localizaao atual do usuario, via GPS ou via Internet
private void startGettingLocations() {
LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
boolean isGPS = false;
if (lm != null) {
isGPS = lm.isProviderEnabled(LocationManager.GPS_PROVIDER);
}
boolean isNetwork = false;
if (lm != null) {
isNetwork = lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
}
boolean canGetLocation = true;
int ALL_PERMISSIONS_RESULT = 101;
long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10;// Distance in meters
long MIN_TIME_BW_UPDATES = 1000 * 10;// Time in milliseconds
ArrayList<String> permissions = new ArrayList<>();
ArrayList<String> permissionsToRequest;
permissions.add(android.Manifest.permission.ACCESS_FINE_LOCATION);
permissions.add(android.Manifest.permission.ACCESS_COARSE_LOCATION);
permissionsToRequest = findUnAskedPermissions(permissions);
//Verifica se o GPS ou Internet do usuario esta ligada, caso nao esteja, pergunta se o mesmo deseja ativa-la
if (!isGPS && !isNetwork) {
showSettingsAlert();
} else {
//verifica permissoes de uso do GPS para versoes anteriores ao marshmallow
//para versoes anteriores ao marshmallow, a localizacao ja pode ser adquirida a partir da
//configucao do arquivo do manifest
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (permissionsToRequest.size() > 0) {
requestPermissions(permissionsToRequest.toArray(new String[permissionsToRequest.size()]),
ALL_PERMISSIONS_RESULT);
canGetLocation = false;
}
}
}
//verfica se a permissao para utilizar a localizacao foi concedida
if (ActivityCompat.checkSelfPermission(this,
android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED &&
ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION)
!= PackageManager.PERMISSION_GRANTED) {
Toast.makeText(this, "Permissão negada", Toast.LENGTH_SHORT).show();
return;
}
//atualiza a localizacao do usuario, a partir do GPS ou Intenet
if (canGetLocation) {
if (isGPS) lm.requestLocationUpdates(
LocationManager.GPS_PROVIDER,
MIN_TIME_BW_UPDATES,
MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
else if (isNetwork) {
lm.requestLocationUpdates(
LocationManager.NETWORK_PROVIDER,
MIN_TIME_BW_UPDATES,
MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
}
} else {
Toast.makeText(this, "Não é possível obter a localização", Toast.LENGTH_SHORT).show();
}
}
private void getMarkers(){
mDatabase.child("shop").addListenerForSingleValueEvent(
new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
//Get map of users in datasnapshot
if (dataSnapshot.getValue() != null) {
getAllLocations((Map<String,Object>) dataSnapshot.getValue());
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
//handle databaseError
}
});
}
private void getAllLocations(Map<String, Object> locations) {
for (Map.Entry<String, Object> entry : locations.entrySet()) {
Shop shop = new Shop();
Map singleLocation = (Map) entry.getValue();
shop.setName((String) singleLocation.get("name"));
shop.setInfo((String) singleLocation.get("info"));
shop.setId((String) singleLocation.get("id"));
shop.setReference((String) singleLocation.get("reference"));
shop.setFood((String) singleLocation.get("food"));
shop.setLatitude((Double) singleLocation.get("latitude"));
shop.setLongitude((Double) singleLocation.get("longitude"));
LatLng latLng = new LatLng(shop.getLatitude(), shop.getLongitude());
addGreenMarker(shop, latLng).setTag(shop);
mMap.setOnInfoWindowClickListener(new GoogleMap.OnInfoWindowClickListener() {
@Override
public void onInfoWindowClick(Marker marker) {
Shop actualShop = (Shop) marker.getTag();
Intent intent = new Intent(HomeActivity.this, ProfileShopActivity.class);
intent.putExtra("name", actualShop.getName());
intent.putExtra("info", actualShop.getInfo());
intent.putExtra("id", actualShop.getId());
intent.putExtra("reference", actualShop.getReference());
intent.putExtra("food", actualShop.getFood());
startActivity(intent);
}
});
}
}
private Marker addGreenMarker(final Shop shop, LatLng latLng) {
MarkerOptions markerOptions = new MarkerOptions();
markerOptions.position(latLng);
markerOptions.title(shop.getName());
markerOptions.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_VIOLET));
Marker shopMarker = mMap.addMarker(markerOptions);
return shopMarker;
}
//funcoes padroes da classe LocationListerner. Nao foi necessario sobrescreve-las para manipular o mapa
//e a localizacao atual do usuario
@Override
public void onStatusChanged(String provider,int status, Bundle extras){
}
@Override
public void onProviderEnabled(String provider){
}
@Override
public void onProviderDisabled(String provider){
}
public void registerNewShop(View view){
Intent intent = new Intent(this, LoginActivity.class);
startActivity(intent);
}
}
Shop java.
package com.acheiAqui.Model;
import android.widget.TextView;
public class Shop
{
private String id;
private String name;
private String info;
private String reference;
private String food;
private double latitude;
private double longitude;
public Shop(String name, String info, String reference, String food, double latitude, double longitude)
{
this.name = name;
this.info = info;
this.reference = reference;
this.food = food;
this.latitude = latitude;
this.longitude = longitude;
}
public Shop(){
}
public String getFood() {
return food;
}
public void setFood(String food) {
this.food = food;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
public String getReference() {
return reference;
}
public void setReference(String reference) {
this.reference = reference;
}
public double getLatitude() {
return latitude;
}
public void setLatitude(double latitude) {
this.latitude = latitude;
}
public double getLongitude() {
return longitude;
}
public void setLongitude(double longitude) {
this.longitude = longitude;
}
}
activity_home.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
tools:context="com.acheiAqui.View.HomeActivity">
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:map="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/map"
android:name="com.google.android.gms.maps.SupportMapFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.acheiAqui.View.HomeActivity" />
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/imageButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_margin="30dp"
android:clickable="true"
android:onClick="registerNewShop"
android:rotation="0"
android:background="@android:color/background_dark"
app:srcCompat="@drawable/ic_input_add"
/>
</RelativeLayout>
Log of Android Studio
020-09-28 17:52:46.867 29307-29307/? E/cr_BTSPrefs: No data found for task id: 53
2020-09-28 17:52:46.868 29307-29307/? E/cr_BkgrdTaskScheduler: Task cannot be canceled because no data was found instorage or data was invalid
2020-09-28 17:52:55.538 22149-22149/? E/ActivityThread: Service com.android.providers.downloads.DownloadJobService has leaked ServiceConnection android.media.MediaScannerConnection@1695918 that was originally bound here
android.app.ServiceConnectionLeaked: Service com.android.providers.downloads.DownloadJobService has leaked ServiceConnection android.media.MediaScannerConnection@1695918 that was originally bound here
at android.app.LoadedApk$ServiceDispatcher.<init>(LoadedApk.java:1619)
at android.app.LoadedApk.getServiceDispatcher(LoadedApk.java:1511)
at android.app.ContextImpl.bindServiceCommon(ContextImpl.java:1674)
at android.app.ContextImpl.bindService(ContextImpl.java:1627)
at android.content.ContextWrapper.bindService(ContextWrapper.java:698)
at android.media.MediaScannerConnection.connect(MediaScannerConnection.java:119)
at com.android.providers.downloads.DownloadScanner.requestScan(DownloadScanner.java:140)
at com.android.providers.downloads.DownloadScanner.requestScanBlocking(DownloadScanner.java:85)
at com.android.providers.downloads.DownloadThread.run(DownloadThread.java:434)
2020-09-28 17:52:55.570 22149-29482/? E/MediaScannerService: Exception in handleMessage
java.lang.NullPointerException: url
at com.android.internal.util.Preconditions.checkNotNull(Preconditions.java:128)
at android.content.ContentResolver.delete(ContentResolver.java:1677)
at com.android.providers.downloads.DownloadScanner.onScanCompleted(DownloadScanner.java:184)
at android.media.MediaScannerConnection$1.scanCompleted(MediaScannerConnection.java:53)
at com.android.providers.media.MediaScannerService$ServiceHandler.handleMessage(MediaScannerService.java:226)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:193)
at com.android.providers.media.MediaScannerService.run(MediaScannerService.java:162)
at java.lang.Thread.run(Thread.java:764)
2020-09-28 17:52:55.796 1126-1126/? E/lowmemorykiller: Error writing /proc/29376/oom_score_adj; errno=22
2020-09-28 17:52:55.797 1126-1126/? E/lowmemorykiller: Error writing /proc/29361/oom_score_adj; errno=22
2020-09-28 17:52:55.799 1126-1126/? E/lowmemorykiller: Error writing /proc/29361/oom_score_adj; errno=22android.media.MediaScannerConnection$1.scanCompleted(MediaScannerConnection.java:53)
at com.android.providers.media.MediaScannerService$ServiceHandler.handleMessage(MediaScannerService.java:226)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:193)
at com.android.providers.media.MediaScannerService.run(MediaScannerService.java:162)
at java.lang.Thread.run(Thread.java:764)
2020-09-28 17:52:55.796 1126-1126/? E/lowmemorykiller: Error writing /proc/29376/oom_score_adj; errno=22
2020-09-28 17:52:55.797 1126-1126/? E/lowmemorykiller: Error writing /proc/29361/oom_score_adj; errno=22
2020-09-28 17:52:55.799 1126-1126/? E/lowmemorykiller: Error writing /proc/29361/oom_score_adj; errno=22
2020-09-28 17:54:43.345 29792-29792/acheiaqui.com.acheiaqui E/AndroidRuntime: FATAL EXCEPTION: main
Process: acheiaqui.com.acheiaqui, PID: 29792
java.lang.NullPointerException: Attempt to invoke virtual method 'double java.lang.Double.doubleValue()' on a null object reference
at com.acheiAqui.View.HomeActivity.getAllLocations(HomeActivity.java:254)
at com.acheiAqui.View.HomeActivity.access$000(HomeActivity.java:43)
at com.acheiAqui.View.HomeActivity$3.onDataChange(HomeActivity.java:232)
at com.google.firebase.database.Query$1.onDataChange(Query.java:179)
at com.google.firebase.database.core.ValueEventRegistration.fireEvent(ValueEventRegistration.java:75)
at com.google.firebase.database.core.view.DataEvent.fire(DataEvent.java:63)
at com.google.firebase.database.core.view.EventRaiser$1.run(EventRaiser.java:55)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6912)
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:860)
Put the question on this site: https://android.stackexchange.com/ I think that there it will have more chances to be answered(the site is in English)
– Codigo de Senior
It may be the problem of Internet connection if there is not a big problem. I have faced the same type of problem a few times. Because of my bad Internet connection. Google Maps is not loading well.
– NormanOwens