Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Практикум по дисциплине Структуры и алгоритмы обработки данных

.pdf
Скачиваний:
0
Добавлен:
12.08.2026
Размер:
711 Кб
Скачать

formatLocation на вход берет Location,

читает из него данные и форматирует из

них строку. Какие данные он берет: getLatitude – широта,

getLongitude

долгота,

getTime – время определения.

 

 

 

checkEnabled определяет включены

или выключены

провайдеры

методом

isProviderEnabled и отображает эту информацию на экране.

 

 

Метод onClickLocationSettings срабатывает по нажатию кнопки Location

settings и

открывает настройки, чтобы пользователь мог включить или выключить провайдер.

Для этого используется Intent с action =ACTION_LOCATION_SOURCE_SETTINGS.

Осталось в манифесте прописать разрешение на определение координат - ACCESS_FINE_LOCATION, которое позволит нам использовать и Network и GPS. Также существует разрешение ACCESS_COARSE_LOCATION, но оно дает доступ только к Network-провайдеру.

11

Лабораторная работа № 4

Получение информации с сервера, отображение в виде списка

Задача: Получить и отобразить в мобильном приложении информацию в соответствии с вариантами второй лабораторной работы.

ListView – это и есть компонент списка.

Теперь надо создать адаптер. Открываем MainActivity.java и пишем: package ru.startandroid.develop.p0421simplelist;

import android.app.Activity; import android.os.Bundle;

import android.widget.ArrayAdapter; import android.widget.ListView;

public class MainActivity extends Activity {

String[] names = { "Иван", "Марья", "Петр", "Антон", "Даша", "Бо-

рис",

"Костя", "Игорь", "Анна", "Денис", "Андрей" };

/** Called when the activity is first created. */ public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState); setContentView(R.layout.main);

// находим список

ListView lvMain = (ListView) findViewById(R.id.lvMain); // создаем адаптер

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, names);

// присваиваем адаптер списку lvMain.setAdapter(adapter); }}

В качестве данных используем массив имен. В onCreate мы находим список, создаем адаптер и присваиваем адаптер списку. Давайте разберемся, как создали адаптер.

Мы использовали этот конструктор: public ArrayAdapter (Context context, int textViewResourceId, T[] objects) и передали ему следующие параметры:

this – контекст

android.R.layout.simple_list_item_1 – это системный layout-файл, который представля-

ет собой TextView

names – массив данных, которые мы хотим вывести в список

12

Лабораторная работа № 5 Передача информации на сервер

Задача: Передать на сервер информацию в соответствии с вариантами второй лабораторной работы, добавить передачу изображения.

Если в приложении необходимо сделать снимок или снять видео, вовсе необязательно для этого создавать отдельное Activity и работать в нем с объектом Camera. Можно использовать уже существующее в системе приложение.

Для этого ваше приложение должно отправить Intent с action

=MediaStore.ACTION_IMAGE_CAPTURE (фото)

или MediaStore.ACTION_VIDEO_CAPTURE (видео) и ждать ответ. Т.е. надо использо-

вать методы startActivityForResult и onActivityResult.

Также, в этот Intent вы можете поместить желаемый путь к файлу и туда будет сохранен результат работы камеры. Для этого в Intent необходимо добавить Uri с

ключом MediaStore.EXTRA_OUTPUT.

Добавим строки в strings.xml:

<string name="photo">Photo</string> <string name="video">Video</string>

Экран main.xml:

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

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

<Button android:id="@+id/btnPhoto"

android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="onClickPhoto" android:text="@string/photo"> </Button>

<Button android:id="@+id/btnVideo"

android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/btnPhoto" android:onClick="onClickVideo" android:text="@string/video"> </Button>

<ImageView android:id="@+id/ivPhoto" android:layout_width="wrap_content"

android:layout_height="wrap_content" android:layout_below="@+id/btnVideo"> </ImageView>

</RelativeLayout>

На экране только кнопки для получения фото и видео, и ImageView, в котором будем отображать полученное фото.

13

MainActivity.java: import java.io.File;

import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; import android.net.Uri;

import android.os.Bundle; import android.os.Environment;

import android.provider.MediaStore; import android.util.Log;

import android.view.View; import android.widget.ImageView;

public class MainActivity extends Activity {

File directory;

final int TYPE_PHOTO = 1; final int TYPE_VIDEO = 2;

final int REQUEST_CODE_PHOTO = 1; final int REQUEST_CODE_VIDEO = 2;

final String TAG = "myLogs";

ImageView ivPhoto;

@Override

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main);

createDirectory();

ivPhoto = (ImageView) findViewById(R.id.ivPhoto);

}

public void onClickPhoto(View view) {

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, generateFileU-

ri(TYPE_PHOTO));

startActivityForResult(intent, REQUEST_CODE_PHOTO);

}

public void onClickVideo(View view) {

Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, generateFileU-

ri(TYPE_VIDEO));

startActivityForResult(intent, REQUEST_CODE_VIDEO);

}

@Override

protected void onActivityResult(int requestCode, int resultCode, Intent intent) {

if (requestCode == REQUEST_CODE_PHOTO) { if (resultCode == RESULT_OK) {

14

if (intent == null) { Log.d(TAG, "Intent is null");

}else {

Log.d(TAG, "Photo uri: " + intent.getData()); Bundle bndl = intent.getExtras();

if (bndl != null) {

Object obj = intent.getExtras().get("data"); if (obj instanceof Bitmap) {

Bitmap bitmap = (Bitmap) obj;

Log.d(TAG, "bitmap " + bitmap.getWidth() + " x " + bitmap.getHeight());

ivPhoto.setImageBitmap(bitmap);

}

}

}

} else if (resultCode == RESULT_CANCELED) { Log.d(TAG, "Canceled");

}

}

if (requestCode == REQUEST_CODE_VIDEO) { if (resultCode == RESULT_OK) {

if (intent == null) { Log.d(TAG, "Intent is null");

} else {

Log.d(TAG, "Video uri: " + intent.getData());

}

} else if (resultCode == RESULT_CANCELED) { Log.d(TAG, "Canceled");

}

}

}

private Uri generateFileUri(int type) { File file = null;

switch (type) { case TYPE_PHOTO:

file = new File(directory.getPath() + "/" + "photo_" + System.currentTimeMillis() + ".jpg");

break;

case TYPE_VIDEO:

file = new File(directory.getPath() + "/" + "video_" + System.currentTimeMillis() + ".mp4");

break;

}

Log.d(TAG, "fileName = " + file); return Uri.fromFile(file);

}

15

Лабораторная работа № 6 Обмен информацией между двумя смартфонами

Задача: Организовать передачу данных между двумя смартфонами через промежуточное звено – сервер.

Библиотека RoboSpice позволяет выполнять асинхронные запросы к внешнему серверу, например, для получения текстовых данных или изображений. При этом RoboSpice решает многие проблемы, которые могут возникнуть при выполнении подобных запросов. В частности, одна из распространенных — AsyncTask и поворот экрана в процессе ее выполнения. Задача вернет результат для старого Активити, а не для нового. С RoboSpice «мы можем спать спокойно» — все нюансы учтены и возможные проблемы решены.

Сейчас мы не будем разбирать полученный json, а просто разберем пример, в котором получим эти данные с внешнего URL и выведем результат в TextView.

Итак, для начала добавим несколько строковых ресурсов.

Добавим нужные зависимости в gradle для библиотеки RoboSpice:

1 compile 'com.octo.android.robospice:robospice:1.4.14'

Создадим файл сервиса, наследующего SpiceService.

Имеется два метода. В первом создается CacheManager для работы со строковыми данными, а во втором возвращается количество возможных потоков. В нашем случае — 3.

Создадим «базовый» класс Активити, который переопределяет несколько методов жизненного цикла приложения и содержит метод, возвращающий объект SpiceManager. В конструктор менеджера передается созданный ранее SampleSpiceService. Информацию об этом Активити в файл манифеста можно не добавлять (мы его не будем использовать по «прямому» назначению). Теперь создадим наше основное Активити и унаследуем его от BaseSpiceActivity. В методе onCreate() мы создаем объект SimpleTextRequest, передавая в конструктор урл-адрес, с которого будем тянуть json-строку. В общем-то, название SimpleTextRequest говорит само за себя. В методе onStart() мы получаем SpiceManager методом getSpiceManager() и запускаем асинхронную задачу, передавая в качестве параметров объект запроса txtRequest, ключ для кэша «txt», продолжительность жизни кэша DurationInMillis.ONE_MINUTE и слушателя TextRequestListener, которому будет возвращен результат.

Внутренний класс слушателя TextRequestListener достаточно прост. Тут два метода обработки успешного и неуспешного запроса. В случае успеха, строка данных будет добавлена в TextView.

Подписано в печать 20.06.2016г. Формат 60х90 1/16. Объём 1,0 усл.п.л. Тираж 50 экз. Изд. № 45. Заказ 79.

ООО «Брис-М». Москва, ул. Авиамоторная, д. 8а.

16

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]