Sunteți pe pagina 1din 9

Ministerul Educaţiei, Culturii si Cercetarii al Republicii

Moldova Universitatea Tehnică a Moldovei Facultatea


Calculatoare Informatica si Microelectronica
Departamentul ISA

RAPORT Lucrarea de laborator Nr.1


la disciplina: Programarea aplicatiilor mobile
Tema: UI View Model

A efectuat: st. gr. TI

A verificat: asist. univ. Rusu Cristian

Chişinău 2017
1. Scopul și obiectivele lucrărei de laborator.
Obiective: Dezvoltarea unei aplicații pe una din platformele stabilite la Laboratorul Nr.0 , utilizând mediul
de dezvoltare corespunzător acesteia.
Scopul: De prezentat o aplicație ce rulează pe un dispozitiv sau emulator, ce va conține pe interfața sa,
următoarele elemente:
1. 4 butoane (ce vor executa condițiile de mai jos)
2. 1 TextBox (pentru input)
3. 2 Radio butoane (pentru camera față, spate)

Condiții
De utilizat componentele UI pentru a realiza următoarele condiții:
• de creat un push notification pe ecranul dispozitivului care se va trata peste 10s;
• de utilizat browserul intern al dispozitivului, pentru a inițializa o căutare în Google, conform
cuvântului cheie introdus în TextBox;
• de rulat evenimentul de lucru a camerei frontale și/sau spate la selectarea unuia din cele 2 radio
butoane propuse;
• de tratat evenimentul de captare a pozei executate cu una din cele doua camere, și de afișat într-o altă
Activitate;
• un punct la dorința voastră (sau un brainstorming).

2. Îndeplinirea condițielor lucrărei de laborator.


2.1 MainActivity

Îndeplinirea lucrărei de laborator a început prin crearea design-ului activităței principale (fig1).Activitatea
principal reprezintă meniul din care vor fi accesate funcțiele implementate în program, și conține conform
condiției 4 butoane, 1 textbox și 2 radio butoane.
Figura 1. Design-ul activității principale

MainActivity.java conține metodele ce vor fi efectuate cînd unul din butoane este apăsat, iar cu
ajutorul la Switch și RadioGroup se verifică și se focuseaza unul din cele două radio butoane.
public void onRadioButtonClicked(View view) {
boolean checked = ((RadioButton) view).isChecked();
switch (view.getId()) {
case R.id.front_camera:
if (checked) {
cameraId = frontCameraId;
}
break;

case R.id.back_camera:
if (checked) {
cameraId = backCameraId;
}
break;
}
}

La apăsarea butonului Push Notification va apărea o notificarea peste 10 secunde.Notificarea va


conține o mică imagine, un titlu și un text în interiorul său, iar la apăsarea pe notificarea se va deschide
aplicațiea noastră[1].
public void pushNotification(View view) {
Intent resultIntent = new Intent(this, MainActivity.class);
PendingIntent resultPendingIntent =
PendingIntent.getActivity(
this,
0,
resultIntent,
PendingIntent.FLAG_UPDATE_CURRENT
);
………………………..
}

Următorul buton este cel de Web Search, la apăsarea butonului dat se va deschide Google Search și
va căuta pe internet cuvîntul introdus în EditText[2].
public void googleSearch(View view) {
EditText editText = (EditText) findViewById(R.id.edit_text); Intent
intent = new Intent(Intent.ACTION_WEB_SEARCH);
…………………….

}
}

Butonul Camera împreuna cu cele două radio butoane aprind o activitate nouă cu un preview la
cameră[3] si cu posibilitatea de a face fotografii, radio buton ne trebuie pentru a customiza camera noastră, la
alegerea unuia din radio butoane se va schimba și camera noastra (front/back).Radio butoanele se trateaza în
switch-ul arătat mai sus și returneaza variabila cameraId ce conține informațiea despre ce cameră trebuie
deschisă, cea frontală sau cea de la spate.La apăsarea butonului camera se va deschide o activitate nouă[4].
public void takePhoto(View view) {
Intent intent = new Intent(this, CameraActivity.class);
intent.putExtra("CAMERA_ID", cameraId);
startActivity(intent);
}
Butonul Set Wallpaper va schimba backgroundul la aplicațiea noastră, fotografiea de la background
va fi cea care utilizatorul o va efectua cu camera din aplicație, iar dacă nu este o fotografie nouă, se va utiliza
o fotografie anterioară.
public void setWallpaper(View view){
ImageView imageWallpaper = (ImageView) findViewById(R.id.wallpaper);
Bitmap bitmap = null;
try {
……………………………………………….

2.2 CameraActivity

Activity_camera.xml conține design-ul activității noastre, design-ul este format din un SurfaceView
pentru a vedea preview la camera noastră.
<SurfaceView
android:id="@+id/surfaceView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:onClick="captureImage"
/>

CameraActivity.java conține metodele ce sunt necesare pentru lucrul corect al camerei noastre, și
pozitionarea ei corectă. La început se tratează SurfaceView pentru a crea mediul pentru camera noastră.
surfaceView = (SurfaceView) findViewById(R.id.surfaceView);
surfaceHolder = surfaceView.getHolder();
Toast.makeText(this, "Press the screen to take picture ", Toast.LENGTH_LONG).show();
surfaceHolder.addCallback(this);

La crearea SurfaceView se afisează camera noastră ce va folosi cameraID primită din MainActivity.
public void surfaceCreated(SurfaceHolder holder)
{ try {
camera = Camera.open(cameraID);
setCameraDisplayOrientation(CameraActivity.this, cameraID, camera);
} catch (RuntimeException e) {
System.err.println(e);
return;
}

La apăsarea pe SurfaceView se va efectua metoda captureImage în interiorul căruia se tratează


metoda PictureCallback pentru salvarea imaginei noastre.

public void captureImage(View v) throws IOException, InterruptedException


{ deletePhoto();
camera.takePicture(null, null, jpegCallback);
Toast.makeText(this, "Photo taked ", Toast.LENGTH_LONG).show();
}

Metoda onPictureTaken se efectuează cînd poza este efectuată și deschide o activitate nouă ce conține
fotografiea luată de noi.

jpegCallback = new Camera.PictureCallback() {


public void onPictureTaken(byte[] data, Camera camera)
{ FileOutputStream outStream = null;
try {
outStream = new
FileOutputStream(String.format("/sdcard/CameraPhoto1.jpg"));
outStream.write(data);
outStream.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e)
{ e.printStackTrace();
} finally {
}
refreshCamera();
startActivity(photoIntent);
}
};
}

Pentru tratarea corectă a fotografiei și a camerei noastre, trebuie săi adăugăm o metodă ce va schimba
orientarea imaginei în dependență de poziționarea smartphonului în spațiu.
public static void setCameraDisplayOrientation(Activity activity,
int cameraId, android.hardware.Camera
camera) {
android.hardware.Camera.CameraInfo info =
new android.hardware.Camera.CameraInfo();
android.hardware.Camera.getCameraInfo(cameraId, info);
int rotation = activity.getWindowManager().getDefaultDisplay()
.getRotation();
int degrees = 0;
switch (rotation) {
case Surface.ROTATION_0:
degrees = 0;
break;
case Surface.ROTATION_90:
degrees = 90;
break;
case Surface.ROTATION_180:
degrees = 180;
break;
case Surface.ROTATION_270:
degrees = 270;
break;
}

int result;
int rotate;
if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT)
{ result = (info.orientation + degrees) % 360;
result = (360 - result) % 360;

} else { // back-facing
result = (info.orientation - degrees + 360) % 360;
}

camera.setDisplayOrientation(result);
Camera.Parameters params = camera.getParameters();
camera.setParameters(params);
}
Pentru a reînnoi poza noastră din intii ea trebuie ștearsă, metoda deletePhoto se va trăta în metoda
captureImage pentru a fi siguri că fotografiea va fi reînoită și aplicațiea va avea poză mereu.

private void deletePhoto() {


File file = new File("/sdcard/CameraPhoto1.jpg");
file.delete();
CameraActivity.this.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,
Uri.fromFile(new File("//sdcard/CameraPhoto1.jpg")))); }

2.3 PhotoPreview

După ce camera noastră efectuează o fotografie ea se va afișa într-o activitate nouă pentru ca
utilizatorul să poată vizualiza poza obținută. Design-ul activităței date conține un ImageView pentru a afișa
poza și un TextView pentru a deferenția activitățile din aplicație.
<ImageView
android:id="@+id/image_view"
android:layout_width="match_parent"
android:layout_height="match_content"
android:scaleType="fitXY" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:text="Picture Preview"/>

Imaginea noastră este luată din memoriea internă al smartphonului și transformată în bitmap pentru a
putea fi introdusă în aplicațiea noastră.
Bitmap bitmap = null;
try {
bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(),
Uri.parse("file:////sdcard/CameraPhoto1.jpg"));
} catch (IOException e) {
e.printStackTrace();
}
ImageView imagePhoto = (ImageView) findViewById(R.id.image_view);
imagePhoto.setImageBitmap(bitmap);

}
Concluzii

Efectuînd lucrarea de laborator am studiat multe posibilități noi ale sistemului de operare Android și
am folosit cunoștințele obținute pentru a crea aplicațiea cerută în condițiel lucrărei. Pentru a obține aplicațiea
cerută am căutat pe mai multe forumuri si site-uri oficiale ale sistemului de operare Android ceea ce ne va
ajuta în continuare la lucru și la efectuarea lucrărilor de laborator ce urmează. Cel mai greu a fost
implementarea camerei deoarece mult depinde de versiunea sistemului de operare instalată pe smartphone.
Laboratorul dat mi-a oferit posibilitatea de a cunoaște mai bine cum funcționeaza smartphonul nostru și
aplicațiile în el.
Bibliografie

1. Notifications.[ Resursă electronică ] Regim de acces:


https://developer.android.com/guide/topics/ui/notifiers/notifications.html

2. Common Intents.[ Resursă electronică ] Regim de acces:


https://developer.android.com/guide/components/intents-common.html

3. Android Switch camera then button is clicked[ Resursă electronică ] Regim de acces:
http://stackoverflow.com/questions/16765527/android-switch-camera-when-button-clicked

4. Intent [ Resursă electronică ] Regim de acces:


https://developer.android.com/reference/android/content/Intent.html