Diferencia entre revisiones de «Intents. Lanzar unha Activity»

De Manuais Informática - IES San Clemente.
Ir a la navegación Ir a la búsqueda
 
(Sin diferencias)

Revisión actual del 21:48 4 nov 2014

Permisos

  • Cando instalamos unha aplicación nun dispositivo real (non nun AVD) se precisa acceder a características que esixen algún tipo de permiso, o proceso de instalación pregunta se estamos dispostos a dar eses permisos para que a aplicación poida funcionar con tódalas súas funcionalidades.
  • Por exemplo, instalando Gmail:

Gmail.png

  • O proceso de instalación pregunta ao usuario se por exemplo lle deixa acceder a esta aplicación á súa lista de contactos.
  • No ficheiro AndroidManifest.xml é onde se declaran os permisos que precisa a aplicación para poder facer uso de funcionalidades protexidas: contactos, cámara, mermoria usb, gps, etc.
  • A través de unha ou varias etiquetas <uses-permission> vanse declarar os permisos que precisa a aplicación.

Exemplos de permisos no ficheiro AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.u3_20_intents"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="16"
        android:targetSdkVersion="21" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".U3_20_Intents"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".RecibirDatos"
            android:label="@string/title_activity_recibir_datos" >
        </activity>
    </application>

    <uses-permission android:name="android.permission.CALL_PHONE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.READ_CONTACTS" />
 

</manifest>
  • Liña 31: Permiso que "permite" realizar unha chamada de telefono sen pasar a través do interface do teléfono para que o usuario marque.
  • Liña 32: Permítelle á aplicación abrir conexións de rede.
  • Liña 33: Da súa lectura pódese concluír o que permite.
  • Tamén se pode realizar de modo gráfico.
  • No ficheiro AndroidManifest.xml premer en Permissions

Android 2014 U3 20 LanzarActivity 15.jpg

  • Lembrar que os permisos asígnanse no momento da instalación a aplicación. Nun dispositivo real pídeselle consentimento ao usuario, non así nun AVD.

Chamadas a intents de modo implícito

  • Como xa se dixo, o que un compoñente pode ser lanzado de forma implícita cando se indica a acción que se desexa realizar e se é o caso os datos sobre os que se desexa realizar a acción.
  • Non se vai especificar a
package com.example.u3_20_intents;

import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.CheckBox;
import android.widget.TextView;
import android.widget.Toast;

public class U3_20_Intents extends Activity {

	public final static String NOME = "com.example.NOME";
	private static final int COD_PETICION = 33;
	private static final int COD_CONTACTOS = 7;

	TextView tvNome;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_u3_20__intents);
		tvNome = (TextView) findViewById(R.id.et_nome);
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.u3_20__intents, menu);
		return true;
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		// Handle action bar item clicks here. The action bar will
		// automatically handle clicks on the Home/Up button, so long
		// as you specify a parent activity in AndroidManifest.xml.
		int id = item.getItemId();
		if (id == R.id.action_settings) {
			return true;
		}
		return super.onOptionsItemSelected(item);
	}

	public void onEnviarClick(View view) {
		CheckBox chkDestruir = (CheckBox) findViewById(R.id.chk_destruir);

		Intent intent = new Intent(this, RecibirDatos.class);
		intent.putExtra(NOME, tvNome.getText().toString());

		// startActivity(intent);
		startActivityForResult(intent, COD_PETICION);

		if (chkDestruir.isChecked())
			finish();
	}

	public void onCalculadoraClick(View v) {

		Intent intent = new Intent();
		intent.setClassName("com.android.calculator2", "com.android.calculator2.Calculator");

		// startActivity(intent);
		startActivityForResult(intent, 3);
	}

	@Override
	// Este método chámase cando se volve da actividade secundaria
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {

		if (requestCode == COD_PETICION) {
			if (resultCode == RESULT_OK) {
				if (data.hasExtra("APELIDO")) {
					Toast.makeText(this, tvNome.getText() + " O teu apelido é " + data.getExtras().getString("APELIDO"), Toast.LENGTH_SHORT).show();
				}
			} else
				Toast.makeText(this, "Saíches da actividade secundaria sen premer o botón Pechar", Toast.LENGTH_SHORT).show();
		}

		else if (requestCode == COD_CONTACTOS && resultCode == RESULT_OK) {
			Uri contactoData = data.getData();
			Cursor c = managedQuery(contactoData, null, null, null, null);
			if (c.moveToFirst()) {
				String nombre = c.getString(c.getColumnIndexOrThrow(ContactsContract.Contacts.DISPLAY_NAME));
				Toast.makeText(this, "Contacto: " + nombre, Toast.LENGTH_LONG).show();
			}
		}

	}

	public void chamarIntent(View view) {
		Intent intent = null;
		switch (view.getId()) {
		case R.id.btn_seleccionar_contacto:
			intent = new Intent(Intent.ACTION_PICK, Uri.parse("content://contacts/people/"));
			startActivityForResult(intent, COD_CONTACTOS);
			break;

		case R.id.btn_amosar_contactos:
			intent = new Intent(Intent.ACTION_VIEW, Uri.parse("content://contacts/people/"));
			startActivity(intent);
			break;

		case R.id.btn_chamar_tel:
			intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:(+34)981445566"));
			startActivity(intent);
			break;

		case R.id.btn_marcar_tel:
			intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:(+34)986112233"));
			startActivity(intent);
			break;

		case R.id.btn_navegador:
			intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.google.es/"));
			startActivity(intent);
			break;
		}
	}

	public void finish() {
		super.finish();
		Toast.makeText(this, "Mataches a actividade principal", Toast.LENGTH_SHORT).show();
	}

}


package com.example.u3_20_intents;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class RecibirDatos extends Activity {
	// String Forma_Pechar_Activity;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_recibir_datos);
		// Forma_Pechar_Activity=" Premendo botonera Retroceso";

		TextView tvResultado = (TextView) findViewById(R.id.tv_resultado);

		Intent intent = getIntent();

		if ("http".equals(intent.getScheme()))

			tvResultado.setText("URL: " + intent.getDataString());
		else
			tvResultado.setText("Ola " + intent.getExtras().getString(U3_20_Intents.NOME));

	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.recibir_datos, menu);
		return true;
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		// Handle action bar item clicks here. The action bar will
		// automatically handle clicks on the Home/Up button, so long
		// as you specify a parent activity in AndroidManifest.xml.
		int id = item.getItemId();
		if (id == R.id.action_settings) {
			return true;
		}
		return super.onOptionsItemSelected(item);
	}

	public void onPecharClick(View view) {
		// Forma_Pechar_Activity=" Premendo botón Pechar";

		EditText et_apelido = (EditText) findViewById(R.id.et_apelido);

		Intent datos_volta = new Intent();
		datos_volta.putExtra("APELIDO", et_apelido.getText().toString());
		setResult(RESULT_OK, datos_volta);
		finish();

	}

	public void finish() {
		super.finish();
		// Toast.makeText(this,
		// "Saiches da actividade secundaria: "+Forma_Pechar_Activity,
		// Toast.LENGTH_SHORT).show();
	}

}


<syntaxhighlight lang="xml" line enclose="div" highlight="" > <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:orientation="vertical"
   android:padding="5dp" >
   <LinearLayout
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:orientation="horizontal" >
       <TextView
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="Dime o teu nome" />
       <EditText
           android:id="@+id/et_nome"
           android:layout_width="match_parent"
           android:layout_height="wrap_content" />
   </LinearLayout>
   <CheckBox
       android:id="@+id/chk_destruir"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:checked="false"
       android:text="Destruír esta activity ao chamar á 2ª" />
   <TextView
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_gravity="center_horizontal"
       android:text="Chamadas explícitas a intents"
       android:textColor="#00F" />
   <Button
       android:id="@+id/btn_enviar"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:onClick="onEnviarClick"
       android:text="Chamar 2ª Activity: Recibir Datos" />
   <Button
       android:id="@+id/btn_calculadora"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:onClick="onCalculadoraClick"
       android:text="Calculadora" />
   <TextView
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_gravity="center_horizontal"
       android:text="Chamadas implícitas a intents"
       android:textColor="#00F" />
   <Button
       android:id="@+id/btn_amosar_contactos"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:onClick="chamarIntent"
       android:text="Amosar contactos" />
   <Button
       android:id="@+id/btn_seleccionar_contacto"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:onClick="chamarIntent"
       android:text="Seleccionar contacto" />
   <Button
       android:id="@+id/btn_chamar_tel"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:onClick="chamarIntent"
       android:text="Chamar por teléfono" />
   <Button
       android:id="@+id/btn_marcar_tel"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:onClick="chamarIntent"
       android:text="Marcar nº de teléfono" />
   <Button
       android:id="@+id/btn_navegador"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:onClick="chamarIntent"
       android:text="Abrir navegador*" />

</LinearLayout> </syntaxhighlight" >


<syntaxhighlight lang="xml" line enclose="div" highlight="" > <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

   xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:orientation="vertical" >
   <TextView
       android:id="@+id/tv_resultado"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_gravity="center_horizontal"
       android:textSize="20sp"
       android:text="resultado" />
   <EditText
       android:id="@+id/et_apelido"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_gravity="center_horizontal"
       android:hint="Introduce o teu apelido" />
   <Button
       android:id="@+id/btn_pechar"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_gravity="center_horizontal"
       android:onClick="onPecharClick"
       android:text="Pechar" />

</LinearLayout> </syntaxhighlight" >




-- Ángel D. Fernández González e Carlos Carrión Álvarez -- (2014).