Hola como esta, he estado aprendiendo android, pero he dado vuelta por toda la red y no encuentro solucion, lo que pasa es que no me actualiza las cordenadas GPS no entra la LocationListener nunca, aparte aveces se cierra la apk. No se que pueda ser ya hice de todo.
package com.taxi.taxista;
import android.Manifest;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.res.Resources;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Build;
import android.os.SystemClock;
import android.provider.Settings;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.FragmentActivity;
import android.os.Bundle;
import android.support.v7.app.AlertDialog;
import android.view.View;
import android.widget.Button;
import android.widget.Chronometer;
import android.widget.TabHost;
import android.widget.Toast;
import com.google.android.gms.maps.CameraUpdate;
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.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;
import Conexion.ConexionHTTP;
public class CordenadasMaps extends FragmentActivity implements OnMapReadyCallback, LocationListener {
private GoogleMap mMap;
private Marker marcador;
private LocationManager locationManager;
//private LocationListener locationListener;
private double latitud;
private double longitud;
private Chronometer reloj;
private short FlagThear = 0, PrimeraVez = 0;
private long TIME_HILO = 3000;
private Button Activ, Desact;
private String ID;
AlertDialog alert = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_cordenadas_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);
Resources res = getResources();
TabHost tabs = (TabHost) findViewById(android.R.id.tabhost);
tabs.setup();
TabHost.TabSpec spec = tabs.newTabSpec("mitab1");
spec.setContent(R.id.tab1);
spec.setIndicator("",
res.getDrawable(R.drawable.mapa));
tabs.addTab(spec);
spec = tabs.newTabSpec("mitab2");
spec.setContent(R.id.tab2);
spec.setIndicator("",
res.getDrawable(R.drawable.taximetro));
tabs.addTab(spec);
spec = tabs.newTabSpec("mitab3");
spec.setContent(R.id.tab3);
spec.setIndicator("",
res.getDrawable(android.R.drawable.ic_delete));
tabs.addTab(spec);
tabs.setCurrentTab(0);
Activ = (Button) findViewById(R.id.btn_activar);
Desact = (Button) findViewById(R.id.btn_desactivar);
Bundle datos = getIntent().getExtras();
ID = datos.getString("ID");
//hilo();
}
@Override
public void onRequestPermissionsResult(int requestCode,String[] permissions,int[] grantResults) {
//super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case 10:
VerificaPermiso();
break;
default:
break;
}
}
public void VerificaPermiso() {
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED &&
ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.INTERNET}, 10);
}
System.out.println("ENTRO AQUI");
return;
}
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);
criteria.setAltitudeRequired(false);
criteria.setBearingRequired(false);
criteria.setCostAllowed(true);
criteria.setPowerRequirement(Criteria.POWER_LOW);
String provider = locationManager.getBestProvider(criteria, true);
System.out.println("provider" + provider);
if (provider != null) {
locationManager.requestLocationUpdates(provider, 0, 0, CordenadasMaps.this);
}
}
public void setLatLon(double longitud, double latitud) {
this.longitud = longitud;
this.latitud = latitud;
System.out.println("1 " + this.longitud);
System.out.println("1 " + this.latitud);
}
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
System.out.println("1");
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
mMap.setOnMapLongClickListener(new GoogleMap.OnMapLongClickListener() {
@Override
public void onMapLongClick(LatLng latLng) {
mMap.addMarker(new MarkerOptions()
//.icon(BitmapDescriptorFactory.fromResource())
.position(latLng));
}
});
mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
@Override
public boolean onMarkerClick(Marker marker) {
Toast.makeText(getApplicationContext(), "Presiono", Toast.LENGTH_SHORT).show();
return false;
}
});
//VerificaPermiso();
checkLocation();
VerificaPermiso();
PosicionActual();
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return;
}
mMap.setMyLocationEnabled(true);
}
@Override
protected void onPause() {
super.onPause();
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);
criteria.setAltitudeRequired(false);
criteria.setBearingRequired(false);
criteria.setCostAllowed(true);
criteria.setPowerRequirement(Criteria.POWER_LOW);
String provider = locationManager.getBestProvider(criteria, true);
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED &&
ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.ACCESS_COARSE_LOCATION,Manifest.permission.INTERNET},10);
}
return;
}
else{
if (provider != null) {
locationManager.removeUpdates(this);
}
}
}
else{
if (provider != null) {
locationManager.removeUpdates(this);
}
}
}
public void PosicionActual(){
Location lugar = null;
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);
criteria.setAltitudeRequired(false);
criteria.setBearingRequired(false);
criteria.setCostAllowed(true);
criteria.setPowerRequirement(Criteria.POWER_LOW);
String provider = locationManager.getBestProvider(criteria, true);
System.out.println("provider" + provider);
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED &&
ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.ACCESS_COARSE_LOCATION,Manifest.permission.INTERNET},10);
}
return;
}
else{
if (provider != null) {
System.out.println("3");
lugar=locationManager.getLastKnownLocation(provider);
}
}
}
else{
if (provider != null) {
System.out.println("3a");
lugar=locationManager.getLastKnownLocation(provider);
}
}
if(lugar!=null) {
try {
setLatLon(lugar.getLongitude(), lugar.getAltitude());
}catch (Exception e){
setLatLon(0.0,0.0);
}
}
//agregarmarcador(lugar.getAltitude(),lugar.getLongitude());
actualizarUbicacion(lugar);
}
private void agregarmarcador(double lat, double log){
LatLng coordenadas = new LatLng(lat,log);
CameraUpdate miUbicacion = CameraUpdateFactory.newLatLngZoom(coordenadas,16);
if(marcador!=null)marcador.remove();
marcador=mMap.addMarker(new MarkerOptions().position(coordenadas)
.title("Mi posicion Actual")
.icon(BitmapDescriptorFactory.fromResource(R.mipmap.ic_launcher)));
mMap.animateCamera(miUbicacion);
}
private void actualizarUbicacion(Location location){
if(location!=null){
latitud=location.getLatitude();
longitud=location.getLongitude();
agregarmarcador(latitud,longitud);
}
}
public void iniciarReloj(View view){
reloj = (Chronometer)findViewById(R.id.reloj);
reloj.setBase(SystemClock.elapsedRealtime());
reloj.start();
}
@Override
public void onBackPressed() {
//super.onBackPressed();
}
@Override
public void onLocationChanged(Location location) {
System.out.println("Entro al listener");
Toast.makeText(getApplicationContext(), "Cambio de posicion", Toast.LENGTH_SHORT).show();
actualizarUbicacion(location);
hilo();
}
@Override
public void onStatusChanged(String s, int i, Bundle bundle) {
}
@Override
public void onProviderEnabled(String s) {
}
@Override
public void onProviderDisabled(String s) {
Intent i = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
startActivity(i);
}
public void hilo(){
System.out.println("ENTRO AL HILO");
Thread tr = new Thread(){
@Override
public void run(){
while(FlagThear==1) {
ConexionHTTP HttpPOST = new ConexionHTTP();
try {
final String Respuesta = HttpPOST.EnviarDatosGPS(String.valueOf(longitud), String.valueOf(latitud), "http://ecuataxi.grupomeraki.org/php/coordenadas.php",ID);
System.out.println("Respuesta: "+Respuesta);
}
catch (Exception e){
}
runOnUiThread(new Runnable() {
@Override
public void run() {
}
});
try {
Thread.sleep(TIME_HILO);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
if(PrimeraVez==0) {
tr.start();
PrimeraVez=1;
}
}
public void Activar(View view){
FlagThear=1;
PrimeraVez=0;
//hilo();
Activ.setEnabled(false);
Desact.setEnabled(true);
}
public void Desactivar(View view){
FlagThear=0;
Activ.setEnabled(true);
Desact.setEnabled(false);
}
private boolean checkLocation() {
if (!isLocationEnabled())
AlertNoGps();
return isLocationEnabled();
}
private void showAlert() {
Thread tr = new Thread() {
@Override
public void run(){
while(true) {
final AlertDialog.Builder dialog = new AlertDialog.Builder(CordenadasMaps.this);
dialog.setCancelable(false);
dialog.setTitle("Enable Location")
.
setMessage("Su ubicación esta desactivada.\npor favor active su ubicación " +
"usa esta app")
.
setPositiveButton("Configuración de ubicación", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface paramDialogInterface, int paramInt) {
Intent myIntent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
startActivity(myIntent);
return;
}
})
.
setNegativeButton("Cancelar", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface paramDialogInterface, int paramInt) {
return;
}
});
dialog.show();
}
}
};
tr.start();
}
private boolean isLocationEnabled() {
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);
criteria.setAltitudeRequired(false);
criteria.setBearingRequired(false);
criteria.setCostAllowed(true);
criteria.setPowerRequirement(Criteria.POWER_LOW);
String provider = locationManager.getBestProvider(criteria, true);
if(provider!=null){
return locationManager.isProviderEnabled(provider);
}else {
return locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) ||
locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
}
}
private void AlertNoGps() {
Thread hil = new Thread() {
@Override
public void run(){
final AlertDialog.Builder builder = new AlertDialog.Builder(CordenadasMaps.this);
builder.setMessage("El sistema GPS esta desactivado, ¿Desea activarlo?")
.setCancelable(false)
.setPositiveButton("Si",new DialogInterface.OnClickListener() {
public void onClick ( @SuppressWarnings("unused") final DialogInterface dialog,
@SuppressWarnings("unused") final int id){
startActivity(new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS));
}
})
.setNegativeButton("No",new DialogInterface.OnClickListener() {
public void onClick ( final DialogInterface dialog,
@SuppressWarnings("unused") final int id){
dialog.cancel();
}
});
alert =builder.create();
alert.show();
}
};
hil.start();
}
@Override
protected void onDestroy(){
super.onDestroy();
if(alert != null)
{
alert.dismiss ();
}
}
}
Disculpen mi idnorancia.