saudos! amigos en esta oportunidad, me dirijo hacia ustedes can el siguiente inconveniente, estoy haciendo una app gps para que me muestra la ubicacion en el mapa, entonces, he creado un proyecto en android studio del tipo “Google Maps Activity” .
La app ya compilo y pude instalarla en mi celular con android version 8.1 el inconveniente es que no esta cargando la imagen del mapa, es decir no me muestra geograficamente la ubicacion, como la imagen a continuacion:
al momento de instalarla le di los permisos nesesarios que pide el celular, el codigo es el siguiente:
build.gradle(module app)
apply plugin: 'com.android.application'
android {
compileSdkVersion 28
defaultConfig {
applicationId "com.example.ejemplogpsmaps"
minSdkVersion 19
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
implementation 'com.google.android.gms:play-services-maps:16.1.0'
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/tvMensaje"
android:layout_width="match_parent"
android:layout_height="80dp"
android:layout_marginLeft="8dp"
android:layout_marginTop="8dp"
android:layout_marginRight="8dp"
android:text="Ubicacion"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<fragment
android:id="@+id/fragment"
android:name="com.example.ejemplogpsmaps.FragmentMaps"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:layout_marginBottom="8dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tvMensaje" />
</android.support.constraint.ConstraintLayout>
MainActivity.Java
package com.example.ejemplogpsmaps;
import android.Manifest;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.location.LocationManager;
import android.provider.Settings;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
TextView tvMensaje;
// Minimo tiempo para updates en Milisegundos
private static final long MIN_TIME = 10000; // 10 segundos
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvMensaje = findViewById(R.id.tvMensaje);
if(ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
!= PackageManager.PERMISSION_GRANTED
&& ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION,}, 1000);
} else {
iniciarLocalizacion();
}
}
private void iniciarLocalizacion() {
LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
Localizacion local = new Localizacion();
local.setMainActivity(this, tvMensaje);
final boolean gpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
if(!gpsEnabled) {
Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
startActivity(intent);
}
if(ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
!= PackageManager.PERMISSION_GRANTED
&& ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION,}, 1000);
return;
}
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, MIN_TIME, 0, local);
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, MIN_TIME, 0, local);
tvMensaje.setText("Localizacion agregada");
}
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[]grantResults) {
if(requestCode == 1000) {
if(grantResults[0] == PackageManager.PERMISSION_GRANTED) {
iniciarLocalizacion();
return;
}
}
}
}
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.ejemplogpsmaps">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="UNY GPS"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />
<meta-data
android:name="com.google.android.geo.API_KEY"
android:value="######API KEY ########" />
</application>
</manifest>
FragmentMaps.java
package com.example.ejemplogpsmaps;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
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.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;
public class FragmentMaps extends SupportMapFragment implements OnMapReadyCallback {
double lat, lon;
public FragmentMaps() { }
@Override
public View onCreateView(LayoutInflater layoutInflater, ViewGroup viewGroup, Bundle bundle) {
View rootView = super.onCreateView(layoutInflater, viewGroup, bundle);
if(getArguments() != null) {
this.lat = getArguments().getDouble("lat");
this.lon = getArguments().getDouble("lon");
}
getMapAsync(this);
return rootView;
}
localizacion.java
package com.example.ejemplogpsmaps;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationProvider;
import android.os.Bundle;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.util.Log;
import android.widget.TextView;
public class Localizacion implements LocationListener {
MainActivity mainActivity;
TextView tvMensaje;
public MainActivity getMainActivity() {
return mainActivity;
}
public void setMainActivity(MainActivity mainActivity, TextView tvMensaje) {
this.mainActivity = mainActivity;
this.tvMensaje = tvMensaje;
}
@Override
public void onLocationChanged(Location location) {
// Este metodo se ejecuta cuando el GPS recibe nuevas coordenadas
String texto = "Mi ubicación es: \n"
+ "Latitud = " + location.getLatitude() + "\n"
+ "Longitud = " + location.getLongitude();
tvMensaje.setText(texto);
mapa(location.getLatitude(), location.getLongitude());
}
public void mapa(double lat, double lon) {
// Fragment del Mapa
FragmentMaps fragment = new FragmentMaps();
Bundle bundle = new Bundle();
bundle.putDouble("lat", new Double(lat));
bundle.putDouble("lon", new Double(lon));
fragment.setArguments(bundle);
FragmentManager fragmentManager = getMainActivity().getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.add(R.id.fragment, fragment, null);
fragmentTransaction.commit();
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
switch (status) {
case LocationProvider.AVAILABLE:
Log.d("debug", "LocationProvider.AVAILABLE");
break;
case LocationProvider.OUT_OF_SERVICE:
Log.d("debug", "LocationProvider.OUT_OF_SERVICE");
break;
case LocationProvider.TEMPORARILY_UNAVAILABLE:
Log.d("debug", "LocationProvider.TEMPORARILY_UNAVAILABLE");
break;
}
}
@Override
public void onProviderEnabled(String provider) {
tvMensaje.setText("GPS Activado");
}
@Override
public void onProviderDisabled(String provider) {
tvMensaje.setText("GPS Desactivado");
}
}
como pueden ver he añadido permisos desde android studio, que estoy haciendo mal???