Você está na página 1de 30

Programação para a Plataforma Android – Aula 13

Localização
• O que são serviços baseados em localização?
• Como usar a API de mapas do Google?
• Como sobrepor diferentes visões a um mapa?
• Como integrar o mapa aos demais componentes gráficos?
• Quais visões podem ser acopladas à mapas?
• Como usar serviços de localização sem mapas?
Onde Estou?
• Que recursos um smart‐phone pode usar para
saber a própria localização?
Provedores de Localização
• Android suporta sensores que captam sinais
de satélites do sistema Geo‐Posi(oning
Systems (GPS).
• Android suporta sensores que determinam a
localização do aparelho móvel via triangulação
com redes de telefonia celular.
• Android também suporta provedores de
localização baseados em redes wi‐fi.
Onde estou?
Serviço de localização:
Escreva uma aplicação
que imprima em uma
caixa de texto simples a
localização do aparelho
móvel, e o servidor de
localização utilizado
para determiná-la.
Permissões
<?xml version="1.0" encoding="uV‐8"?>
<manifest xmlns:android="hZp://schemas.android.com/apk/res/android"
package="com.aula13" android:versionCode="1" android:versionName="1.0">
<uses‐permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses‐permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<applicabon android:icon="@drawable/icon" android:label="@string/app_name">
<acbvity android:name=".AulaAcbvity13" android:label="@string/app_name">
<intent‐filter>
<acbon android:name="android.intent.acbon.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent‐filter>
s
</acbvity> Nós já vimo
</applicabon> um tipo de
<uses‐sdk android:minSdkVersion="2" />
permissão
</manifest> . Qual?
antes
Layout
• Informações de
localização serão
impressas em uma caixa
de texto.
– Essas informações podem
ocupar uma string maior
que os limites da caixa de
texto.
– Mas, por agora, já sabemos
como construir esse layout!
ScrollView Passemos
main.xml agora à
<?xml version="1.0" encoding="uV‐8"?> atividade…
<ScrollView
xmlns:android="hZp://schemas.android.com/apk/res/android"
android:orientabon="verbcal"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView
android:id="@+id/output"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
</ScrollView>
Abvidade de Localização
public class AulaAcbvity13 extends Acbvity implements Loca.onListener {
@Override
Q u a is e v entos
public void onCreate(Bundle savedInstanceState) {
e l o ca l iz a ção
... d
} devem
@Override existir?
protected void onResume() {
... O que deveria
} ser feito em
@Override onResume?
protected void onPause() { E o que
... deveria se
} r
feito em
} AulaAcbvity13.java onPause?
onResume/onPause
AulaAcbvity13.java
O que serão
private Loca.onManager mgr;
Que tipo de esses
private String best;
objeto é esse? parâmetros
?
@Override
protected void onResume() {
super.onResume();
mgr.requestLocabonUpdates(best, 15000, 1, this);
} ume
O que onRes
o?
está fazend
@Override E por qu
protected void onPause() { e
onPaus Mas como
e foi
super.onPause(); implem será o método
entado
mgr.removeUpdates(this); assim? onCreate?
}
Temos de
ar
implement
onCreate esse log.
@Override
O que um
public void onCreate(Bundle savedInstanceState) { objeto desse
super.onCreate(savedInstanceState); sabe fazer?
setContentView(R.layout.main);
mgr = (LocabonManager) getSystemService(LOCATION_SERVICE);
output = (TextView) findViewById(R.id.output);
log("Locabon providers:");
dumpProviders();
Criteria criteria = new Criteria(); O que se
passa aqui?
best = mgr.getBestProvider(criteria, true);
log("\nProvedor escolhido: " + best);
log("\nLocalizacao (comecando com ulbma conhecida):");
Loca.on locabon = mgr.getLastKnownLocabon(best);
dumpLocabon(locabon);
}
Eventos de Localização
• A nossa abvidade é também um escutador de
eventos de localização. Quais seriam os
eventos de localização?
AulaAcbvity13.java
public class AulaAcbvity13 extends Acbvity
implements Loca.onListener {

}
Eventos de Localização
public void onLocabonChanged(Locabon locabon) {
…;
}
Como seria a
public void onProviderDisabled(String provider) { im
plementação
…; de cada um
} desses métodos?
public void onProviderEnabled(String provider) {
…;
}
public void onStatusChanged(String provider, int status, Bundle extras)
{

…;
} AulaAcbvity13.java
Eventos de Localização
public void onLocabonChanged(Locabon locabon) {
dumpLocabon(locabon); O que é esse
} parâmetro
public void onProviderDisabled(String provider) { status?
log("\nProvedor inoperante: " + provider);
}
public void onProviderEnabled(String provider) { Temos um
a r r anjo para
log("\nProvedor operante: " + provider);
c riar!
}
public void onStatusChanged(String provider, int status, Bundle extras)
{
log("\nO estado do provedor mudou: " + provider +
", status=" + S[status] + ", extras=" + extras);
}
Eventos de Localização
public void onLocabonChanged(Locabon locabon) {
dumpLocabon(locabon); Temos de
} implementar os
public void onProviderDisabled(String provider) { outros métodos
log("\nProvedor
privateinoperante:
stabc final "String[]
+ provider);
S={ de nossa
} "out of service",
atividade. Vocês
public void onProviderEnabled(String provider) { lembram quais
"temporarily unavailable", são eles?
log("\nProvedor operante:
"available" " + provider);
} };
public void onStatusChanged(String provider, int status, Bundle extras)
{
log("\nO estado do provedor mudou: " + provider + ”,
status=" + S[status] + ", extras=" + extras);
}
AulaAcbvity13.java
Os dump’s
private void log(String string) { output.append(string + "\n"); }

private void dumpLocabon(Locabon locabon) {


if (locabon == null)
log("\nLocabon[unknown]"); Esse método,
else dumpProvider,
log("\n" + locabon.toString()); ainda precisa ser
} implementado.

private void dumpProviders() {


List<String> providers = mgr.getAllProviders();
for (String provider : providers) {
dumpProvider(provider);
}
}
Informações de Localização
Novamente,
AulaAcbvity13.java precisamos
private void dumpProvider(String provider) { definir alguns
LocabonProvider info = mgr.getProvider(provider); arranjos.
StringBuilder builder = new StringBuilder();
builder.append("LocabonProvider[").append("name=").append(info.getName())
.append(",enabled=").append(mgr.isProviderEnabled(provider)).append(
",getAccuracy=").append(A[info.getAccuracy() + 1]).append(
",getPowerRequirement=").append(P[info.getPowerRequirement() + 1])
.append(",hasMonetaryCost=").append(info.hasMonetaryCost()).append(
",requiresCell=").append(info.requiresCell()).append(
",requiresNetwork=").append(info.requiresNetwork()).append(
",requiresSatellite=").append(info.requiresSatellite()).append(
",supportsAlbtude=").append(info.supportsAlbtude()).append(
",supportsBearing=").append(info.supportsBearing()).append( O que é
",supportsSpeed=").append(info.supportsSpeed()).append("]"); isso?
log(builder.toString());
}
Informações de Localização
private sta.c final String[] A = {
"invalid",
private void dumpProvider(String provider) {
LocabonProvider info = mgr.getProvider(provider);
"n/a",
StringBuilder builder = new StringBuilder();
"fine",
builder.append("LocabonProvider[").append("name=").append(info.getName())
"coarse"
.append(",enabled=").append(mgr.isProviderEnabled(provider)).append(
};
",getAccuracy=").append(A[info.getAccuracy() + 1]).append(
",getPowerRequirement=").append(P[info.getPowerRequirement() + 1])
.append(",hasMonetaryCost=").append(info.hasMonetaryCost()).append(
private sta.c final String[] P = {
",requiresCell=").append(info.requiresCell()).append(
"invalid",
",requiresNetwork=").append(info.requiresNetwork()).append(
"n/a",
",requiresSatellite=").append(info.requiresSatellite()).append(
"low",
",supportsAlbtude=").append(info.supportsAlbtude()).append(
"medium",
",supportsBearing=").append(info.supportsBearing()).append(
",supportsSpeed=").append(info.supportsSpeed()).append("]");
"high"
log(builder.toString());};
}
Emulador
• Se tentarmos carregar a
aplicação, não obteremos
nenhuma informação de
localização.
• Podemos passar essas
informações pelo emulador,
na tela Emulator Control
View.
– Window > Show View > Other...
> Android > Emulator Control
Simulando a Localização
• Se tentarmos carregar a
aplicação, não obteremos
nenhuma informação de
localização.
• Podemos passar essas
informações pelo emulador,
na tela Emulator Control
View.
– Window > Show View > Other...
> Android > Emulator Control
Locabon Tracker
Rastreador de caminho:
Implemente um
rastreador de caminho,
que grave a sequência
de posições percorridas
pelo dispositivo móvel,
e que imprima a
distância total
percorrida.

Como será
esse layout?
<LinearLayout xmlns:android="h;p://schemas.android.com/apk/res/android"
android:id="@+id/root"
android:orientabon="ver(cal"

Locabon Tracker
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/lat"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/la;ext"/>
<EditText
android:id="@+id/latName"
android:focusable="false"
android:layout_width="fill_parent"
android:layout_height="fill_parent"/>
<TextView
android:id="@+id/lon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/lontext"/>
<EditText
android:id="@+id/lonName"
android:focusable="false"
android:layout_width="fill_parent"
android:layout_height="fill_parent"/>
<TextView
android:id="@+id/dist"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
Qual o modelo
android:text="@string/dis;ext"/> dessa
<EditText
android:id="@+id/distName" aplicação?
android:focusable="false"
android:layout_width="fill_parent"
android:layout_height="fill_parent"/>
</LinearLayout>
tracker.xml
Tracker.java
Tracker
public class Tracker extends Acbvity implements LocabonListener {
private LocabonManager mgr;
private List<Locabon> track; O que é preciso
private String best; ser feito no
private EditText lat; método
private EditText lon; onCreate?
private EditText dist;

}
Tracker.java
onCreate
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.tracker);
track = new ArrayList<Locabon>();
mgr = (LocabonManager) getSystemService(LOCATION_SERVICE);
Criteria criteria = new Criteria(); Como seria este
best = mgr.getBestProvider(criteria, true); método de
this.lat = (EditText) findViewById(R.id.latName); atualizar a
this.lon = (EditText) findViewById(R.id.lonName); localização?
this.dist = (EditText) findViewById(R.id.distName);
updateLoca.on();
}
Atualizando a Localização

Tracker.java
private void updateLocabon() {
Locabon locabon = mgr.getLastKnownLocabon(best);
lat.setText(String.valueOf(locabon.getLabtude()));
lon.setText(String.valueOf(locabon.getLongitude()));
dist.setText(computePathLength() + "m");
this.track.add(locabon);
} E como podemos
calcular a
distância
percorrida?
Tracker.java
Calculando distâncias Precisamos
algora
private CharSequence computePathLength() { implementar
if (track.size() == 0) { os métodos
return "0"; de eventos.
} else {
Locabon last = track.get(0); Vocês
double dist = 0.0; m b r a m q ue
le
for (int i = 1; i < this.track.size(); i++) { é t od o s s ão
m
Locabon newLoc = this.track.get(i); esses?
dist += last.distanceTo(newLoc);
last = newLoc; Na verdade,
} precisamos
return String.valueOf(dist); de escrever
} somente um!
}
Eventos de Localização
public void onLocabonChanged(Locabon locabon) {
…;
O que escrevemos aqui?
}

public void onProviderDisabled(String provider) {


}

public void onProviderEnabled(String provider) {


}

public void onStatusChanged(String provider,


int status, Bundle extras) {
}
Eventos de Localização
public void onLocabonChanged(Locabon locabon) {
this.updateLocabon();
}

s m o qu e não
public voidMonProviderDisabled(String provider) {
e s ,
} o s os m étodo
usem
s
precisamo los. Por
l e m e n tá-
public void ionProviderEnabled(String
m p provider) {
e ? E o que
} qu
normalmente se faz
para evitar esse
public void onStatusChanged(String provider,
transtorno?
int status, Bundle extras) {
}
Poupando Recursos
Tracker.java
@Override
protected void onResume() {
super.onResume();
mgr.requestLocabonUpdates(best, 15000, 1, this);
}

@Override E se quiséssemos
protected void onPause() { calcular a
super.onPause(); velocidade de
mgr.removeUpdates(this); deslocamento, o que
} precisaria ser feito?
Probleminha Besta

Tracker.java
private void updateLocabon() {
Locabon locabon = mgr.getLastKnownLocabon(best);
lat.setText(String.valueOf(locabon.getLabtude()));
lon.setText(String.valueOf(locabon.getLongitude()));
dist.setText(computePathLength() + "m");
this.track.add(locabon);
} Notem que a distância A posiç
somente aparece ão original não
está sendo levada em
quando enviamos
consideração quando Como
valores para o
computamos a resolver
emulador duas ou ma
is distância. esse
vezes.
problema?
Easy Fix

Tracker.java
private void updateLocabon() {
Locabon locabon = mgr.getLastKnownLocabon(best);
lat.setText(String.valueOf(locabon.getLabtude()));
lon.setText(String.valueOf(locabon.getLongitude()));
this.track.add(locabon);
dist.setText(computePathLength() + "m");
}
Estamos computando a
distância antes de
inserirmos as
coordenadas da última
localização.

Você também pode gostar