Emular Latitude e Longitude

Como emular posição do GPS no Android?

Simplementes abrindo a View DDMS e lá você tem a opção de inserir a latitude e Longitude de um lugar. Com isso o emulador é “enganado” e  “pensa” que está localizado na posição que você entrou.

Se não me engano o valor já pré definido é do Vale do Silício, mas você pode mudar pra uma posição mais perto.

Recomendo esse site para você poder pegar a Lat e Long.

http://www.getlatlon.com/

Anúncios

Usar LocationListener no Android?

Para complementar o post sobre GPS ->https://renatopuccinipt.com/2011/07/15/pegar-latitude-e-longitude-no-android/ escrevo esse post com o intuito de melhorar uma aplicação que acessa dados de localização geográfica.

Quando fiz minha primeira app que acessava informações do GPS, achei o maximo. Porém ficava encucado de como fazer para aparecer na barra topo do Android que o GPS estava trabalhando. Foi ae que descobri o LocationListener.

Ele é uma interface que prove updates do GPS para você. E automaticamente faz com que o iconezinho que indica a sua posição fique piscando na barra no topo da tela.

Como o LocationListener é uma interface, basta simplesmente criarmos uma classe (essa pode ser até uma inner class) que implemente essa interface.

Essa classe implementa automaticamente todos os métodos da Interface.

Como você já tem um LocationManager para acessar as informações do GPS, fica simples somente criar um objeto da classe MeuLocationListener e adicionar em um método particular do seu objeto LocationManager.

A propósito, eu dispoonibilizei a apk aqui.

(nota: para seguir esse post, é necessário ter visto este outro->https://renatopuccinipt.com/2011/07/15/pegar-latitude-e-longitude-no-android/)

package br.gps.info;

import android.app.Activity;
import android.content.Context;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class UsingGPSActivity extends Activity {
	/** Called when the activity is first created. */

	MeuLocationListener mm = new MeuLocationListener();
	LocationManager LM = null;
Location l = null;
 @Override
 public void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.main);

 final TextView acc = (TextView) findViewById(R.id.txtAccuracy);
 final TextView alt = (TextView) findViewById(R.id.txtAltitude);
 final TextView lat = (TextView) findViewById(R.id.txtLatitude);
 final TextView longi = (TextView) findViewById(R.id.txtLongitude);
 final TextView pro = (TextView) findViewById(R.id.txtProvider);
 final TextView spd = (TextView) findViewById(R.id.txtSpeed);
 final TextView proList = (TextView) findViewById(R.id.txtProvList);

 Button retrieve = (Button) findViewById(R.id.btnRetrieve);
 retrieve.setOnClickListener(new OnClickListener() {
 @Override
 public void onClick(View v) {
 LM = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
 String bestProvider = null;
 if (LM != null)
 bestProvider = LM.getBestProvider(new Criteria(), true);
 // System.out.println("*************"+LM.getBestProvider(new
 // Criteria(),true));

 if (mm != null)
 LM.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2,
 10, mm);


 if (bestProvider != null)
 l = LM.getLastKnownLocation(bestProvider);
 if (l != null) {
 acc.setText(String.valueOf(l.getAccuracy()));
 alt.setText(String.valueOf(l.getAltitude()));
 lat.setText(String.valueOf(l.getLatitude()));
 longi.setText(String.valueOf(l.getLongitude()));
 pro.setText(String.valueOf(l.getProvider()));
 spd.setText(String.valueOf(l.getSpeed()));
 proList.setText(String.valueOf(LM.getAllProviders())
 + "\nGPS Available");
 } else {
 acc.setText(R.string.noInfo);
 alt.setText(R.string.noInfo);
 lat.setText(R.string.noInfo);
 longi.setText(R.string.noInfo);
 pro.setText(R.string.noInfo);
 spd.setText(R.string.noInfo);
 proList.setText(R.string.noInfo);
 }
 }
 });
 }
}

 


private final class MeuLocationListener implements LocationListener {

@Override
public void onLocationChanged(Location locFromGps) {
// called when the listener is notified with a location update from
// the GPS
l = locFromGps
}

@Override
public void onProviderDisabled(String provider) {
// called when the GPS provider is turned off (user turning off the
// GPS on the phone)

}

@Override
public void onProviderEnabled(String provider) {
// called when the GPS provider is turned on (user turning on the
// GPS on the phone)
}

@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
// called when the status of the GPS provider changes
}
}

Qual Android Você Usa?

Como o Android vem ganhando espaço no Brasil e a gente só tem visto pesquisas em solos internacionais, no entanto dados sobre o nosso país ainda são difícieis de se encontrarem.

Por isso o link abaixo te levara a tres perguntas: http://t.co/CfPQihAM

Qual Android tem no seu celular?

De qual Fabricante ele é?

Qual estado voce vive?

https://docs.google.com/spreadsheet/viewform?formkey=dGtyOGNUWFBrS2ZPd3ZlTnppOXZJSWc6MQ

A intenção é traçar o numero de androis, versao e estado do Brasil estão.

Participe!!!

CATEDI #3

Queria agradecer ao pessoal do CATEDI (Comunidade Academica Tecnologica de Desenvolvimento e Infra) pela oportunidade de palestrar e falar um pouco de Android.

Abaixo os slides da palestra. obrigado!!!

😀

http://prezi.com/vlewxjoob64v/present/?auth_key=zzdwhwa&follow=p6czhiugk4wm

http://prezi.com/embed/vlewxjoob64v/?bgcolor=ffffff&lock_to_path=0&autoplay=no&autohide_ctrls=0

Tabs usando somente uma Activity

Esse exemplo ajuda no caso de voce ter varias tabs, e quiser salvar o conteudo de todas ao mesmo tempo. (uma solucao é essa. A outra seria criar classe com metodos e objetos estáticos o qual vc set esses objetos e os mesmos sao retornados pra vc a hora que quiser[post sobre isso a caminho…]).

Vamos la.

no seu TabHost.


package blog.teste.tab;

import android.app.ActivityGroup;
import android.content.Intent;
import android.content.res.Resources;
import android.os.Bundle;
import android.widget.TabHost;

/**
* Classe TesteTab herda de ActivityGroup. Essa classe pai, eh usada,
* porque possibilita a visualizacao de varias Activities dentro dela
***/
public class TesteTab extends ActivityGroup {
static TabHost tabHost;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

Resources res = getResources();
tabHost = (TabHost)findViewById(R.id.tabHost);
tabHost.setup(this.getLocalActivityManager());

TabHost.TabSpec spec;

Intent i;
// * Exemplo de Tabs usando somente um .xml e somente uma Activity. Ou seja, usamos a mesma Tab1.xml e a mesma Tab1.java
//Tab #1
i = new Intent().setClass(this, Tab1.class);
i.putExtra("tab","0");
spec = tabHost.newTabSpec("0").setIndicator("Tab 1",res.getDrawable(R.drawable.icon) ).setContent(i);
tabHost.addTab(spec);
//Tab #2
i = new Intent().setClass(this, Tab1.class);
i.putExtra("tab","1");
spec = tabHost.newTabSpec("1").setIndicator("Tab 2",res.getDrawable(R.drawable.icon) ).setContent(i);
tabHost.addTab(spec);
//Tab #3
i = new Intent().setClass(this, Tab1.class);
i.putExtra("tab","2");
spec = tabHost.newTabSpec("2").setIndicator("Tab 3",res.getDrawable(R.drawable.icon) ).setContent(i);
tabHost.addTab(spec);
//Tab #4
i = new Intent().setClass(this, Tab1.class);
i.putExtra("tab","3");
spec = tabHost.newTabSpec("3").setIndicator("Tab 4",res.getDrawable(R.drawable.icon) ).setContent(i);
tabHost.addTab(spec);
//Setta a tab a ser carrega ao iniciar a tabhost
tabHost.setCurrentTab(0);
}
}

o que que acontece ali em cima??

eu tenho várias Tabs. E ao clicar em uma tab, é passado uma variavel para ela. essa variavel pode ser verificada na propria Activity assim que carregada.

Mais ou menos assim…


package blog.teste.tab;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TextView;

/**
* super.{@link Activity}
* */
public class Tab1 extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.tab1);
// Pega a intent
Intent i = getIntent();
//Pega a String (Extra) da Intent
String tabContent = i.getStringExtra("tab");
//Instancia o LinearLayout do .xml R.layout.tab1
TextView text = (TextView)findViewById(R.id.txtText);

//Setta o background da pagina de acordo com o conteudo da String tabContent
if(tabContent.equalsIgnoreCase("0"))
text.setText("BLOGANDO TAB 0");
else  if(tabContent.equalsIgnoreCase("1"))
text.setText("BLOGANDO A PRIMEIRA TAB\nTAB 1");
else if(tabContent.equalsIgnoreCase("2"))
text.setText("BLOGANDO A SEGUNDA TAB\nTAB 2");
else if(tabContent.equalsIgnoreCase("3"))
text.setText("BLOGANDO A TERCEIRA TAB\nTAB 3");
}
}

Aqui em cima a Activity recebe o parametro da tab, e dependendo do conteudo desse objeto seta o conteudo do TextView.

O que poderia ser feito, ao inves de settar o conteudo do Textview, setaria o   setContentView(R.layout.tab1);   com os diferentes layouts os quais voce criou..

por ultimo a classe Tab1.xml


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:background="#ffff00"
>
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TENTATIVA DE BLOG!!1"
android:id="@+id/txtText"
android:textSize="15dp"
android:textStyle="bold"
android:textColor="#000000"
/>
<EditText android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/edtNome"
/>

</LinearLayout>

Tambem o TabHost main.xml


<?xml version="1.0" encoding="utf-8"?>
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/tabHost"
>
<LinearLayout android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
>
<FrameLayout android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@android:id/tabcontent"
android:background="#ffffff"
android:layout_weight="1"
/>
<TabWidget
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@android:id/tabs"
android:background="#00ffff"
android:layout_weight="0 "
/>
</LinearLayout>
</TabHost>

e Manifest….


<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="blog.teste.tab"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="8" />

<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".TesteTab"
android:label="@string/app_name"
android:theme="@android:style/Theme.NoTitleBar"
android:configChanges="orientation|keyboardHidden"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".Tab1"
android:label="TAB WIDGET 1"
>
</activity>

</application>
</manifest>

ps – Lembrando que esse seria um WorkAround. Eu recomendo mesmo usar uma classes com objetos e metodos estaticos (em breve um post sober esse assunto).

 

Densidade de Displays Android

Um problema quando desenvolvemos para diferentes tamanhos de telas e diferentes densidades é “adivinhar” os tipos que usarão nossa app.

Para evitar ter seu app bonitinho num celular e horroroso em outro, use método que definem sua app de acordo com o tamanho ou densidade.

Para saber a densidade da tela do aparelho é simples


float resolution = getResources().getDisplayMetrics().densityDpi;

Aqui nos pegamos a densidade da tela e atribuimos em uma variavel. Com isso voce pode fazer seus “if” e fazer sua app ter comportamentos e telas diferentes em celulares diferentes.

Espero que isso tenha ajudado.

abraços

 

Verificar se tem conexão com a internet

Uma grande ajuda que a API do Android nos dá é a possibilidade de checar se tem internet disponível para sua aplicação no aparelho do usuário.

Eu fiz um método bem simples que verifica o estado da conexão.


/**
* <h1>public {@link Boolean boolean} isOnline()</h1><br>
* Checa se tem conexão ou não com a internet.
* @param contexto em que será exibido o texto
* @return <li> retorna true se tem conexão ou falso se não.
* */
public static boolean isOnline(Context contexto){
ConnectivityManager cm = (ConnectivityManager) contexto.getSystemService(Context.CONNECTIVITY_SERVICE);//Pego a conectividade do contexto o qual o metodo foi chamado
NetworkInfo netInfo = cm.getActiveNetworkInfo();//Crio o objeto netInfo que recebe as informacoes da NEtwork
System.out.println("NETWORK INFO: "+netInfo.getSubtypeName());
if ( (netInfo != null) && (netInfo.isConnectedOrConnecting()) && (netInfo.isAvailable()) ) //Se o objeto for nulo ou nao tem conectividade retorna false
return true;

return false;
}

Com isso, você pode usar seu método antes de executar as chamadas em web services e evitar ANRs ou exceptions.

para esse código funcionar corretamente, nao esqueça de declarar no seu AndroidManifest.xml a propriedade que permite voce ter acesso a informação de estado da rede.


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

Criar Adapters para ListView e GridView part II

Como continuação desse POST, vou explicar brevemente como usar seu Adapter criado na parte 1 deste post, Em comentarios´

//Metodo nativo da classe ListView. Esse metodo carrega seu adapter e faz o bind, ou seja, transforma seu adapter em lista.

ListView lista = (ListView)findViewById(R.id.lista);
lista.setAdapter(new ImageAdapter(this, ServiceProvider.getArray());//adapter criado no post anterior(personalizado)

ou

//Metodo nativo da classe GridView. Esse metodo carrega seu adapter e faz o bind, ou seja, transforma seu adapter em u, grid. tem funcionamento parecido com o ListView.

GridView gv = (GridView)findViewById(R.id.gridview);
gv.setAdapter(new ListMapAdapter(this, mapaURL, mapaTitle));//adapter criado no post anterior(personalizado)

Se esse post foi util ou te ajudou, da um Google+1 !!!

Software Freedom Day

embed>Pra quem não sabe, o Software Freedom Day (SFD) é o dia mundial para celebrar software livre e free!!!

E o objetivo desse dia é promover eventos sobre o software livre. Essa Semana a FAtec Cruzeiro está promovendo o SFD. E conta com InstallFests, tech talks e palestras sobre software livre.

InstallFEsts = Instalar software livre no seu computador (linux, opensolaris, etc)

Tech Talks = Pequenos intervalos de tempo onde falamos sobre tecnologias abertas (java, php, ruby, android, mysql, sqlite, linux, etc)

A Fatec Cruzeiro tem celebrado esse dia desde 2009. E é muito bom ver todo ano esse evento acontecendo, motivando alunos e mostrando coisas novas pra galera.

E com enorme prazer fiz um Tech Talk sobre Android na Faculdade. Expliquei um pouco da plataforma Android, dei algumas dicas pros alunos de como e onde começar com Android também. Espero que o pessoal tenha gostado, apesar de ter sido breve, creio que falei o necessario.

Muito bom rever o pessoal da faculdade. Obrigado a todos! até a próxima!!

SFD_2011

Criar Adapters para sua ListView e GridView I

Um problema que nós sempre enfretamos é lidar com imagens em listas. Parece um tanto quanto difícil encarando de uma perspectiva mais distante, porém usando essa aproximação de Adapter, torna-se fácil e eficiente lidar com listas!

Toda lista, é preenchida através de um adapter. A própria API fornece alguns adapters como o SimpleAdapter. Porém para lidar com imagens, é necessário que você faça o seu Adapter, personalizado e do jeitinho que você quer.

vamos então criar um adapter!


/**
* Classe que monta o adapter que será utilizado pela listview para gerar a lista de imagens
* @author Renato Porto Puccini
* */
public class ListMapAdapter extends BaseAdapter {
// Layout inflater
private LayoutInflater mInflater;

private Bitmap[] Icon;//Array de Imagens/Bitmaps

private String[] arrayTitulos; //Array com titulo das imagens para serem exibidos

/**
* Método construtor que recebe o Contexto, o array de titulos e os nomes das imagens na app
* @param contexto em que se encontra ao ser chamado
* @param array com o nome das imagens
* @param array com os titulos das imagens (para serem exibidos bunitinhu pro usuario)
* */
public ListMapAdapter(Context contexto, String[] Icons, String[] array) {
mInflater = LayoutInflater.from(contexto);
this.Icon = new Bitmap[Icons.length];
this.arrayTitulos= array;

//nesse caso eu pego as imagens dos resources que estão na pasta /res com aquele nome. No meu caso eu tenho uma serie de imagens diferentes a serem exibidas
for (int j = 0; j < arrayTitulos.length; j++) {
this.Icon[j] = BitmapFactory.decodeResource(contexto.getResources(), contexto.getResources().getIdentifier("drawable/map_icon_"+Icons[j].trim(),null    ,contexto.getPackageName()));
}

}

public int getCount() {
return arrayTitulos.length;
}

public Object getItem(int position) {
return position;
}

public long getItemId(int position) {
return position;
}

public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
//Se a sua view for ==null, então você instacia os objetos de acordo com seu layout .xml
if(convertView==null){
convertView= mInflater.inflate(R.layout.seuArquivoXML, null);
holder = new ViewHolder();
holder.icone = (ImageView)convertView.findViewById(R.id.imageViewIcon);
holder.titulo= (TextView)convertView.findViewById(R.id.textViewTitle);
convertView.setTag(holder);
}else{
// pega a view de volta. Isso é um acesso rápido a ela. e vc traz seu textview e imageview
holder = (ViewHolder)convertView.getTag();
}
// Agora você atribui seus dados(imagens e textos) nas suas views. Usando esse Holder é mais eficiente
holder.icone.setImageBitmap(Icon[position]);
holder.titulo.setText(this.arrayTitulos[position]);

return convertView;
}

/**
* O ViewHolder é uma classe que armazena a estrutura em tags, e retorna as views por getView().<br>
* Essa estrutura de dados faz referencia para os objetos que vc quer atribuir valores.
* Além de fazer com que você evite de ficar chamando o método findViewById() toda vez que getView() é invocado
* Reference List14 developer.android.com
* */
static class ViewHolder{
ImageView icone;
TextView titulo;
}

}

Ok. Agora você estar se perguntando, de onde eu pego esses TextView´s e ImageView´s ?

Você tem que criar um lista.xml . Esse .xml terá as suas views que vocÊ precisará para gera a sua lista..

No meu caso, como usei dois, ficou curtinho, mais ou menso assim


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<ImageView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/imageViewIcon"
android:layout_gravity="center_horizontal"
/>

<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/textViewTitle"
android:textColor="#000000"
android:textStyle="italic"
/>

</LinearLayout>

Simples assim, seu adapter foi criado!

P.S. Se você for pegar as imagens da web, de uma olhada nesse link! https://renatopuccinipt.wordpress.com/2011/08/12/converter-string-em-imagem/

Se post foi util pra voce, da um Google+1 !!!

😀

Como usar Google Maps API no Android Part II

Ok, depois de ter criado sua API Key, -> https://renatopuccinipt.wordpress.com/2011/08/26/como-usar-google-maps-api-no-android-part-i/ ,
Vamos fazer funcionar a nossa Activity com o Google Maps..
Cria uma classe que herde de MapActivity. Se vocÊ usará o Google Maps para localizar o dispositivo use a interface LocationListener e implemente seus respectivos métodos, senão só herde de MapActivity.

public class GoogleMapsExActivity extends MapActivity {
	 @Override
	 public void onCreate(Bundle savedInstanceState) {
	        super.onCreate(savedInstanceState);
	        setContentView(R.layout.ondeestou);
                //Lista de Layers
	           List mapOverlays;
                //Map view que você criou no .xml
	    	   MapView mapview;
                //ArrayList de items para serem adicionados na lista de layers.
	    	   private ArrayList mOverlays = new ArrayList();
               //ponto geografico a ser exibido
                   GeoPoint point;
               //item a ser adicionado, geralmente um pin mostrando a localização
	    	   OverlayItem overlayitem ;

 		mapview = (MapView)findViewById(R.id.mapview);//Inicia o objeto mapview

		mapview.setBuiltInZoomControls(true);//habilite o zoom

		mapOverlays = mapview.getOverlays();   atribui os layers a lista

		point = new GeoPoint(-25682183,-44001202);
		overlayitem= new OverlayItem(point, "Figura", "Minha Localização");

//Essa classe você pode criar herdando de OverlayIteme receberá a figura que será exibida como pin.
                SuaClasseOverlay itemOverlay = new SuaClasseOverlay (drawable);

                itemOverlay.addOverlay(overlayitem);

		mapOverlays.add(itemOverlay);
    }
}

Se post foi util pra voce, da um Google+1 !!!

😀

parte 1 desse post https://renatopuccinipt.wordpress.com/2011/08/26/como-usar-google-maps-api-no-android-part-i/

Declarar Activities no Android

No Android, cada tela é uma Activity. Cada screen (area, tela, etc), que o usuário está vendo, é uma Activity ou atividade. Essa atividade, para que seu projeto funcione corretamente, tem que estar declarada no AndroidManifest.xml
Como fazer???
simples..
Vá até o seu arquivo manifest e adicione a sua classe Activity como no exemplo abaixo.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="projeto.android.blog"
      android:versionCode="1"
      android:versionName="1.0">
    <uses-sdk android:minSdkVersion="8" />
   <uses-permission android:name="android.permission.INTERNET"/>
	<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
	<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>

    <application android:icon="@drawable/icon" android:label="@string/app_name">
    	<uses-library android:name="com.google.android.maps"/>
        <activity android:name=".SplashScreen"
                  android:label="@string/app_name"
                  android:theme="@android:style/Theme.NoTitleBar"
                  android:screenOrientation="portrait">
                  <intent-filter>
                		<action android:name="android.intent.action.MAIN" />
                		<category android:name="android.intent.category.LAUNCHER" />
            		</intent-filter>
        </activity>
        <activity android:name=".MainActivity"
        			android:label="@string/app_name"
        			android:theme="@android:style/Theme.NoTitleBar"
        			android:configChanges="orientation|keyboardHidden"
        			android:screenOrientation="portrait"
         			>
         			<intent-filter>
         				<action android:name="projeto.android.blog.MainActivity"/>
         				<category android:name="android.intent.category.DEFAULT"/>
         			</intent-filter>
         </activity>
        <activity android:name=".OutraActivity"
        			android:label="outra"
        			android:theme="@android:style/Theme.NoTitleBar"
        			android:screenOrientation="portrait"
         			>
         			</activity>
         <activity android:name=".HomeActivity"
        			android:label="home"
        			android:theme="@android:style/Theme.NoTitleBar"
        			android:screenOrientation="portrait"
         			>
         			</activity>
    </application>
</manifest>

No meu AndroidManifest.xml eu tenho 4 Activities. A SplashScreen, a MainActivity, OutraActivity, HomeActivity.
Depois de adicionadas o vocÊ será capaz de ver as telas na sua app.

Se post foi util pra voce, da um Google+1 !!!

😀

Criar alertas

Um ponto importante em uma App Android é a comunicação entre App e Usuário. O usuário deve ficar a par de tudo que acontece no app. Como assim? Ele precisa saber porque demora para acessar uma página, carregar arquivo ou saber se o que ele está fazendo é permitido ou não.
Portanto usamos alguns alertas na applicação.
Está aí um exemplo simples e fácil de usar.

//menssagem para ser mostrada na tela para o usuário
public void alert(String menssagem){
		AlertDialog.Builder builder = new AlertDialog.Builder(this);
		builder.setCancelable(false);
		builder.setTitle("Atenção");
		builder.setMessage(menssagem);
		builder.setNeutralButton("Ok", new DialogInterface.OnClickListener() {
			public void onClick(DialogInterface dialog, int which) {
				return;
			}
		});
		AlertDialog alert = builder.create();
		alert.show();
	}

Com esse exemplo você pode personalizar do seu jeito, ou do jeito que é preciso para fazer com que sua aplicação se comunique com o usuário. Logo sua aplicação consegue um nível maior de usabilidade e garante o funcionamento e compreensão do usuário.
😀

Se post foi util pra voce, da um Google+1 !!!

😀

Converter String em imagem

Quando você tem várias imagens na sua app e irá usa-las constantemente, porém não usando o id delas(id number (int)) você terá que passar o endereço delas.
Se você estiver pegando-as da web, é só passar a String pra um URL e conectar como abaixo:

try {
			for (int i = 0; i < enderecoImagem.length; i++) {
				URL ulrn = new URL(enderecoImagem[i]);
		 		HttpURLConnection	con = (HttpURLConnection)ulrn.openConnection();
		 			InputStream is = con.getInputStream();
		 				mIcon1[i] = BitmapFactory.decodeStream(is);
				}
		}catch (Exception e) {
			e.printStackTrace();
		}

Porém se as imagens já estão na sua App, como você faria isso?
Nesse caso, eu tenho o nome da imagem no meu objeto criado e que está no meu ArraList.

for (int i = 0; i < arrayList.size(); i++) {
	 				mIcon1[i] = BitmapFactory.decodeResource(contexto.getResources(), contexto.getResources().getIdentifier("drawable/icone"+arrayList.get(i).getIcon().trim(),null	,contexto.getPackageName()));
			}

Aqui eu pego as imagens uma a uma. Eu tenho o caminho delas, e o getResources e getIdentifier pega esse caminho e “acha” a nossa imagem que está na nossa aplicação.
Por que fazer isso?
Para evitar fazer muito download na sua App. Assim vocÊ economiza na hora de baixar e “decodificar” dados e transforma-los em imagem, etc.

 

Se post foi util pra voce, da um Google+1 !!!

😀

Criar tabelas e banco dados SQLite no Android

Atualmente, estamos evoluindo para um processamento e armazenamento nas nuvens. Com isso temos milhares de servidores trabalhando para gente. Então temos aplicações robustas, banco de dados, servidores, firewalls, protocolos e tudo sem requisitar desempenho do usuário. O celular está seguindo o mesmo caminho, porque não há muito poder de processamento e consequentemente o core do business fica no server. O papel do celular é pegar o dado fresco e exibir pro usuário. Porém algumas informações poderiam ser alocadas nos mesmos. Assim não seria necessário requisita servidor, ou armazenar informações mínimas de ultimo acesso. Aí entra no SQLite.

O SQLite é um  “banco de dados leve” feito para rodar em dispositivos com pouco poder de processamento.

No Android, podemos encontrar as classes SQLite que nos auxilia na criação e gerenciamento de um banco de dados.

Hoje vou mostrar um exemplo de como usar.

classe CourseData.java é o arquivo que representa o banco e a tabela.

Essa classe herda de SQLiteOpenHelper que auxilia na criação com seus métodos nativos. Tudo que vocÊ tem a fazer é montar a estrutura da sua tabela e banco com atributos (String, int, etc) e métodos (CreateTable).


import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class CourseData extends SQLiteOpenHelper {
 public static final String TABLE_NAME = "CLASSES";
 public static final String ID = "_id";
 public static final String PREFIX = "PREFIX";
 public static final String NUMBER = "NUMBER";
 private static final String DATABASE_NAME = "classes.db";
 private static final int DATABASE_VERSION = 1;

 public CourseData (Context ctx) {
 super (ctx, DATABASE_NAME, null, DATABASE_VERSION);
 }

 @Override
 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
 db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
 onCreate(db);
 }

 @Override
 public void onCreate(SQLiteDatabase db) {
 db.execSQL("CREATE TABLE " + TABLE_NAME + " (" + ID
 + " INTEGER PRIMARY KEY AUTOINCREMENT, " + PREFIX + " TEXT NOT NULL, "
 + NUMBER + " INTEGER);");
 }

 public void onInsert(){

 }

}

Pronto! Agora temos um banco de dados. Agora vamos ver o que podemos fazer..

Vamos para a Activity e criar método para inserção, deleção, consulta e edição.

Na SqliteLab herda de Activity. Nela nos “criamos”(em aspas, porque os botões já foram criados no xml) os botoes de acao, que ao serem clicados executaram uma ação.

Como um atributo dessa classe temo o banco de dados


private CourseData cD;

Aconselho você a fazer isso com os cursores e adapters, pois você sempre terá que fecha-los. Assim você evita criar o mesmo objeto várias vezes e deixando os na memória o rendimento da aplicação cai.


db.close();

cursor.close();


import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;

public class SqliteLab extends Activity {
 private CourseData cD;
 /** Called when the activity is first created. */
 @Override
 public void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.main);
 cD = new CourseData(this);

 Button retrieve = (Button)findViewById(R.id.Retrieve);
 Button add = (Button)findViewById(R.id.Add);
 Button change = (Button)findViewById(R.id.Change);
 Button delete = (Button)findViewById(R.id.Delete);

 delete.setOnClickListener(new OnClickListener() {

 @Override
 public void onClick(View v) {
 deleteFromDB();

 }
 });
 change.setOnClickListener(new OnClickListener() {

 @Override
 public void onClick(View v) {
 updateDB();

 }
 });

 retrieve.setOnClickListener(new OnClickListener() {
 @Override
 public void onClick(View v) {
 displayRecords(populateCursor());
 }
 });
 add.setOnClickListener(new OnClickListener() {
 @Override
 public void onClick(View v) {
 insertDB();
 }
 });
}
//metodo que cria um cursor e popula ele com os dados do banco
 private Cursor populateCursor(){
 String[] FROM = {CourseData.ID,CourseData.PREFIX,CourseData.NUMBER};
 SQLiteDatabase db = cD.getReadableDatabase();
 Cursor myC = db.query(CourseData.TABLE_NAME, FROM, null, null, null, null, null);
 startManagingCursor(myC);
 return myC;
}
//metodo que recebe o cursor ja populado e os "coloca" na ListView
 private void displayRecords(Cursor c){
 String[] from = {CourseData.ID,CourseData.PREFIX,CourseData.NUMBER};
 int[] to = new int[]{R.id.tvId,R.id.tvPrefix,R.id.tvNumber};
 ListView lv = ((ListView)findViewById(R.id.lvList));
 SimpleCursorAdapter rec = new SimpleCursorAdapter(this,R.layout.dbrow, c, from, to);
 lv.setAdapter(rec);
 c.close();
 }
 //Metodo que insere um registro no banco. Se voce reparar voce nao usa sql no codigo. Mas em qualquer caso, voce ainda pode usar.
 public void insertDB(){
 SQLiteDatabase db = cD.getWritableDatabase();
 ContentValues values = new ContentValues();
 //values.put(CourseData.ID,1);
 values.put(CourseData.PREFIX,"CSCI");
 values.put(CourseData.NUMBER,153);
 db.insert(CourseData.TABLE_NAME, null, values);
 db.close();
}
//metodo que atualiza um registro no banco
 public void updateDB(){
 SQLiteDatabase db = cD.getWritableDatabase();
 String where = "\"NUMBER\"=\"153\"";
 ContentValues values = new ContentValues();
 values.put(CourseData.NUMBER,151);
 db.update(CourseData.TABLE_NAME, values, where, null);
 db.close();

}
//metodo que deleta um retgistro do banco
 public void deleteFromDB(){
 SQLiteDatabase db = cD.getReadableDatabase();
 String where = "NUMBER=\"151\"";
 db.delete(CourseData.TABLE_NAME, where, null);
 db.close();
 }
}

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >

   	<Button android:layout_width="fill_parent"
   		android:layout_height="wrap_content"
   		android:id="@+id/Retrieve"
   		android:text = "Retrieve records"
   		/>
   	<Button android:layout_width="fill_parent"
   		android:layout_height="wrap_content"
   		android:id="@+id/Add"
   		android:text = "Add a record"
   		/>
   	<Button android:layout_width="fill_parent"
   		android:layout_height="wrap_content"
   		android:id="@+id/Change"
   		android:text = "Change record"
   		/>
   		<Button android:layout_width="fill_parent"
   		android:layout_height="wrap_content"
   		android:id="@+id/Delete"
   		android:text = "Delete records"
   		/>

    <ListView
	  	android:layout_width="wrap_content"
	  	android:layout_height="wrap_content"
	  	android:id="@+id/lvList"
	  	android:divider="@drawable/divider"
	  	android:dividerHeight="1px"
	  	/>

</LinearLayout>

e as linhas da ListView que irei fazer um posto so pra listview semana que vem!!

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
	    android:orientation="horizontal"
	    android:layout_width="wrap_content"
	    android:layout_height="wrap_content"
	    >
	<TextView xmlns:android="http://schemas.android.com/apk/res/android"
		android:id="@+id/tvId"
		android:layout_width="wrap_content"
		android:layout_height="wrap_content"
		/>
	<TextView xmlns:android="http://schemas.android.com/apk/res/android"
		android:id="@+id/tvPrefix"
		android:layout_width="wrap_content"
		android:layout_height="wrap_content"
		android:layout_marginLeft="2mm"
		>
	</TextView>
	<TextView xmlns:android="http://schemas.android.com/apk/res/android"
		android:id="@+id/tvNumber"
		android:layout_width="wrap_content"
		android:layout_height="wrap_content"
		android:layout_marginLeft="2mm"
		>
	</TextView>

</LinearLayout>

Se post foi util pra voce, da um Google+1 !!!

:D

Usar Tabs no Android

Uma coisa muito útil é Tab. Quando você tem Activities Pai que tem alguns filhos, é bom usar Tabs. Deixa o App mais limpo, fácil e intuitivo para o usuário, ao invés de ficar sempre abrindo uma nova Activity e ficar indo e voltando(sinceramente, isso é chato pra caramba. Ter que ficar procurando coisas num App é a pior experiência que um usuário pode ter).

Como sou um usuário, meio que, exigente, gosto de aplicações fáceis de mexer e que penso em usá-la todo dia.
Uso também um método de produto chamado pretotype . -> http://www.pretotyping.org/ . É bom usar e desenvolver o lado usuário do Líder de projetos/programador/desenvolvedor/designer/etc.

Voltando….Irei postar um exemplo de como usar Tabs no seu projeto Android.

Primeiro tenha o elemento no xml. De preferencia no main.xml.

No main.xml temos a TabHost, que é onde as tabs ficarão. A TabHost é o objeto onde “hospeda” as Tabs. TabHost gerencia as tabs. TabWidget represetará cada uma das tabs. E o framelayout carregara os conteudos das Tabs. Pois Cada Tab tem seu layoiut (arquivo .xml) e tem sua Activity. (Não esqueça de especificar no main)


<?xml version="1.0" encoding="utf-8"?>
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/tabhost"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<LinearLayout
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:padding="5dp"
>

<TabWidget
android:id="@android:id/tabs"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>

<FrameLayout
android:id="@android:id/tabcontent"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:padding="5dp"
/>
</LinearLayout>
</TabHost>

Depois de ter o .xml . Vamos a MainActivity.java

 import android.app.ActivityGroup;
 import android.content.Intent;
 import android.content.res.Resources;
 import android.os.Bundle;
 import android.widget.TabHost;

//MainActivity herda de ActivityGroup, porque vocÊ está lidando
 //com várias atividades em um elemento só. Ou seja, o TabHost hospeda um grupo de atividades.
 public class MainActivity extends ActivityGroup {
 static TabHost tabHost;
 static int tab = -1;

@Override
 public void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.main);

Resources res = getResources();
 tabHost = (TabHost)findViewById(R.id.tabhost);
 tabHost.setup(this.getLocalActivityManager());
 TabHost.TabSpec spec;
 Intent intent;

//Cada Tab adicionada tem sua própria Activity, que por sua vez , tem seu próprio .xml(layout) e //também tem um elemento Drawable. Esse elemento eu usei para mudar o ícone da Tab.
 //Quando ela não está ativa, o ícone é cinza. Quando ela está ativa, o ícone fica colorido e indica //pro usuário que ele está naquela Tab.

// Nesse meu exemplo, eu tenho 4 Tabs.4 Activities. 4 Layouts. 4 drawable que faz a mudança de ícone. // 1 para cada Tab.

// Adiciona Tab #1
 intent = new Intent().setClass(this, HomeActivity.class);
 spec = tabHost.newTabSpec("0").setIndicator("Home", res.getDrawable(R.drawable.tab_home)).setContent(intent);
 tabHost.addTab(spec);

// Adiciona Tab #2
 intent = new Intent(this, SearchActivity.class);
 spec = tabHost.newTabSpec("1").setIndicator("Cidade", res.getDrawable(R.drawable.tab_city)).setContent(intent);
 tabHost.addTab(spec);

// Adiciona Tab #3
 intent = new Intent().setClass(this, OndeEstouActivity.class);
 spec = tabHost.newTabSpec("2").setIndicator("Onde Estou?", res.getDrawable(R.drawable.tab_where)).setContent(intent);
 tabHost.addTab(spec);

// Adiciona Tab #4
 intent = new Intent().setClass(this, ListasActivity.class);
 spec = tabHost.newTabSpec("3").setIndicator("Mapas", res.getDrawable(R.drawable.tab_mapas)).setContent(intent);
 tabHost.addTab(spec);

//essa ultima linha indica qual tab será carregada ao iniciar essa activity. No nosso caso, a Primeira!!!

tabHost.setCurrentTab(0);

}

}

Pronto. Agora você Tabs em sua aplicação.
Vale lembrar que você precisar fazer uma Activity pra cada Tab que você irá ter e uma layout respectivamente.

Como pegar dados de um Web Service usando Ksoap2 library…

Durante o desenvolvimento mobile, onde sua aplicação precisa pegar dados de um server, você chega a um ponto em que é preciso acessar um web service para pegar os dados necessários.

Como fazer isso no Android?

Através da biblioteca ksoap2 -> http://code.google.com/p/ksoap2-android/

Essa biblioteca nos permite acessar o webservice, requisitar dados e recebe-los de uma maneira simples. Através do link acima, você pode baixar a API e adicionar em seu projeto.

1. Declare as String`s importantes para definir o caminho e métodos que serão usados para serem acessados pelos objetos ksoap2


private static final String METHOD_NAME = "getFoo";
private static final String NAMESPACE = "http://foo.com.br/webservice/services/FooWebService";
private static final String URL ="http://foo.com.br/webservice/services/FooWebService?wsdl";

A primeira linha é o método do web service que você vai chamar.

A segunda linha é o “nome” do caminho de onde o web service se encontra.

A terceira linha é o serviço. Um arquivo .xml WSDL. Se você é novo nessa área, de uma olhada aqui.

Depois de termos definido essas constantes, vamos agora usar o ksoap2.

2. Cria um objeto SoapObject e com os atributos NAMESPACE e METHOD_NAME

  SoapObject request =  new SoapObject(NAMESPACE, METHOD_NAME);

3. Cria um objeto Property Info para colocar o dado que será mandado para o webservice. PropertyInfo é uma propriedade de um SoapObject

PropertyInfo pi = new PropertyInfo();

4. Nome da variavel que sera passada

pi.setName(nome);

5. Valor da variavel que sera passada. Essa variavel sera enviada para o web service, e depois ele retornara o resultado

pi.setValue(parametro);

6. tipo da variavel. Pode ser qualquer Object.

pi.setType(tipo);

7. Adiciona essa propriedade no objeto request

request.addProperty(pi);

8. Cria um objecto SoapSerializationEnvelope que irá receber um objeto serializado do webservice e entregará de volta ao app

SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);

9. Define o objeto de retorno
Nessa linha definimos o tipo de objeto que sera retornado. Mas essa linha não é obrigatória, pois o ksoap automaticamente retorna um objeto Object

envelope.addMapping(NAMESPACE, nomeObjetoRetorno,  Object.class);

10. Setta o request aqui. Pois o objeto envelope mandará esse objeto request e receberá um outro objeto.

envelope.setOutputSoapObject(request);

11. Cria o objeto que fará a conexão com o web service

AndroidHttpTransport transport = new AndroidHttpTransport(URL);

12. Objeto que receberá o resultado do envelope

KvmSerializable response = null;
try {
transport.call(NAMESPACE, envelope);  //Conecta e envia o objeto
response  = (KvmSerializable)envelope.bodyIn; //recebe o resultado do web service. Um array de Objetos
} catch (Exception e) {
e.printStackTrace();
}

13. Cria um array de SoapObjects[] para receber os objetos do KvmSerializable response
Como eu estou esperando vários objetos do meu web service, eu vou coloca-los num array de SoapObject[]

if(response!=null){
SoapObject[] pontos = new SoapObject[response.getPropertyCount()];

14. Pega de response, passa pro SoapObject[]
Aqui mesmo você pode passar de SoapObject para o objeto que você estava esperando. Pode ser um que você tenha criado, ou uma String ou Object.

for (int i = 0; i < response.getPropertyCount(); i++) {
pontos[i] = (SoapObject) response.getProperty(i);
           }
}

Pegar latitude e longitude no android

Esse tutorial é bem simples. Se você quer saber sua latitude e longitude no Android e usar na sua aplicação, leia abaixo.

Essa é uma simples classe Activity chamada GpsDisplay. Nel, eu pego alguns TextViews e exibo as informações que eu quero, vindas do GPS.

O GPS pode fornecer essas informações para você.


final TextView acc = (TextView)findViewById(R.id.txtAccuracy);
final TextView alt = (TextView)findViewById(R.id.txtAltitude);
final TextView lat = (TextView)findViewById(R.id.txtLatitude);
final TextView longi = (TextView)findViewById(R.id.txtLongitude);
final TextView pro = (TextView)findViewById(R.id.txtProvider);
final TextView spd = (TextView)findViewById(R.id.txtSpeed);
final TextView proList = (TextView)findViewById(R.id.txtProvList);

  • Precisão = Accuracy
  • Altitude
  • Latitude
  • Longitude
  • Provider = Que é de onde ele está tirando a informação. Pode ser o gps ou network(internet).
  • Speed – Velocidade a qual vocÊ está se movimentando.
  • E por ultimo, uma lista de providers.

Nessa View, eu criei vários TextView´s para exibir as informações e um botão, que ao ser clicado, ele irá criar objetos da classe LocationManager e Location e mais uma String que armazenará os providers.


Button retrieve = (Button)findViewById(R.id.btnRetrieve);
retrieve.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
LocationManager LM = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
String bestProvider = LM.getBestProvider(new Criteria(),true);
//System.out.println("*************"+LM.getBestProvider(new Criteria(),true));
Location l = LM.getLastKnownLocation(bestProvider);
if(l!=null){
acc.setText(String.valueOf(l.getAccuracy()));
alt.setText(String.valueOf(l.getAltitude()));
lat.setText(String.valueOf(l.getLatitude()));
longi.setText(String.valueOf(l.getLongitude()));
pro.setText(String.valueOf(l.getProvider()));
spd.setText(String.valueOf(l.getSpeed()));
proList.setText(String.valueOf(LM.getAllProviders()));
}else{
acc.setText(R.string.noInfo);
alt.setText(R.string.noInfo);
lat.setText(R.string.noInfo);
longi.setText(R.string.noInfo);
pro.setText(R.string.noInfo);
spd.setText(R.string.noInfo);
proList.setText(R.string.noInfo);
}
}
});

LocationManager pega o serviço que está disponível, no caso, o serviço de localização, que é o que o GPS usa.
A String bestProvider armazena o melhor provider(o provedor de localização) que estiver disponível.
Ao criar um objeto Location ele pega a ultima localização(que seria a atual), e atribui ao objeto location.
Se o objeto não estiver nulo,
Através dele, conseguimos pegar os items citados no começo do post.
Senão,
os textViews são settados para “No Information”. Isso pode ocorrer no caso do GPS estiver desligado, ou no caso do emulador.

Maaasss. Pra isso tudo funcionar certinho, voce tem que editar o AndroidManifest.xml
E nele, voce adiciona uma uses-permission como aqui:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"> </uses-permission>

Abaixo segue o AndroidManifest.xml a classe que pega o gps e o main.xml.
Até mais.

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="lab.blog.ps"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".GpsDisplay"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

</application>
<uses-sdk android:minSdkVersion="8" />

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION">

</uses-permission>
</manifest>

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"

>
<TableLayout android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
>
<TableRow android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
>
<Button android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/btnRetrieve"
android:text = "Retrieve Data"
android:layout_gravity="center"
/>

</TableRow>
<TableRow android:layout_width="wrap_content"
android:layout_height="wrap_content"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Accuracy"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/noInfo"
android:id="@+id/txtAccuracy"
/>
</TableRow>
<TableRow android:layout_width="wrap_content"
android:layout_height="wrap_content"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Altitude"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/noInfo"
android:id="@+id/txtAltitude"
/>
</TableRow>
<TableRow android:layout_width="wrap_content"
android:layout_height="wrap_content"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Latitude"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/noInfo"
android:id="@+id/txtLatitude"
/>
</TableRow>
<TableRow android:layout_width="wrap_content"
android:layout_height="wrap_content"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Longitude"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/noInfo"
android:id="@+id/txtLongitude"
/>
</TableRow>
<TableRow android:layout_width="wrap_content"
android:layout_height="wrap_content"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Provider"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/noInfo"
android:id="@+id/txtProvider"
/>
</TableRow>
<TableRow android:layout_width="wrap_content"
android:layout_height="wrap_content"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Speed"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/noInfo"
android:id="@+id/txtSpeed"
/>
</TableRow>
</TableLayout>

<TextView
android:layout_marginTop="10px"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Providers currently available"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="------------------------------"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=""
android:id="@+id/txtProvList"
/>
</LinearLayout>

GpsDisplay.java


import android.app.Activity;
import android.content.Context;
import android.view.View.OnClickListener;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationManager;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class GpsDisplay extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

final TextView acc = (TextView)findViewById(R.id.txtAccuracy);
final TextView alt = (TextView)findViewById(R.id.txtAltitude);
final TextView lat = (TextView)findViewById(R.id.txtLatitude);
final TextView longi = (TextView)findViewById(R.id.txtLongitude);
final TextView pro = (TextView)findViewById(R.id.txtProvider);
final TextView spd = (TextView)findViewById(R.id.txtSpeed);
final TextView proList = (TextView)findViewById(R.id.txtProvList);

Button retrieve = (Button)findViewById(R.id.btnRetrieve);
retrieve.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
LocationManager LM = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
String bestProvider = LM.getBestProvider(new Criteria(),true);
//System.out.println("*************"+LM.getBestProvider(new Criteria(),true));
Location l = LM.getLastKnownLocation(bestProvider);
if(l!=null){
acc.setText(String.valueOf(l.getAccuracy()));
alt.setText(String.valueOf(l.getAltitude()));
lat.setText(String.valueOf(l.getLatitude()));
longi.setText(String.valueOf(l.getLongitude()));
pro.setText(String.valueOf(l.getProvider()));
spd.setText(String.valueOf(l.getSpeed()));
proList.setText(String.valueOf(LM.getAllProviders()));
}else{
acc.setText(R.string.noInfo);
alt.setText(R.string.noInfo);
lat.setText(R.string.noInfo);
longi.setText(R.string.noInfo);
pro.setText(R.string.noInfo);
spd.setText(R.string.noInfo);
proList.setText(R.string.noInfo);
}
}
});
}
}

REsultado:

Internacionalizando sua APP!

Como internacionalizar sua app? Fazê-la ter várias línguas e aumentar a posibilidade de ser baixada em vários países diferentes.

Simples.

O Android já é preparado para isso!!!

Você constroe sua aplicação uma vez, e quando o Android for executá-la, ele escolhe a melhor configuração para aquele local, região ou língua.

O que basta você fazer é apenas ter várias pastas values com arquivos strings. Cada pasta representa uma língua ou até região para qual seu app irá mostrar determinadas Strings.

Como você pode ver na figura acima, meu projeto tem várias pastas chamada value-##. Ou seja cada pasta value tem String para determinada língua ou região. O padrão é a somente “values” que é em inglês. Você pode adicionar um values-pt para português, ou values-es para espanhol, ou quem sabe values-fr para francês ou values-de para alemão. As siglas das línguas estão de acordo com a ISO  639.2.

O conteúdo do arquivo string.xml é basicamente todo as strings (textos) que aparecerão em sua app. Por exemplo:
Se nela você tem um campo chamado nome. (irá aparecer na tela para o usuário) cada arquivo string.xml terá essa variável, com o mesmo nome, porém conteúdo diferente.

<!-- Nota: cada string estará em um string.xml embaixo de uma pasta diferente -->
<!-- embaixo values-pt -->
 <string name="nome" >Nome</string>
<!-- embaixo values -->
<string name="nome" >Name</string>
<!-- embaixo de values-es -->
<string name="nome" >Nombre</string>

Fazendo atenciosamente cada arquivo string.xml embaixo das pastas values você conseguirá internacionalizar sua app e fazer com que ela aparece em várias línguas e em várias partes do mundo!!!

Referência: http://developer.android.com/guide/topics/resources/providing-resources.html#table2

%d blogueiros gostam disto: