Разработка мобильных приложений под Android Чиркунов Кирилл cyril.chirkunov@computer.org vk.com/chirkunov.

Презентация:



Advertisements
Похожие презентации
Мобильная связь в приложениях для смартфона Лекция 5 Авторы: Березовская Ю.В., Латухина Е.А., Юфрякова О.А.
Advertisements

Работа с аудио и видеоинформацией, использование Intel Perceptual Computing SDK Лекция 6 Разработка приложений для смартфонов на ОС Android.
Низкоуровневые операции в ИС. Сокеты в C#. Понятие сокета Если требуется получить доступ к сетевым операциям низкого уровня, в программе следует использовать.
ИНТЕРАКТИВНОСТЬ В HTML5. ИСТОРИЯ HTML5 2 ПРЕИМУЩЕСТВА HTML5 ПЕРЕД FLASH 3 Открытость платформы Чистая веб-технология Более высокие надёжность, производительность.
Наиболее популярные ресурсы Интернета это Всемирная паутина Электронная почта Файловые архивы Общение в Интернете Мобильный Интернет.
©Павловская Т.А. (СПбГУ ИТМО) Курс «С#. Программирование на языке высокого уровня» Павловская Т.А.
Основы ООП и C# Работа с объектами и классами. Классы Класс специальный тип данных для описания объектов. Он определяет данные и поведение типа. Определение.
Основное назначение звука в презентации - подкрепление какого-либо действия звуковым эффектом. Виды действий: 1. Анимация.1. Анимация. Любой эффект в.
Высокоуровневые методы информатики и программирования Лекция 9 Делегаты.
Файл это поименованная область диска. Чтобы записать информацию в файл надо проделать следующие операции 1.Открыть файл 2.Вывести данные в файл 3.Закрыть.
Передача видеоинформации по каналу GSM (CSD). Задача передачи видеоинформации на дальние расстоянии становится особенно актуальной в высокотехнологичном.
Лекция 4. Введение в С++ Наследование, множественное наследование. Конструкторы, деструкторы. Виртуальные функции.
Проф. В.К.Толстых, Технологии разработки Internet- приложений ASP.NET приложения – обработка ошибок страниц и приложения, Global.aspx.
© Корпорация Майкрософт (Microsoft Corporation), Все права защищены. Планирование собрания Lync При работе в Outlook можно планировать собрания Lync.
Сокеты TCP/IP Лекция Понятие сокета Если требуется получить доступ к сетевым операциям низкого уровня (класс URL обеспечивает выполнение только.
Программная инженерия Дмитриев Андрей Владиславович
СОКЕТЫ. СОКЕТ Сокет – программный интерфейс для обеспечения обмена данными между процессами. Впервые socket API появилась в BSD Unix. Описан в POSIX В.
Лекция 9 Функции. Массивы-параметры функции Передача массива в функцию Пример: void array_enter(int a[], int size) { int i; for (i = 0; i < size; i++)
Графика средствами PHP. Далеко не всегда графика на веб-ресурсе используется исключительно для придания ему уникального внешнего вида. Зачастую возникает.
Отправка файла с использованием электронной почты.
Транксрипт:

Разработка мобильных приложений под Android Чиркунов Кирилл vk.com/chirkunov

На прошлой лекции Лекция 7, слайд 1 Новосибирский государственный университет, 2012 Фоновые сервисы Фоновые сервисы Ненавязчивые уведомления Ненавязчивые уведомления Сигнализация Сигнализация Виджеты Виджеты

Сегодня Лекция 7, слайд 2 Новосибирский государственный университет, 2012 Работа со звуковыми и видео- файлами Работа со звуковыми и видео- файлами Управление камерой Управление камерой Отправка/прием SMS/MMS сообщений Отправка/прием SMS/MMS сообщений Получение информации о состоянии телефона (в т.ч. информация о SIM- карте, состояние телефонного соединения и пр.) Получение информации о состоянии телефона (в т.ч. информация о SIM- карте, состояние телефонного соединения и пр.) Search & LiveDesktop Search & LiveDesktop

Лекция 7, слайд 3 Новосибирский государственный университет, 2012 Поддерживаемые форматы мультимедиа файлов Тип Формат / Codec Поддерживаемые типы файлов / Формат контейнеров Audio AAC LC/LTP 3GPP (.3gp) MPEG-4 (.mp4,.m4a) ADTS raw AAC (.aac, декодируется в Android 3.1+, кодируется в Android 4.0+, ADIF не поддерживается) MPEG-TS (.ts,,без перемещения ползунка, Android 3.0+) HE-AACv1 (AAC+) HE-AACv2 (enhanced AAC+) AMR-NB3GPP (.3gp) AMR-WB3GPP (.3gp) FLACFLAC (.flac) only MP3MP3 (.mp3) MIDI Type 0 and 1 (.mid,.xmf,.mxmf) RTTTL/RTX (.rtttl,.rtx) OTA (.ota) iMelody (.imy) Vorbis Ogg (.ogg) Matroska (.mkv, Android 4.0+) PCM/WAVEWAVE (.wav)

Лекция 7, слайд 4 Новосибирский государственный университет, 2012 ГрафикаJPEGJPEG (.jpg) GIFGIF (.gif) PNGPNG (.png) BMPBMP (.bmp) WEBPWebP (.webp) Video H.263 3GPP (.3gp) MPEG-4 (.mp4) H.264 AVC 3GPP (.3gp) MPEG-4 (.mp4) MPEG-TS (.ts, только аудио AAC, без перемещения ползунка, Android 3.0+) MPEG-4 SP3GPP (.3gp) VP8 WebM(.webm) Matroska (.mkv, Android 4.0+) Поддерживаемые форматы мультимедиа файлов

Поддерживаемые сетевые протоколы для воспроизведения аудио/видео Лекция 7, слайд 5 Новосибирский государственный университет, 2012 RTSP (RTP, SDP) HTTP/HTTPS progressive streaming Предварительная спецификация протокола HTTP/HTTPS live streaming : Только медиа файлы MPEG-2 TS Protocol version 3 (Android 4.0 и выше) Protocol version 2 (Android 3.x) Не поддерживался до Android 3.0

Лекция 7, слайд 6 Медиапроигрыватель

Лекция 7, слайд 7 Новосибирский государственный университет, 2012 Медиапроигрыватель

Лекция 7, слайд 8 Новосибирский государственный университет, 2012 Варианты указания источника аудио/видео Идентификатор ресурса (несжатый тип, res/raw) Путь URI к локальному файлу (схема file://) Путь URI к удаленному медиа источнику через URL ( rtsp://) Путь к записи URI внутри локального Источника данных (content://) Методы медиа проигрывателя Требуется вызов prepare после ? create Нет, проигрыватель готов к воспроизведению setDataSource Да, требуется

VideoView vs SurfaceHolder Новосибирский государственный университет, 2012 Лекция 7, слайд 9 Достоинства Простота использования Более тонкую настройку воспроизведения Уже содержит медиапроигрыватель и базовые функции для воспроизведения Полный контроль над воспроизведением Недостатки Ограниченный функционал и возможности конфигурирования Требуется написать довольно много кода для корректной работы (связывание, обработчики создания/удаления поверхности)

Управление воспроизведением Лекция 7, слайд 10 Новосибирский государственный университет, 2012 Функция Описание start/stop/pause Начало/остановка/приостановка проигрывания getCurrentPosition Число, задающее текущую позицию проигрывания seekTo Поместить головку на указанную позицию setLooping/isLooping Задать/узнать режим повторения setScreenOnWhilePlaying Убрать автоматическое отключение подсветки экрана на время воспроизведения setVolume Задать громкость (в диапазоне от 0 до 1) getFrame Получить текущий кадр (во время воспроизведения)

Listeners Лекция 7, слайд 11 Новосибирский государственный университет, 2012 OnBufferingUpdateListener Вызывается при изменения состояния буфера при потоковой передаче медиа OnCompletionListener Вызывается при завершении воспроизведения OnErrorListener Вызывается при возникновении ошибок воспроизведения OnInfoListener Вызывается при возникновении информационных диагностических сообщений OnPreparedListener Вызывается, когда проигрыватель перешел в состояние Prepared OnSeekCompleteListener Вызывается, когда перемещение головки было завершено после вызова SeekTo OnVideoSizeChangedListener Вызывается, когда проигрыватель узнает размер видео либо размер видео меняется

Запись видео/аудио Лекция 7, слайд 12 Новосибирский государственный университет, 2012 private static int RECORD_VIDEO = 1; private static int HIGH_VIDEO_QUALITY = 1; private static int MMS_VIDEO_QUALITY = 0; private void recordVideo(Uri outputpath) { Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE); if (outputpath != null) intent.putExtra(MediaStore.EXTRA_OUTPUT, outputpath); intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, HIGH_VIDEO_QUALITY); startActivityForResult(intent, RECORD_VIDEO); protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == RECORD_VIDEO) { Uri recordedVideo = data.getData(); // TODO Do something with the recorded video }

MediaRecorder Лекция 7, слайд 13 Новосибирский государственный университет, 2012

MediaRecorder Лекция 7, слайд 14 Новосибирский государственный университет, 2012 MediaRecorder mediaRecorder = new MediaRecorder(); // Настройка источников для записи mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); // Установка выходного формата mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT); // Задание кодировщиков для аудио/видео mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT); // Определение выходного файла mediaRecorder.setOutputFile("/sdcard/myoutputfile.mp4"); // Подготовка к записи mediaRecorder.prepare(); mediaRecorder.start(); // Завершение записи mediaRecorder.stop(); mediaRecorder.release();

Управление камерой Лекция 7, слайд 15 Новосибирский государственный университет, 2012 Функция Описание Camera.open() Возвращает экземпляр camera release() Освобождает ресурсы, связанные с камерой [get/set]Parameters() Получить/установить настройки камеры Функция Описание SceneMode Определенный тип обстановки («вечеринка», «пляж», «пейзаж» и др.) (Parameters.SCENE_MODE_*) FlashMode Освещения (включено, выключено, уменьшение эффекта красных глаз) (Parameters.FLASH_MODE_*) WhiteBalance Баланс белого цвета для фотографируемой сцены ColorEffect Сепия, черно-белое изображение и др. FocusMode Автоматическая фокусировка включена/выключена Параметры

Настройки предварительного просмотра камеры Лекция 7, слайд 16 Новосибирский государственный университет, 2012 Функция Описание JpegQuality/ JpegThumbnailQuality Качество картинки Jpeg и миниатюры PictureSize Размер изображения PreviewSize Размер картинки для предварительного просмотра JpegThumbnailSize Размер миниатюры для предварительного просмотра PictureFormat (PreviewFormat) Формат изображения/картинки для предварительного просмотра PreviewFrameRate Частота кадров (количество кадров в секунду) Параметры

Предварительный просмотр Лекция 7, слайд 17 Новосибирский государственный университет, 2012 public class MyActivity extends Activity implements SurfaceHolder.Callback { private Camera public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); SurfaceView surface = (SurfaceView)findViewById(R.id.surface); SurfaceHolder holder = surface.getHolder(); holder.addCallback(this); holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); holder.setFixedSize(400, 300); } public void surfaceCreated(SurfaceHolder holder) { if (mediaRecorder == null) { try { camera = camera.open(); camera.setPreviewDisplay(holder); camera.startPreview(); [... Draw on the Surface...] } catch (IOException e) { Log.d("CAMERA", e.getMessage()); } public void surfaceDestroyed(SurfaceHolder holder) { camera.stopPreview(); camera.release(); }

Создание фотографий Лекция 7, слайд 18 Новосибирский государственный университет, 2012 private void takePicture() { camera.takePicture(shutterCallback, rawCallback, jpegCallback); } ShutterCallback shutterCallback = new ShutterCallback() { public void onShutter() { …какие-то действия …} }; PictureCallback rawCallback = new PictureCallback() { public void onPictureTaken(byte[] data, Camera camera) { …какие-то действия… } }; PictureCallback jpegCallback = new PictureCallback() { public void onPictureTaken(byte[] data, Camera camera) { FileOutputStream outStream = null; try { outStream = new FileOutputStream("/sdcard/mypicture.jpg"); outStream.write(data); outStream.close(); } catch (FileNotFoundException e) { Log.d("CAMERA", e.getMessage()); } catch (IOException e) { Log.d("CAMERA", e.getMessage()); } };

Лекция 7, слайд 19 Новосибирский государственный университет, 2012 Работа со звуком с помощью AudioRecord и AudioTrack - Классы AudioRecord и AudioTrack позволяют соответственно воспроизводить и записывать необработанные данные с аппаратных буферов - При инициализации необходимо указать значение частоты записи/воспроизведения, конфигурацию каналов (моно, стерео) и кодировщик/декодировщик аудио - Настройки воспроизведения должны соответствовать настройкам записи - Для записи в манифесте необходимо указать полномочие RECORD_AUDIO:

Пример записи необработанного звука с помощью AudioRecord Лекция 7, слайд 20 Новосибирский государственный университет, 2012 int frequency = 11025; int channelConfiguration = AudioFormat.CHANNEL_CONFIGURATION_MONO; int audioEncoding = AudioFormat.ENCODING_PCM_16BIT; File file = new File(Environment.getExternalStorageDirectory(), "raw.pcm"); try { file.createNewFile(); } catch (IOException e) {} try { OutputStream os = new FileOutputStream(file); BufferedOutputStream bos = new BufferedOutputStream(os); DataOutputStream dos = new DataOutputStream(bos); int bufferSize = AudioRecord.getMinBufferSize(frequency, channelConfiguration, audioEncoding); short[] buffer = new short[bufferSize]; // Create a new AudioRecord object to record the audio. AudioRecord audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, frequency, channelConfiguration, audioEncoding, bufferSize); audioRecord.startRecording(); while (isRecording) { int bufferReadResult = audioRecord.read(buffer, 0, bufferSize); for (int i = 0; i < bufferReadResult; i++) dos.writeShort(buffer[i]); } audioRecord.stop(); dos.close(); } catch (Throwable t) {}

Воспроизведение аудио Лекция 7, слайд 21 Новосибирский государственный университет, 2012 int frequency = 11025/2; int channelConfiguration = AudioFormat.CHANNEL_CONFIGURATION_MONO; int audioEncoding = AudioFormat.ENCODING_PCM_16BIT; File file = new File(Environment.getExternalStorageDirectory(), "raw.pcm"); // Short array to store audio track (16 bit so 2 bytes per short) int audioLength = (int)(file.length()/2); short[] audio = new short[audioLength]; try { InputStream is = new FileInputStream(file); BufferedInputStream bis = new BufferedInputStream(is); DataInputStream dis = new DataInputStream(bis); int i = 0; while (dis.available() > 0) { audio[audioLength] = dis.readShort(); i++; } // Close the input streams. dis.close(); // Create and play a new AudioTrack object AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, frequency, channelConfiguration, audioEncoding, audioLength, AudioTrack.MODE_STREAM); audioTrack.play(); audioTrack.write(audio, 0, audioLength); } catch (Throwable t) {}

Распознавание речи Лекция 7, слайд 22 Новосибирский государственный университет, 2012 Для того чтобы задействовать модуль распознавания речи необходимо: 1)Задать намерение с действием RecognizerIntent.ACTION_RECOGNIZE_SPEECH 2)Указать дополнительные параметры намерения (константы RecognizerIntent): EXTRA_LANGUAGE_MODEL (обязательный) (LANGUAGE_MODEL_FREE_FORM либо LANGUAGE_MODEL_WEB_SEARCH) EXTRA_PROMPT - строка, которая будет отображаться в окне голосового ввода EXTRA_MAXRESULTS – ограничение количества возвращаемых результатов распознавания EXTRA_LANGUAGE – язык ввода (отличный от доступного по- умолчанию языка) Вызов активности и получение результатов startActivityForResult/onActivityResult Параметр EXTRA_RESULTS содержит строковый массив результатов

Лекция 7, слайд 23 Новосибирский государственный университет, 2012 Cостояние Описание переменной состояния CallState Находится телефон в режиме разговора или нет. Принимает значения CALL_STATE_IDLE (бездействие), CALL_STATE_OFFHOOK (на линии), CALL_STATE_RINGING (дозвон) DataState Режим передачи данных. Принимает значение DATA_CONNECTED (соединение установлено), DATA_CONNECTING (соединение устанавливается), DATA_DISCONNECTED (соединение разорвано), DATA_SUSPENDED (режим ожидения) DataActivity Статус передачи данных ( DATA_ACTIVITY_IN – прием данных, DATA_ACTIVITY_OUT – посылка данных, DATA_ACTIVITY_INOUT – дуплексный режим, DATA_ACTIVITY_NONE ) PhoneType Тип телефонного устройства ( CDMA, GSM, NONE ) DeviceId Идентификатор устройства (IMEI, MEID) TelephonyManager

Лекция 7, слайд 24 Новосибирский государственный университет, 2012 Cостояние Описание переменной состояния NetworkOperator Информация о сотовом операторе ( MCC + MNC ) NetworkType Тип радиосети ( UMTS, CDMA, LTE и др.) SimState Состояние симкарты ( Absent, Network_Locked, Pin_Required, Puk_Required, Ready, Unknown ) SimSerialNumber Идентификатор Sim-карты SimOperatorNameCтрока SPN NetworkRoaming Номер телефона CellLocation Текущая сота PhoneNumber Номер телефона CellLocation Текущая сота Software version Версия программного обеспечения (не SDK!)

TelephonyManager Лекция 7, слайд 25 Новосибирский государственный университет, 2012 String srvcName = Context.TELEPHONY_SERVICE; TelephonyManager telephonyManager = (TelephonyManager)getSystemService(srvcName); Получение экземпляра: PhoneStateListener phoneStateListener = new PhoneStateListener() { public void onCallForwardingIndicatorChanged(boolean cfi) {} public void onCallStateChanged(int state, String incomingNumber) {} public void onCellLocationChanged(CellLocation location) {} public void onDataActivity(int direction) {} public void onDataConnectionStateChanged(int state) {} public void onMessageWaitingIndicatorChanged(boolean mwi) {} public void onServiceStateChanged(ServiceState serviceState) {} public void onSignalStrengthChanged(int asu) {} }; … telephonyManager.listen(phoneStateListener, int flag); flag – битовая комбинация констант PhoneStateListener.LISTEN_* (CALL_*, DATA_*, MESSAGE_*) Listener:

Отправка и прием SMS Лекция 7, слайд 26 Новосибирский государственный университет, 2012 SmsManager smsManager = SmsManager.getDefault(); smsManager.sendTextMessage( , null /* адрес копии*/, null /* ожидающее намерение, которое срабатывает, когда сообщение отправляется либо возникают проблемы отправки */, null /* ожидающее намерение, cрабатывающее при получении отправленного сообщения */ ); public class IncomingSMSReceiver extends BroadcastReceiver { public void onReceive(Context _context, Intent _intent) { if (_intent.getAction().equals(android,provider.Telephony.SMS_RECEIVED)) { SmsManager sms = SmsManager.getDefault(); Bundle bundle = _intent.getExtras(); if (bundle != null) { Object[] pdus = (Object[]) bundle.get("pdus"); SmsMessage[] messages = new SmsMessage[pdus.length]; for (int i = 0; i < pdus.length; i++) messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]); for (SmsMessage message : messages) { String msg = message.getMessageBody(); String to = message.getOriginatingAddress(); } …

Лекция 7, слайд 27 Новосибирский государственный университет, 2012 String sendTo = String text = "Hello World"; SmsManager smsManager = SmsManager.getDefault(); smsManager.sendDataMessage(sendTo, null, 12345, text.getBytes(), null, null); В манифесте необходимо объявить приемник и фильтр намерений. Дальше – как в предыдущем примере. Отправка и прием данных

Лекция 7, слайд 28 Новосибирский государственный университет, 2012 // Задаем путь к файлу мультимедиа. Uri attached_Uri = Uri.parse("content://media/external/images/media/1"); // Создаем намерение и наполняем его данными Intent mmsIntent = new Intent(Intent.ACTION_SEND, attached_Uri); mmsIntent.putExtra("sms_body", "Please see the attached image"); mmsIntent.putExtra("address", « »); mmsIntent.putExtra(Intent.EXTRA_STREAM, attached_Uri); mmsIntent.setType("image/png"); startActivity(mmsIntent); В манифесте необходимо объявить приемник и фильтр намерений. Отправка и прием MMS

Лекция 7, слайд 29 Новосибирский государственный университет, Определяем поисковую конфигурацию в ресурсах res/xml ( config.html#searchable-element ) config.html#searchable-element <searchable xmlns:android=" android:includeInGlobalSearch=true android:searchSuggestAuthority="myauthority android:searchSuggestIntentAction="android.intent.action.VIEW"> 2. Создаем активность для выдачи поисковых результатов. Указываем в манифесте … Поиск в приложениях

Лекция 7, слайд 30 Новосибирский государственный университет, Настраиваем встроенный источник данных getType(Uri uri): SearchManager.SUGGEST_MIME_TYPE Projection Projection.put(SearchManager.SUGGEST_COLUMN_TEXT_1, [search_source_column] + AS + SearchManager.SUGGEST_COLUMN_TEXT_1); Projection.put( _id, KEY_ID+ AS +_id); query [search_source_column] + LIKE % \ + uri.getPathSegments().get(1) + %\ Поиск в приложениях

Лекция 7, слайд 31 Новосибирский государственный университет, 2012 Для того чтобы настроить «живые обои», требуется 1. Добавить ресурсный файл в каталог res/xml <wallpaper xmlns:android=" /> 2. Создать в приложении сервис и объявить его в манифесте public class AppWallpaperService extends WallpaperService public Engine onCreateEngine() { return new AppWallpaperServiceEngine(); } Manifest.xml <meta-data android:name="android.service.wallpaper" Live Wallpapers

Лекция 7, слайд 32 Новосибирский государственный университет, 2012 public class AppWallpaperServiceEngine extends WallpaperService.Engine public void onCreate(SurfaceHolder surfaceHolder) { super.onCreate(surfaceHolder); // TODO Инициализация объекта. public void onOffsetsChanged(float xOffset, float yOffset, float xOffsetStep, float yOffsetStep, int xPixelOffset, int yPixelOffset) { super.onOffsetsChanged(xOffset, yOffset, xOffsetStep, yOffsetStep, xPixelOffset, yPixelOffset); // TODO Обработка смещения рабочего экрана. public void onTouchEvent(MotionEvent event) { super.onTouchEvent(event); // TODO Обработка событий motion и touch. public void onSurfaceCreated(SurfaceHolder holder) { super.onSurfaceCreated(holder); // TODO Поверхность создана – требуется добавить фоновый поток для отрисовки. } } Live Wallpapers

Лекция 7, слайд 33 Новосибирский государственный университет, 2012 public class AppWallpaperServiceEngine extends WallpaperService.Engine public void onCreate(SurfaceHolder surfaceHolder) { super.onCreate(surfaceHolder); // TODO Инициализация объекта. public void onOffsetsChanged(float xOffset, float yOffset, float xOffsetStep, float yOffsetStep, int xPixelOffset, int yPixelOffset) { super.onOffsetsChanged(xOffset, yOffset, xOffsetStep, yOffsetStep, xPixelOffset, yPixelOffset); // TODO Обработка смещения рабочего экрана. public void onTouchEvent(MotionEvent event) { super.onTouchEvent(event); // TODO Обработка событий motion и touch. public void onSurfaceCreated(SurfaceHolder holder) { super.onSurfaceCreated(holder); // TODO Поверхность создана – требуется добавить фоновый поток для отрисовки. } } Live Wallpapers

Лекция 7, слайд 34 Новосибирский государственный университет, 2012 На следующей лекции Работа с сетью Датчики Анимация и пр.

Лекция 7, слайд 36 Новосибирский государственный университет, 2012