Visualizzazione post con etichetta Programmazione Android. Mostra tutti i post
Visualizzazione post con etichetta Programmazione Android. Mostra tutti i post

giovedì 16 maggio 2013

Rubrica Android in ArrayList


State realizzando un'app Android che legge i contatti dalla rubrica e vi serve memorizzare tutti i nomi e i numeri di telefono?
Vi mostro come fare per riempire un ArrayList con i nomi e i numeri dei vostri amici!

Creamo la Classe MainActivity.java:

import java.util.ArrayList;

import android.os.Bundle;
import android.provider.ContactsContract;
import android.provider.ContactsContract.Contacts;
import android.app.Activity;
import android.database.Cursor;
import android.view.Menu;
import android.widget.TextView;

public class MainActivity extends Activity {
    private ArrayList <String> dati=new ArrayList<String>();
   

   
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
              
        Cursor cursor = getContentResolver().query(
                ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
       

   
       
       
while (cursor.moveToNext()) {

        String contactId = cursor.getString(cursor
                        .getColumnIndex(Contacts._ID));

        String name = cursor.getString(cursor
                        .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
       

        String hasPhone = cursor
                        .getString(cursor
                                        .getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER));


        if (!Boolean.parseBoolean(hasPhone)) {

                Cursor phones = getContentResolver().query(
                                ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                                null,
                                ContactsContract.CommonDataKinds.Phone.CONTACT_ID
                                                + " = " + contactId, null, null);

                while (phones.moveToNext()) {
                        String number = phones
                                        .getString(phones
                                          .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                        String nome=phones
                                .getString(phones
                                        .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
                        dati.add(nome);
                        dati.add(number);
                      
                }
                phones.close();
        }
}

cursor.close();


    }

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

}

Ora inseriamo nel manifest.xml il seguente permesso:

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

Bene! Ora nell'ArrayList dati avrete tutti i nomi degli amici e i numeri di telefono, in sequenza alternata. Per leggerli in coppia consiglio di utilizzare un ciclo for che ad ogni ripetizione incrementi un indice di un valore pari a 2

es. for(int i=0;i<=dati.size();i+2).

Spero di esservi stato utile!

mercoledì 15 maggio 2013

Creare un BroadCast Receiver per gli sms su Android

Oggi vi spiegherò come creare un Broadcast Receiver su Android che riceva gli sms e scatena un determinato evento.

Iniziamo Subito:

Creamo una classe chiamata RicevitoreSms e scriviamoci dentro questo:

public class RicevitoreSms extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Bundle bundle = intent.getExtras();
Object messages[] = (Object[]) bundle.get(“pdus”);
SmsMessage smsMessage[] = new SmsMessage[messages.length];
smsMessage[0] = SmsMessage.createFromPdu((byte[]) messages[0]);
String corposms=smsMessage[0].getMessageBody()
;String mittente=smsMessage[0].getDisplayOriginatingAddress();
}
}
Come vedete la classe estende la superclasse broadcast receiver e “cattura” l’evento onReceive(), che in questo caso attende che il telefono riceva un sms per essere eseguito. In fondo alla classe, nelle variabili di tipo stringa corposms e mittente, avremo rispettivamente il testo del messaggio appena ricevuto e il mittente.

Se vogliamo che il messaggio non venga visualizzato sul tefefono, basterà inserire in fondo al metodo onReceive() la seguente linea di codice:

this.abortBroadcast();
Abbiamo quasi finito! L’ultimo passo ora è compilare il manifest adeguatamente.

Non è niente di difficile:

<?xml version=”1.0″ encoding=”utf-8″?>
<manifest xmlns:android=”http://schemas.android.com/apk/res/android&#8221;
package=”example.com.Ricevitore”
android:versionCode=”1″
android:versionName=”1.0″ >
<uses-permission android:name=”android.permission.RECEIVE_SMS” />
<uses-permission android:name=”android.permission.READ_SMS” />

<uses-sdk
android:minSdkVersion=”8″
android:targetSdkVersion=”17″ />
<application
android:allowBackup=”true”
android:icon=”@drawable/ic_launcher”
android:label=”@string/app_name”
android:theme=”@style/AppTheme” >
<receiver
android:name=”example.com.RicevitoreSms”
android:enabled=”true” >
<intent-filter android:priority=”10000″ >
<action android:name=”android.provider.Telephony.SMS_RECEIVED” />
</intent-filter>
</receiver>
</application>

</manifest>

Sostanzialmente impostiamo i permessi per ricevere e leggere gli sms e creamo una nuova action con una priorità impostata a 10000 per essere sicuri che il programma venga eseguito “al di sopra ” di tutti gli altri!

Che dire allora, spero di esservi stato d’aiuto! Buon Lavoro!

Creare programma di Registrazione per Android

Avete necessità di integrare nella vostra applicazione android un registratore di suoni?
Seguendo questa breve guida ci riuscirete in pochi minuti.
Vi occorrerrà solo:
  1. Creare una classe MainActivity.java
  2. Creare un layout MainActivity.xml
  3. Modificare il Manifest.

La classe MainActivity.java
import android.app.Activity;
import android.widget.LinearLayout;
import android.os.Bundle;
import android.os.Environment;
import android.view.ViewGroup;
import android.widget.Button;
import android.view.View;
import android.view.View.OnClickListener;
import android.content.Context;
import android.util.Log;
import android.media.MediaRecorder;
import android.media.MediaPlayer;
import java.io.IOException;
public class MainActivity extends Activity
{
private static final String LOG_TAG = “AudioRecordTest”;
private static String mFileName = null;
private RecordButton mRecordButton = null;
private MediaRecorder mRecorder = null;
private PlayButton   mPlayButton = null;
private MediaPlayer   mPlayer = null;
private void onRecord(boolean start) {
if (start) {
startRecording();
} else {
stopRecording();
}
}
private void onPlay(boolean start) {
if (start) {
startPlaying();
} else {
stopPlaying();
}
}
private void startPlaying() {
mPlayer = new MediaPlayer();
try {
mPlayer.setDataSource(mFileName);
mPlayer.prepare();
mPlayer.start();
} catch (IOException e) {
Log.e(LOG_TAG, “prepare() failed”);
}
}
private void stopPlaying() {
mPlayer.release();
mPlayer = null;
}
private void startRecording() {
mRecorder = new MediaRecorder();
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mRecorder.setOutputFile(mFileName);
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
try {
mRecorder.prepare();
} catch (IOException e) {
Log.e(LOG_TAG, “prepare() failed”);
}
mRecorder.start();
}
private void stopRecording() {
mRecorder.stop();
mRecorder.release();
mRecorder = null;
}
class RecordButton extends Button {
boolean mStartRecording = true;
OnClickListener clicker = new OnClickListener() {
public void onClick(View v) {
onRecord(mStartRecording);
if (mStartRecording) {
setText(“Stop recording”);
} else {
setText(“Start recording”);
}
mStartRecording = !mStartRecording;
}
};
public RecordButton(Context ctx) {
super(ctx);
setText(“Start recording”);
setOnClickListener(clicker);
}
}
class PlayButton extends Button {
boolean mStartPlaying = true;
OnClickListener clicker = new OnClickListener() {
public void onClick(View v) {
onPlay(mStartPlaying);
if (mStartPlaying) {
setText(“Stop playing”);
} else {
setText(“Start playing”);
}
mStartPlaying = !mStartPlaying;
}
};
public PlayButton(Context ctx) {
super(ctx);
setText(“Start playing”);
setOnClickListener(clicker);
}
}
public MainActivity() {
mFileName = Environment.getExternalStorageDirectory().getAbsolutePath();
mFileName += “/audiorecordtest.3gp”;
}
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
LinearLayout ll = new LinearLayout(this);
mRecordButton = new RecordButton(this);
ll.addView(mRecordButton,
new LinearLayout.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT,
0));
mPlayButton = new PlayButton(this);
ll.addView(mPlayButton,
new LinearLayout.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT,
0));
setContentView(ll);
}
@Override
public void onPause() {
super.onPause();
if (mRecorder != null) {
mRecorder.release();
mRecorder = null;
}
if (mPlayer != null) {
mPlayer.release();
mPlayer = null;
}
}
}
Il layout MainActivity .xml
<RelativeLayout xmlns:android=”http://schemas.android.com/apk/res/android&#8221;
xmlns:tools=”http://schemas.android.com/tools&#8221;
android:layout_width=”match_parent”
android:layout_height=”match_parent”
tools:context=”.MainActivity” >
</RelativeLayout>
Il Manifest.xml
<?xml version=”1.0″ encoding=”utf-8″?>
<manifest xmlns:android=”http://schemas.android.com/apk/res/android&#8221;
package=”com.example.registratore”
android:versionCode=”1″
android:versionName=”1.0″ >
<uses-sdk
android:minSdkVersion=”8″
android:targetSdkVersion=”17″ />
<uses-permission android:name=”android.permission.RECORD_AUDIO”/>
<uses-permission android:name=”android.permission.WRITE_EXTERNAL_STORAGE”/>
<application
android:allowBackup=”true”
android:icon=”@drawable/ic_launcher”
android:label=”@string/app_name”
android:theme=”@style/AppTheme” >
<activity
android:name=”com.example.registratore.MainActivity”
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>
</manifest>
Avviate l’app e vi compariranno due pulsanti per far partire e stoppare la registrazione audio.
Come avrete notato i permessi richiesti riguardano la scrittura su memoria esterna e la registrazione audio, infatti il file registrato si troverà nella root della vostra memoria esterna!

Creare Boot Up Receiver Android

In questo post illustrerò come creare un BootUpReceiver per Android.
Un BootUpReceiver è un sistema che serve a far avviare un’applicazione Android dopo ogni riavvio del sistema.
Creamo subito una classe chiamata BootUpReceiver.java che estenda la superclasse BroadcastReceiver:
public class BootUpReceiver extends BroadcastReceiver{
public Context context;
public Intent intent;
@Override
public void onReceive(Context context, Intent intent) {
this.context=context;
this.intent=intent;
Intent i = new Intent(context, MainActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);
}
}
Ora alla riga “Intent i = new Intent(context, MainActivity.class);  ” sostituite MainActivity.class con il nome della classe che volete far avviare all’avvio del dipositivo.
Ora Settiamo il manifest.xml
<?xml version=”1.0″ encoding=”utf-8″?>
<manifest xmlns:android=”http://schemas.android.com/apk/res/android&#8221;
package=”com.example.miopacchetto”
android:versionCode=”1″
android:versionName=”1.0″ >
<uses-permission android:name=”android.permission.RECEIVE_BOOT_COMPLETED”/>
<uses-sdk
android:minSdkVersion=”8″
android:targetSdkVersion=”17″ />
<application
android:allowBackup=”true”
android:icon=”@drawable/ic_launcher”
android:label=”@string/app_name”
android:theme=”@style/AppTheme” >
<receiver android:enabled=”true” android:name=”.BootUpReceiver”
android:permission=”android.permission.RECEIVE_BOOT_COMPLETED”>
<intent-filter android:priority=”10000″>
<action android:name=”android.intent.action.BOOT_COMPLETED” />
<category android:name=”android.intent.category.DEFAULT” />
</intent-filter>
</receiver>
</application>
</manifest>
Abbiamo così concesso i permessi per verificare che il telefono si sia appena riavviato e abbiamo creato un receiver che all’evento scatenato dal riavvio del dispositivo lanci la classe BootUpReceiver creata in precedenza, che a sua volta su occuperà di lanciare la vostra activity principale!

Sistema Client-Server tra Android e pc: Creazione delle Socket

Oggi implementeremo un sistema client- server tra android e pc, soffermandoci maggiormente sulla creazione delle socket.
Sul dispositivo android ci sarà la socket client che invierà dei dati, e parallelamente una socket server si occuperà di ricevere i dati inviati dal dispositivo.
Ma prima ripassiamo un attimo il meccanismo client server e la nozione generale di socket.
Ricordiamo brevemente il paradigma Client-Server: un programma chiamato Client richiede dei servizi ad un altro programma chiamato Server. Quest’ultimo è in ascolto di richieste da parte dei client, esegue tali richieste con le risorse che ha a disposizione, e rispedisce, se richiesto i risultati al client. Tali programmi possono risiedere anche su computer diversi: tutto questo è trasparente ad entrambi.
Il meccanismo di astrazione per la comunicazione in rete è rappresentato dal paradigma socket presentato per la prima volta nella Berkeley Software Distribution (BSD) della University of California a Berkeley.
Una socket è come una porta di comunicazione e non è molto diversa da una presa elettrica: tutto ciò che è in grado di comunicare tramite il protocollo standard TCP/IP, può collegarsi ad una socket e comunicare tramite questa porta di comunicazione, allo stesso modo in cui un qualsiasi apparecchio che funziona a corrente può collegarsi ad una presa elettrica e sfruttare la tensione messa a disposizione. Nel caso delle socket, invece dell’elettricità, nella rete viaggiano pacchetti TCP/IP. Tale protocollo e le socket forniscono quindi un’astrazione, che permette di far comunicare dispositivi diversi che utilizzano lo stesso protocollo.
Ovviamente Java mette a disposizione alcune classi per l’utilizzo delle socket, tra cui la classe Socket. Usando questa classe un client può stabilire un canale di comunicazione con un host remoto. Si potrà comunicare attraverso questo canale utilizzando stream particolari, specializzati per le socket.
AL LAVORO!
Il client su Android
La classe Client.java
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
public class Client extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Socket socket = null;
DataOutputStream dataOutputStream = null;
DataInputStream dataInputStream = null;
try {
socket = new Socket(“192.168.0.1(sostituitelo con l’ip del vostro pc che farà da server)”, 10324);
dataOutputStream = new DataOutputStream(socket.getOutputStream());
dataInputStream = new DataInputStream(socket.getInputStream());
dataOutputStream.writeUTF(“Questa e’ una prova”);
} catch (UnknownHostException e) {
} catch (IOException e) {
}
finally{
if (socket != null){
try {
socket.close();
} catch (IOException e) {
}
}
if (dataOutputStream != null){
try {
dataOutputStream.close();
} catch (IOException e) {
}
}
if (dataInputStream != null){
try {
dataInputStream.close();
} catch (IOException e) {
}
}
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
Il file manifest.xml
Aggiungere il seguente permesso nel manifest:
 <uses-permission android:name=”android.permission.INTERNET”/>
Il file Client.xml
Il layout sarà davvero banale, infatti non appena invieremo l’app comparirà una schermata bianca e la socket invierà al server la stringa “questa e’ una prova”;
<RelativeLayout xmlns:android=”http://schemas.android.com/apk/res/android&#8221;
xmlns:tools=”http://schemas.android.com/tools&#8221;
android:layout_width=”match_parent”
android:layout_height=”match_parent”
tools:context=”.Client” >
</RelativeLayout>
Il server su pc:
Il server sarà composto soltanto di una semplice classe con una socket server, impostata sull’indirizzo ip del nostro pc, che leggerà la stringa inviata dalla socket client e la stamperà a video!
La classe Server.java
import java.net.*;
import java.io.*;
import java.util.*;
import java.awt.*;
public class Server{
public static void main(String[]args){
ServerSocket serverSock = null;
Socket cs = null;
System.err.println(“Socket Server”);
try {
serverSock = new ServerSocket(10324);
}
catch (IOException e) {
System.err.println(e.getMessage());
System.exit(1);
}
while (true) {
System.out.println(“Attesa connessione…”);
try {
cs = serverSock.accept();
}
catch (IOException e) {
System.out.println(“Connessione fallita”);
System.exit(2);
}
System.out.println(“Connessione da ” + cs);
try {
BufferedInputStream ib = new
BufferedInputStream(cs.getInputStream());
DataInputStream is = new DataInputStream(ib);
BufferedOutputStream ob = new
BufferedOutputStream(cs.getOutputStream());
PrintStream os = new PrintStream(ob,false);
String line;
line = new String(is.readLine());
//La stringa inizia dopo il secondo carattere
String comando_android_stringa=line.substring(2);
System.out.println(“Il client ha inviato questa stringa:”+comando_android_stringa);
os.close(); is.close(); cs.close();
}
catch (Exception e) {
System.out.println(“Errore: ” +e);
System.exit(3);
}
}
}
}
Bene, come vedete la porta che abbiamo impostato è la 10324 sia sul client che sul server, ricordatevi di inserire nel client l’indirzzo ip del server, e se avete seguito tutto per bene, una volta avviato il server e subito dopo il client su Android, vedrete comparire sul server la scritta “questa è una prova”.
Buon Lavoro!

Sfruttare accellerometro nelle app android

Volete integrare l’uso dell’accellerometro nella vostra app android?
Vi basterà seguire questi 2 semplici passi:
  1. Creare una activity Accellerometro.java
  2. Creare un layout Accellerometro.xml
L’activity Accellerometro.java
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.TextView;
public class Accellerometro extends Activity implements SensorEventListener {
private TextView Asse1;
private TextView Asse2;
private TextView Asse3;
private SensorManager sensorManager;
double ax,ay,az;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Asse1=(TextView) findViewById(R.id.asse1);
Asse2=(TextView) findViewById(R.id.asse2);
Asse3=(TextView) findViewById(R.id.asse3);
sensorManager=(SensorManager) getSystemService(SENSOR_SERVICE);
sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL);
}
public void onAccuracyChanged(Sensor arg0, int arg1) {
}
public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType()==Sensor.TYPE_ACCELEROMETER){
ax=event.values[0];
ay=event.values[1];
az=event.values[2];
String assex=+ax+”";
String assey=+ay+”";
String assez=+az+”";
Asse1.setText(“Asse x=”+assex);
Asse2.setText(“Asse y=”+assey);
Asse3.setText(“Asse z=”+assez);
}
}
}
Il Layout Accellerometro.xml
<RelativeLayout xmlns:android=”http://schemas.android.com/apk/res/android&#8221;
xmlns:tools=”http://schemas.android.com/tools&#8221;
android:layout_width=”match_parent”
android:layout_height=”match_parent”
tools:context=”.Accellerometro” >
<TextView
android:id=”@+id/asse1″
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:layout_alignParentLeft=”true”
android:layout_alignParentTop=”true”
android:layout_marginLeft=”60dp”
android:layout_marginTop=”36dp”
android:text=”TextView” />
<TextView
android:id=”@+id/asse2″
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:layout_alignLeft=”@+id/asse1″
android:layout_below=”@+id/asse1″
android:layout_marginTop=”26dp”
android:text=”TextView” />
<TextView
android:id=”@+id/asse3″
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:layout_alignLeft=”@+id/asse2″
android:layout_below=”@+id/asse2″
android:layout_marginTop=”24dp”
android:text=”TextView” />
</RelativeLayout>
Una volta avviata l’activity vedrete a video i valori dei 3 assi dell’accellerometro!