You are on page 1of 19

GUIA DE DESARROLLO ANDROID – CLASE COMPONENTES BASICOS - ARQUITECTURA

OBJETIVOS

 Manejo de Elementos de Lista


 Manejo de Media y Sharing

INDICACIONES

 Seguir la siguiente guía de desarrollo durante la clase.

Al finalizar la guía realice lo siguiente:

1. Subir en el aula virtual el proyecto desarrollado


2. Subir un documento con las capturas de pantalla del proyecto desarrollado.

MANEJO DE INTERFASES
Creando Listas:

Las listas son elementos compuestos que nos permiten grupos de información dentro de cada elemento
de la lista. Para crear una lista primero debemos de crear la estructura de la fila que estará dentro del
listado. Para esto realizamos los siguientes pasos:

1. Crear un layout para la fila.

2. Con el layout creado, procederemos a diseñar el mismo. Para este ejemplo nuestro layout
tendrá 4 elementos:
El layout de dicha pantalla esta a continuación:

<?xml version="1.0" encoding="utf-8"?>


<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">

<TextView
android:id="@+id/txt1RowLay1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="7"
android:gravity="start"
android:text="UPC"

android:textAppearance="@style/TextAppearance.AppCompat.Title"
android:textStyle="bold" />

<TextView
android:id="@+id/txt2RowLay1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="end"
android:text="11:23"

android:textAppearance="@style/TextAppearance.AppCompat.Medium"
android:textStyle="bold" />
</LinearLayout>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">

<TextView
android:id="@+id/txt3RowLay1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="start"
android:text="Comunicaciones UPC"

android:textAppearance="@style/TextAppearance.AppCompat.Medium"
android:textColor="@android:color/black" />
</LinearLayout>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/txt4RowLay1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="start"
android:lines="2"
android:text="Programa de Especializacion para Ejecutivos.
Hola Roxana, queremos invitarte a nuestra charla especializada en
Administración y " />
</LinearLayout>
</LinearLayout>

3. A continuación tenemos que crear la pantalla que albergara la lista e insertamos un elemento
del tipo ListView.
4. Luego con los 2 xmls ya construidos, debemos de crear los objetos, las clases y el controlador
que de los datos que serán mostrados en nuestra lista. Para eso crearemos los siguientes
paquetes y clases:

5. La clase asignación tendrá los siguientes atributos y sus métodos selectores.


6. La clase controlador nos permitirá crear la data que será mostrada en la pantalla de lista.

7. Luego debemos de crear las clases que manejaran los XML. Crearemos la clase Lista1 que
maneje la pantalla de Lista.
8. Luego crearemos una clase que maneje la fila de la lista ListA1dapter.

La clase completa:

package pe.edu.upc.androidapp1.androidapp1;

import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.LinearLayout;
import android.widget.TextView;
import java.util.List;
import pe.edu.upc.androidapp1.model.Asignacion;

public class Lista1Adapter extends ArrayAdapter<Asignacion> {

private Activity context;


private int resource;
private List<Asignacion> items;

public Lista1Adapter(Activity mContext, int resource, List<Asignacion>


items) {
super(mContext, resource, items);
this.context = mContext;
this.resource = resource;
this.items = items;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) getContext()
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

final Asignacion item = items.get(position);


LinearLayout rowView;

if (convertView == null) {
rowView = new LinearLayout(getContext());
inflater.inflate(resource, rowView, true);
} else {
rowView = (LinearLayout) convertView;
}

TextView texto1 = (TextView) rowView.findViewById(R.id.txt1RowLay1);


TextView texto2 = (TextView) rowView.findViewById(R.id.txt2RowLay1);
TextView texto3 = (TextView) rowView.findViewById(R.id.txt3RowLay1);
TextView texto4 = (TextView) rowView.findViewById(R.id.txt4RowLay1);

texto1.setText(item.getAsignatario());
texto2.setText(item.getFecha());
texto3.setText(item.getTitulo());
texto4.setText(item.getContenido());

return rowView;
}
}

9. En el Manifest declaramos la nueva actividad.


Ejecutamos el emulador.
Manejar Eventos sobre la lista:

Para manejar eventos es necesario agregar un listener a la lista. El código es el siguiente:


MANEJO DE PERMISOS - GPS
Para este ejemplo utilizaremos el permiso del GPS.

1. Crearemos un layout que mostrará las coordenadas GPS.

2. Crearemos un paquete utilitario que nos permita obtener las coordenadas GPS. La clase
completa:

import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.util.Log;

public class GPS {

public static Location currentBestLocation;


private static LocationManager b;
private static boolean c = false;
private static boolean d = false;
private static boolean e = false;

public static int TEN_SECONDS = 10000;


public static String mensaje;

private static LocationResult f;

static LocationListener a = new LocationListener() {

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

@Override
public void onProviderEnabled(String provider) {

@Override
public void onProviderDisabled(String provider) {

@Override
public void onLocationChanged(Location location) {
Log.d("Location", "Location Received: " + location.getLatitude()
+ "; " + location.getLongitude());
try {
if (GPS.isBetterLocation(location, GPS.currentBestLocation)) {
GPS.currentBestLocation = location;
}

} catch (Exception localException) {


Log.e("Location", "onLocationChanged", localException);
}
}
};

public static boolean isCanGetLocation() {


return e;
}

public static void setCanGetLocation(boolean paramBoolean) {


e = paramBoolean;
}

public static void setLocationResult(LocationResult paramLocationResult) {


f = paramLocationResult;
}

public static boolean startListening(Context paramContext) {


if (b == null)
b = (LocationManager)
paramContext.getSystemService(Context.LOCATION_SERVICE);
System.out.println(b.getAllProviders().toString());
try {
c = b.isProviderEnabled("gps");
} catch (Exception localException1) {
}
try {
d = b.isProviderEnabled("network");
} catch (Exception localException2) {
}
if ((!c) && (!d)) {
setCanGetLocation(false);
return false;
}
if (c) {
setCanGetLocation(true);
b.requestLocationUpdates("gps", TEN_SECONDS, 10.0F, a);
System.out.println("GPS Registered");
mensaje = "GPS";
}

if (d) {
setCanGetLocation(true);
b.requestLocationUpdates("network", TEN_SECONDS, 10.0F, a);
System.out.println("Network Registered");
mensaje = "Network";
}

return true;
}

public static boolean startListening(Context paramContext,


LocationResult paramLocationResult) {
setLocationResult(paramLocationResult);
return startListening(paramContext);
}

public static Location getLocation() throws Exception {


if (currentBestLocation == null) {
Location localLocation1 = b.getLastKnownLocation("gps");
Location localLocation2 = b.getLastKnownLocation("network");
if ((c & d)) {
if (isBetterLocation(localLocation1, localLocation2)) {
currentBestLocation = localLocation1;
mensaje = "GPS";
} else {
currentBestLocation = localLocation2;
mensaje = "Network";
}
} else if (c) {
mensaje = "GPS";
currentBestLocation = localLocation1;
} else if (d) {
mensaje = "Network";
currentBestLocation = localLocation2;
}
}
return currentBestLocation;
}

public static String getMensaje() {


return mensaje;
}

public static void stopListening() {


try {
b.removeUpdates(a);
f = null;
} catch (NullPointerException localNullPointerException) {
}
}

public static String getLocationState() {


StringBuilder localStringBuilder = new StringBuilder("network: ");
if (d)
localStringBuilder.append("ON");
else {
localStringBuilder.append("OFF");
}
localStringBuilder.append("\ngps: ");
if (c)
localStringBuilder.append("ON");
else {
localStringBuilder.append("OFF");
}
return localStringBuilder.toString();
}

protected static boolean isBetterLocation(Location paramLocation1,


Location paramLocation2) throws
Exception {
if (paramLocation2 == null) {
return true;
}

long l = paramLocation1.getTime() - paramLocation2.getTime();


int i = l > 120000L ? 1 : 0;
int j = l < -120000L ? 1 : 0;
int k = l > 0L ? 1 : 0;

if (i != 0) {
return true;
}

if (j != 0) {
return false;
}

int m = (int) (paramLocation1.getAccuracy() - paramLocation2


.getAccuracy());
int n = m > 0 ? 1 : 0;
int i1 = m < 0 ? 1 : 0;
int i2 = m > 200 ? 1 : 0;

boolean bool = a(paramLocation1.getProvider(),


paramLocation2.getProvider());

if (i1 != 0)
return true;
if ((k != 0) && (n == 0)) {
return true;
}

return (k != 0) && (i2 == 0) && (bool);


}

private static boolean a(String paramString1, String paramString2) {


if (paramString1 == null) {
return paramString2 == null;
}
return paramString1.equals(paramString2);
}

public static abstract class LocationResult {


public abstract void getLocation(Location paramLocation);
}

}
3. Se creará una Clase que maneje el XML de la clase GPS. Importante, en esta clase se debe de
declarar la solicitud de permisos al usuario en caso Android sea mayor a la versión 6.

El código completo de la clase:

import android.Manifest;
import android.app.Activity;
import android.content.Context;
import android.content.pm.PackageManager;
import android.location.Location;
import android.location.LocationManager;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.app.ActivityCompat;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import pe.edu.upc.androidapp1.util.GPS;

public class ActivityGPS extends Activity implements View.OnClickListener{

LocationManager locManager;
Location location = null;
TextView txvlatitud, txvlong;
Button btnObtener;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activitygps);

txvlatitud = (TextView)findViewById(R.id.txtViewGPS_lat);
txvlong = (TextView)findViewById(R.id.txtViewGPS_lon);
btnObtener = (Button)findViewById(R.id.obtenerGPS);
btnObtener.setOnClickListener(this);
}

@Override
public void onClick(View v){
//Validamos si es requerido realizar la solicitud de permisos(version 6)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 1);
}else{
getLocation();
}
}

public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {


switch (requestCode) {
case 1: {
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
getLocation();
} else {
// permission denied, boo! Disable the
// functionality that depends on this permission.
}
return;
}
// other 'case' lines to check for other
// permissions this app might request
}
}

private void getLocation(){


locManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);

if (!locManager.isProviderEnabled(LocationManager.GPS_PROVIDER)
&& !locManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {
Toast.makeText(this, "Activar Gps", Toast.LENGTH_SHORT).show();
} else {
GPS.startListening(this);
try {
if (GPS.isCanGetLocation()) {
location = GPS.getLocation();
String latitud = String.valueOf(location.getLatitude());
String longitud = String.valueOf(location.getLongitude());
String proveedor = location.getProvider().toString();

txvlatitud.setText("latitud: " + latitud);


txvlong.setText("longitud: " + longitud);
}
} catch (Exception e) {
Toast.makeText(this, "ERROR OBTENINENDO GPS",Toast.LENGTH_SHORT).show();
txvlatitud.setText("latitud: ");
txvlong.setText("longitud: ");
}
}
}

@Override
public void onBackPressed()
{
GPS.stopListening();
super.onBackPressed(); // optional depending on your needs
}
}

4. Finalmente en el archivo Manifest se deberá de colocar los permisos respectivos:


MANEJO DE PERMISOS - CAMARA
1. Creamos un XML que contenga 3 componentes: Boton de Captura de imagen, un ImageView y
un Boton de Almacenar Foto.

Creamos un activity que permita manejar el XML. En dicha clase obtenemos las referencias a
los componentes.
TAREA DE IMPLEMENTACION

1. En el activity de cámara, implementar la solicitud de permisos para Android 6 o


superior.
2. Implementar una actividad que sea una lista que muestre los contactos del
dispositivo(nombre y nro de teléfono).
3. Implementar una actividad que permita grabar video
4. Implementar una actividad que permita grabar audio.
5. Crear una pantalla inicial que permita mostrar las distintas pantallas que se han
venido creando en el presente proyecto.