Take a photo

De teamă că praful se va aşeza confortabil pe tutorialele şi ştirile publicate până acum, deşi timpul meu în ultimele săptămâni este din ce în ce mai limitat, deşi toată lumea vrea ca totul să fie gata azi 😦 , nu mâine 🙂  ( era şi o afirmaţie faină: ” livrezi proiectul ieri, scrii cod azi şi îl gândeşti mâine “)… mi-am rezervat o părticică din al meu program încărcat şi am mai realizat un tutorial.

Aşadar să înceapă distracţia!!! 😛

Care să fie tema?

Şi cum nu mă puteam decide ce temă să tratez mi-am amintit că acum câteva săptămâni am făcut o vizită unor studenţi din anul 2, Informatică cărora le-am împărtăşit câteva dintre cunoştinţele mele referitoare bineînţeles la Android. Pentru a materializa partea teoretică le-am prezentat o aplicaţie prin intermediul căreia se realizează poze, care mai apoi pot fi trimise prin email. Şi cum interesul lor pentru această temă a fost neaşteptat(în sensul bun, adică le-a plăcut 😀 ) am ales să detaliez şi aici modul de realizare al aplicaţiei.

De ce avem nevoie?

Pentru a implementa această aplicaţie am creat un singur screen şi o activitate asignată acestuia.

Cum arată interfaţa grafică?

Interfeţa grafică are în componenţă mai  multe elemente (mare surpriză, nu-i aşa?!) şi în viziunea mea arată cam aşa:

Codul xml este afişat mai jos:

main.xml

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:fillViewport="true"
android:background="@drawable/white">
<LinearLayout
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@drawable/white"
    android:paddingTop="10dip"
    android:paddingLeft="10dip"
    android:paddingRight="10dip">
	<RelativeLayout android:layout_width="fill_parent"
    android:layout_height="wrap_content">
		<Button android:id="@+id/btnChoose"
		android:layout_width="100dip"
		android:layout_height="50dip"
		android:onClick="btnChoose_onClick"
		android:layout_marginRight="80dip"
		android:text="Take picture">
		</Button>
		<ImageView android:layout_height="100dip"
		android:layout_width="100dip"
		android:id="@+id/myImage"
		android:layout_alignParentRight="true"
		android:background="@drawable/gray">
		</ImageView>
	</RelativeLayout>
	<LinearLayout android:layout_width="fill_parent"
	android:layout_height="wrap_content"
	android:orientation="vertical"
	android:layout_marginTop="15dip">
	<TextView android:layout_width="wrap_content"
	android:layout_height="wrap_content"
	android:text="Send email"
	android:textColor="@drawable/black"
	android:textStyle="bold">
	</TextView>
	<LinearLayout android:layout_width="fill_parent"
	android:layout_height="wrap_content"
	android:layout_marginTop="10dip">
	<TextView android:layout_width="70dip"
	android:layout_height="wrap_content"
	android:textColor="@drawable/black"
	android:text="To: ">
	</TextView>
	<EditText android:id="@+id/eTxtTo"
	android:layout_width="fill_parent"
	android:layout_height="wrap_content"
	android:inputType="textEmailAddress">
	</EditText>
	</LinearLayout>
	<LinearLayout android:layout_width="fill_parent"
	android:layout_height="wrap_content"
	android:layout_marginTop="10dip">
	<TextView android:layout_width="70dip"
	android:layout_height="wrap_content"
	android:textColor="@drawable/black"
	android:text="Subject: ">
	</TextView>
	<EditText android:id="@+id/eTxtSubject"
	android:layout_width="fill_parent"
	android:layout_height="wrap_content"
	android:inputType="textEmailSubject">
	</EditText>
	</LinearLayout>
    <LinearLayout android:layout_width="fill_parent"
	android:layout_height="wrap_content"
	android:layout_marginTop="10dip">
	<TextView android:layout_width="70dip"
	android:layout_height="wrap_content"
	android:textColor="@drawable/black"
	android:text="Email text: ">
	</TextView>
	<EditText android:id="@+id/eTxtMail"
	android:layout_width="fill_parent"
	android:layout_height="wrap_content">
	</EditText>
	</LinearLayout>
	<LinearLayout android:layout_width="fill_parent"
	android:layout_height="wrap_content"
	android:layout_marginTop="10dip"
	android:gravity="center_horizontal">
	<Button android:id="@+id/btnSend"
	android:layout_width="100dip"
	android:layout_height="50dip"
	android:text="Send"
	android:onClick="btnSend_onClick">
	</Button>
	</LinearLayout>
	</LinearLayout>
</LinearLayout>
</ScrollView>

Toate bune şi frumoase!Acum urmează partea cea mai jmecheră.
(jmecher=termen tehnic :D)
Cin’ să fie?! Cin’ să fie?! Codul Java, evident!

package org.happys.app;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.OutputStream;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.provider.MediaStore.Images;
import android.provider.MediaStore.Images.Media;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageView;

public class Happy extends Activity
{
	DateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
	java.util.Date date = new java.util.Date();
	String  fileName = "photo"+dateFormat.format(date)+".jpg";
	ImageView myImage;
    File file;
    Bitmap x;
    EditText eTxtTo, eTxtSubject, eTxtMail;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        myImage=(ImageView)findViewById(R.id.myImage);
        eTxtMail=(EditText)findViewById(R.id.eTxtMail);
        eTxtSubject=(EditText)findViewById(R.id.eTxtSubject);
        eTxtTo=(EditText)findViewById(R.id.eTxtTo);
    }

     @Override
	 protected void onActivityResult(int requestCode, int resultCode, Intent data)
	 {
    	 if (requestCode== 0 && resultCode == Activity.RESULT_OK)
         {
	    	file = getTempFile(fileName);
	    	if(file!=null)
		    {
			 BitmapFactory.Options options = new BitmapFactory.Options();
		         options.inSampleSize = 4;
		         x = BitmapFactory.decodeFile( file.getAbsolutePath(), options );
		         myImage.setImageBitmap(x);
	         }
         }
	 }

    public void btnChoose_onClick(View v)
    {
    	Intent intent =  new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
		String savePath = Environment.getExternalStorageDirectory() + "/images";
        File directory = new File(savePath);
        if(!directory.exists())
        {
        	directory.mkdir();
        }
        intent.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(getTempFile(fileName)));
		startActivityForResult(intent, 0);
    }

	public void btnSend_onClick(View c)
    {
    	String  subject = null, mail = null;
    	String to=null;
    	to=eTxtTo.getText().toString();
    	subject=eTxtSubject.getText().toString();
    	mail=eTxtMail.getText().toString();
    	file=getTempFile(fileName);
    	Uri jpegUri = Uri.fromFile(file);
    	Intent sendIntent = new Intent(Intent.ACTION_SEND);
    	sendIntent.putExtra(android.content.Intent.EXTRA_EMAIL,new String[]{to});
    	sendIntent.putExtra(Intent.EXTRA_SUBJECT, subject);
    	sendIntent.putExtra(android.content.Intent.EXTRA_TEXT, mail);
    	sendIntent.setType("image/jpeg");
    	sendIntent.putExtra(Intent.EXTRA_STREAM,jpegUri);
    	startActivity(Intent.createChooser(sendIntent, "Send your picture using:"));
    }

    private File getTempFile(String filename)
	{
	     return new File(Environment.getExternalStorageDirectory(),  filename);
	}
}

Care e ideea?

Ideea de funcţionare este foarte simplă.

Pentru a face o poză se selectează Take picture şi astfel este lansată o nouă activitate predefinită menită să realizeze acest lucru prin intermediul unui intent.Imaginile preluate vor fi salvate pe sd card şi vor avea denumiri diferite pentru a nu se realiza suprascriere. Poza realizată va fi afişată în cadrul unui ImageView.

După ce s-a efectuat operaţiunea de preluare a pozei se stabileşte adresa (sau adresele) de email către care va fi trimisă poza şi de asemenea se selectează şi clientul utilizat(facebook, gmail, yahoo mail, etc.).

De ce ar mai fi nevoie?

Pentru a lansa în execuţie mini-aplicaţia “minune”, mai avem nevoie de câteva permisiuni care vor fi specificate în manifest:

        <uses-permission android:name="android.permission.INTERNET" />
	<uses-permission android:name="android.permission.CAMERA" />
	<uses-feature android:name="android.hardware.camera.autofocus" />
	<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

Cam asta fuse pentru azi! Ne www şi comment-uim!  I’ll be back! 😉

Advertisements
Take a photo

2 thoughts on “Take a photo

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s