Практикум по дисциплине Структуры и алгоритмы обработки данных
.pdfformatLocation на вход берет 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
