No pacote android.location tem um service chamado LocationManager
( http://developer.android.com/reference/android/location/LocationManager.html
) que faz o que você precisa (porém a única figura geométrica
suportada é um círculo).
Ele fornece basicamente 2 coisas: um mecanismo para obter a a
localização geográfica do aparelho e um recurso para sua aplicação ser
notificada (via intent) quando o dispositivo entra em uma localização
geográfica especificada (um ProximityAlert).
O método para configurar esse alerta de proximidade é o
addProximityAlert() . Basicamente você diz ao LocationManager que você
deseja que um Intent seja disparado quando o dispositivo entra ou sai
de um determinado circulo de
um certo raio que que você define tendo como centro um par latitude/
longitude.
Esse intent pode iniciar um BroadcastReceiver, um Serviço ou uma
atividade. Ele também um parâmetro opcional onde você pode passar o
tempo limite antes de iniciar o intent. Segue um exemplo de uso
abaixo:
// Arquivo ProximityActivity.java
package com.computationalcore.android.location.proximity;
import android.app.Activity;
import android.app.PendingIntent;
import android.content.Intent;
import android.content.IntentFilter;
import android.location.LocationManager;
import android.net.Uri;
import android.os.Bundle;
public class ProximityActivity extends Activity {
private final String PROX_ALERT =
"com.computationalcore.android.intent.action.PROXIMITY_ALERT";
private ProximityReceiver proxReceiver = null;
private LocationManager locMgr = null;
PendingIntent pIntent1 = null;
PendingIntent pIntent2 = null;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
locMgr = (LocationManager)
this.getSystemService(LOCATION_SERVICE);
// Coordenadas da UFRJ
double lat = -14.2394
double lon = -53.1865;
float radius = 5.0f * 1000.0f; // 5km ( o argumento espera o
valor do raio em metros)
String geo = "geo:"+lat+","+lon;
Intent intent = new Intent(PROX_ALERT, Uri.parse(geo));
intent.putExtra("messagem", "UFRJ, RJ");
pIntent1 = PendingIntent.getBroadcast(getApplicationContext(),
0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
locMgr.addProximityAlert(lat, lon, radius, -1L, pIntent1);
//Vocẽ pode definir mais locais se quiser, então se vocẽ
quiser montar uma figura geométrica
// mais complexa tente montar ela com pequenos círculos
//Outro local
double lat = -17.2394
double lon = -52.1865;
geo = "geo:"+lat+","+lon;
intent = new Intent(PROX_ALERT, Uri.parse(geo));
intent.putExtra("messagem", "Outro local");
pIntent2 = PendingIntent.getBroadcast(getApplicationContext(),
0,
intent, PendingIntent.FLAG_CANCEL_CURRENT);
locMgr.addProximityAlert(lat, lon, radius, -1L, pIntent2);
proxReceiver = new ProximityReceiver();
IntentFilter iFilter = new IntentFilter(PROX_ALERT);
iFilter.addDataScheme("geo");
registerReceiver(proxReceiver, iFilter);
}
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(proxReceiver);
locMgr.removeProximityAlert(pIntent1);
locMgr.removeProximityAlert(pIntent2);
}
}
// Arquivo ProximityReceiver.java
package com.computationalcore.android.location.proximity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.location.LocationManager;
import android.os.Bundle;
import android.util.Log;
public class ProximityReceiver extends BroadcastReceiver {
private static final String TAG = "ProximityReceiver";
@Override
public void onReceive(Context arg0, Intent intent) {
Log.v(TAG, "Intent Captada");
if(intent.getData() != null)
Log.v(TAG, intent.getData().toString());
Bundle extras = intent.getExtras();
if(extras != null) {
Log.v(TAG, "Messagem: " + extras.getString("message"));
Log.v(TAG, "Presente no local: " +
extras.getBoolean(LocationManager.KEY_PROXIMITY_ENTERING));
}
}
}
No Androidmanifest.xml você coloca dentro de <application>:
<receiver android:name=".ProximityReceiver">
<intent-filter>
<action
android:name="com.computationalcore.android.intent.PROXIMITY_ALERT" />
<data android:scheme="geo" />
</intent-filter>
</receiver>
Espero ter ajudado.






0 comentários:
Postar um comentário