Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

sergioas

Android Map nao Localiza o Usuario no Mapa

Recommended Posts

Bom Dia,

Estou iniciando em android e fazendo um app basico de localizacao em tempo real do usuario.

Criei uma activity basica de map, e fiz a codificacao para utilizar o gps e ir atualizando conforme o usuario se movimenta, e mostrando a localizacao no mapa de ruas.

Quando simulo no meu celular o app roda e mostra o mapa, mas vejo que NAO ATIVA O GPS, quando o app abre, e consequentemente nao mostra a localizacao do usuario.

Deve estar acontecendo algo com a permissao em tempo real, que eu nao sei como fazer.

Pelo Log que coloquei ele entra no if da permissao.

Se alguem conseguir me ajudar...

 

Segue minha activity e meu Manifest.

 

 

Activity:

 

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback, LocationListener {

private GoogleMap mMap;
private Marker marcador;
double lat = 0.0;
double lng = 0.0;

private int precisaoMinimaExigida = 2000; // Precisão do serviço de localização em metros.

private int intervaloTempoLeituraGPS = 5000; // De quanto em quanto tempo (milissegundos) avisará que mudou de posição.
private int distanciaLeituraGPS = 0; // De quantos em quantos metros avisará que mudou a posição.

private int intervaloTempoREDE = 5000; // De quanto em quanto tempo (milissegundos) avisará que mudou de posição.
private int distanciaREDE = 0; // De quantos em quantos metros avisará que mudou posição.

// Define os elementos visuais para exposição das informações no dispositivo.
// private EditText editTextPosicoes;
// private ScrollView scroller;

// Define o gerenciador de localização.
private LocationManager locationManager;

// Filtro para definir o evento de broadcast que o app aguardará.
// No caso "android.location.LocationManager.PROVIDERS_CHANGED_ACTION".
private IntentFilter filter;

// Caixa de diálogo para interação com o usuário.
private AlertDialog alert;

// Variáveis de controle dos provedores de localização habilitados na configuração do Android.
private Boolean provedorGPS_Habilitado;
private Boolean provedorREDE_Habilitado;

// Cria um Broadcast Receiver para que a MainActivity seja avisada caso o usuário mude as configurações de localização por fora do app
// (deslizando a tela para baixo e clicando no ícone do GPS, por exemplo).
// Isso é necessário porque durante a execução, o usuário tem como mudar as configurações de localização sem usar o próprio aplicativo.
BroadcastReceiver bReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context arg0, Intent arg1) {
// Chama o método que localiza o usuário.
localizarUsuario();
}
};

@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);


///////

// Registra o receiver para que o app seja avisado quando o usuário modificar as configurações de localização do dispositivo.
filter = new IntentFilter(android.location.LocationManager.PROVIDERS_CHANGED_ACTION);
this.registerReceiver(bReceiver, filter);


localizarUsuario();
}


public void localizarUsuario() {

// Este método efetivamente realiza a localização do usuário, configurando um "locationManager".
// Através do locationManager o dispositivo utiliza ou o GPS ou a REDE para descobrir a localização
// do usuário. Note que, na configuração do aparelho, podem estar habilitados ambos os métodos,
// algum deles, ou nenhum. Para cada caso, uma mensagem de alerta deverá ser mostrada,
// questionando o usuário se deseja ligar as ferramentas de localização.

try {

// Obtém o locationManager.
locationManager = (LocationManager) getSystemService(getApplicationContext().LOCATION_SERVICE);

// Há provedores de localização diversos.
// O GPS_PROVIDER usa o hardware de GPS dispositivo para obter localização via satélite.
// O NETWORK_PROVIDER obterá a localização a partir da triangulação de antenas da rede de telefonia celular.

// Verifica se os provedores de localização estão habilitados.
provedorREDE_Habilitado = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
provedorGPS_Habilitado = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);


// Caso não haja nenhum provedor de localização habilitado...
if (!provedorREDE_Habilitado && !provedorGPS_Habilitado) {
Log.i("PROVEDORES","NAO ESTAO HABILITADOS");
// Não há provedores de localização habilitados.
// Perguntar ao usuário se deseja habilitar.

// Monta a caixa de diálogo.
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
alertDialogBuilder
.setMessage("O serviço de localização está desabilitado. Deseja mudar a configuração?")
.setCancelable(false)
.setPositiveButton("Configurar", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
abreConfiguracaoDoDispositivo();
}
});

alertDialogBuilder.setNegativeButton("Cancelar", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
// editTextPosicoes.setText("Selecione uma forma de obter a localização\npelo menu Configurar.");
}
});

alert = alertDialogBuilder.create();

// Mostra a caixa de diálogo.
if (!alert.isShowing()) {
alert.show();
}


} else {
Log.i("PROVEDORES"," ESTAO HABILITADOS");

// Se serviço de localização já foi configurado...
if (provedorGPS_Habilitado) {
configuraProvedorGPS();
Log.i("CONFIGURANDO GPS","CONFIGURANDO GPS");
} else {

// Caso apenas o serviço de localização por REDE esteja habilitado, sugere o GPS.

// Monta a caixa de diálogo.
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
alertDialogBuilder
.setMessage("Gostaria de habilitar o GPS para uma precisão maior?")
.setCancelable(false)
.setPositiveButton("Sim", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
abreConfiguracaoDoDispositivo();
}
});

alertDialogBuilder.setNegativeButton("Não", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
configuraProvedorREDE();
}
});

alert = alertDialogBuilder.create();

// Mostra a caixa de diálogo.
if (!alert.isShowing()) {
alert.show();
}

}

}

} catch (Exception e) {
Log.i("gps", e.getMessage() + " " + e.getLocalizedMessage());
}
}


public void abreConfiguracaoDoDispositivo() {
// Este método abre a tela de congifuração de localização do dispositivo.

Intent callGPSSettingIntent = new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS);
(this).startActivity(callGPSSettingIntent);
}


public void configuraProvedorGPS() {

// minTimeGPS é de quanto em quanto tempo (em milissegundos), a informação da localização será atualizada via GPS.
// minDistanceGPS é de quantos em quantos metros a informação da localização será atualizada via GPS.
long minTimeGPS = intervaloTempoLeituraGPS;
long minDistanceGPS = distanciaLeituraGPS;
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, minTimeGPS, minDistanceGPS, this);
Log.i("GPS CONFIGURADOOOO","GPS CONFIGURADOOOO");
// Configura o locationManager para chamar o método OnLocationChanged() de acordo com as premissas estabelecidas.
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) {
Log.i("SEM PERMISSAO","SEM PERMISSAO");
return;
}

}

public void configuraProvedorREDE() {

// minTimeNETWORK é de quanto em quanto tempo (em milissegundos), a informação da localização será atualizada via triangulação de antenas.
// minDistanceNETWORK é de quantos em quantos metros a informação da localização será atualizada via via triangulação de antenas.
long minTimeNETWORK = intervaloTempoREDE;
long minDistanceNETWORK = distanciaREDE;

// Configura o locationManager para chamar o método OnLocationChanged() de acordo com as premissas estabelecidas.
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) {

return;
}
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, minTimeNETWORK, minDistanceNETWORK, this);
}


/**
* Manipulates the map once available.
* This callback is triggered when the map is ready to be used.
* This is where we can add markers or lines, add listeners or move the camera. In this case,
* we just add a marker near Sydney, Australia.
* If Google Play services is not installed on the device, the user will be prompted to install
* it inside the SupportMapFragment. This method will only be triggered once the user has
* installed Google Play services and returned to the app.
*/
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;

}

private void agregarMarcador(double lat, double lng) {
LatLng coordenadas = new LatLng(lat, lng);
CameraUpdate miUbicacion = CameraUpdateFactory.newLatLngZoom(coordenadas, 16);
if (marcador != null) marcador.remove();
marcador = mMap.addMarker(new MarkerOptions()
.position(coordenadas)
.title("Minha Posicao atual")
.icon(BitmapDescriptorFactory.fromResource(android.R.mipmap.sym_def_app_icon)));
mMap.animateCamera(miUbicacion);
}

private void actualizarUbicacion(Location location) {

if (location != null) {
lat = location.getLatitude();
lng = location.getLongitude();
agregarMarcador(lat, lng);
}

}

@Override
public void onLocationChanged(Location location) {

// Este método será chamado toda vez que houver uma atualização da localização do usuário.
// A atualização da localização ocorre de acordo com o configurado no locationManager.

try
{

// Obtém a informação da precisão da localização, em metros.
float precisao=location.getAccuracy();

// Se a precisão for menor ou igual à precisão mínima exigida (em metros), então mostra a localização na tela.
// A precisão mínima exigida depende da aplicação.
if (precisao <= precisaoMinimaExigida)
{

actualizarUbicacion(location);


}
}
catch (Exception e)
{
}

}

@Override
public void onStatusChanged(String provider, int status, Bundle extras) {

}

@Override
public void onProviderEnabled(String provider) {

}

@Override
public void onProviderDisabled(String provider) {

}

@Override
protected void onDestroy() {
super.onDestroy();

// Desregistra o Broadcast Receiver.
unregisterReceiver(bReceiver);
}


}

 

============================

Manifest:

 

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="goodeal.localizacaousuarios2">

<!--
The ACCESS_COARSE/FINE_LOCATION permissions are not required to use
Google Maps Android API v2, but you must specify either coarse or fine
location permissions for the 'MyLocation' functionality.
-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" />


<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.LOCATION_HARDWARE" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">

<!--
The API key for Google Maps-based APIs is defined as a string resource.
(See the file "res/values/google_maps_api.xml").
Note that the API key is linked to the encryption key used to sign the APK.
You need a different API key for each encryption key, including the release key that is used to
sign the APK for publishing.
You can define the keys for the debug and release targets in src/debug/ and src/release/.
-->
<meta-data
android:name="com.google.android.geo.API_KEY"
android:value="@string/google_maps_key" />

<activity
android:name=".MapsActivity"
android:label="@string/title_activity_maps">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>

</manifest>

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por pashaa
      Como podem ver a google não aceita mais a SDK da unity ads por motivos da empresa
      Então resolvi remover toda a SDK do meu código. Libs,linhas de comando, tudo. e mesmo assim ainda ela acusa que tenho a sdk dentro do meu app
      Já tenho mais ou menos 1 ano programando em android e nunca tinha visto algo sobre ou esse erro persistir já que tirei tudo de dentro do app
      A minha dúvida é, onde estou errando? Onde deixei alguma coisa sobre essa sdk?Que inclusive coloquei pra teste a uns 5 meses atrás e até tinha esquecido dela kk
      Peço que me ajudem dando sugestões de como remover por completo pois eu praticamente reverti o processo de adicionar a SDK e todo tipo de linha relacionada a unity.ads
       

    • Por Fernando Rafael
      Bom dia, estou baixando arquivos que estão em uma hospedagem própria para serem acessados por um aplicativo que estou desenvolvendo (consigo fazer normalmente utilizando os comandos citado mais a baixo), porém os arquivos ficam salvos na pasta padrão de DOWNLOADS do Android, minha intenção não é ficar acumulando estes arquivos no aparelho, ou esperar que o usuário exclua manualmente, gostaria em salva-los em uma pasta interna do aplicativo para que seja possível excluir automaticamente pelo próprio aplicativo, já tentei como alternativa excluir esses arquivos da pasta DOWNLOADS, mas não consegui...
       
      Segue o código que estou usando para baixar os arquivos, queria adaptar para baixar direto na pasta interna do aplicativo, ou como alternativa caso isso não seja possível, conseguir excluir esses arquivos da pasta DOWNLOADS do Android...
       
      String url = "https://www.site.com/arquivo.pdf"; //Arquivo que vou baixar DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url)); request.setDescription("Alguma descrição"); request.setTitle("Algum titulo"); //A notificação de conslusão só esta disponível a partir da API 11 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { request.allowScanningByMediaScanner(); request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); } //Salvando o arquivo no diretório de Downloads request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "arquivo.pdf"); DownloadManager manager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE); manager.enqueue(request);  
    • Por Fernando Rafael
      Bom dia, alguém poderia me ajudar com esse problema? 
       
      Estou fazendo um aplicativo bem simples em que sua única função será criar uma pasta no celular (em local acessível pelo gerenciador de arquivos do usuário), e posteriormente copiar arquivos de outro local ou rede e colocar nesta pasta.
       
      Fiz algumas pesquisas, mas por incrível que pareça não encontrei algo que tenha funcionando. Também tenho dúvidas sobre qual seria o equivalente ao "C:/" do Android.
    • Por rharisonluca
      Bom dia galera.
       
      Vou iniciar uma projeto para a empresa onde eu trabalho, eu não sou desenvolvedor, porém tenho noção e sou formado na área. Abaixo vou explicar o modelo do projeto:
       
      O projeto consiste em um aplicativo para controle de roteirização da frota;
      Cada motorista terá acesso ao app pelo celular com login e senha;
      O encarregado pelo logística terá que ter acesso pelo PC (WEB) onde ele irá direcionar os roteiros para cada motorista, nessa plataforma web ele irá enviar as coletas e entregas que cada motorista terá que fazer.
       
      Basicamente o projeto é esse, preciso de norte para saber o que tenho que estudar para desenvolver esse projeto, qual framework estudar, qual liguagem, etc.
       
      Desde já agradeço, abraços.
       
      Att.
       
    • Por glocatelli
      Boa tarde,

      Preciso desenvolver um app com os parâmetros descritos na tabela e estou com dificuldade de pensar uma forma de fazer isso, pensei em vários "If's" para classificar o conforto térmico, mas como existem resultados que se repetem em mais de uma classificação acabei descartando esse caminho.
      Se possível me deem dicas de como os senhores procederiam =D

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.