Главная страница
Навигация по странице:

  • 12.4 Настройка интерфейса и реализация логики активности для воспроизведения аудио и видео

  • Try to play

  • Resume

  • Try to play . Элемент Loop управляет возможностью повтора воспроизведения. Работать будем с файлом MediaActivity.java

  • Pause , Resume , Stop

  • Release

  • 12.5 Настройка интерфейса и реализация логики активности для просмотра изображений

  • /sdcard/TrainingMedia/

  • Вперед

  • Назад

  • 12.6 Настройка интерфейса и реализация логики главной активности приложения Настроим интерфейс главной активности приложения. Эта активность содержит три кнопки (Image Button

  • осн прог. Цель лабораторной работы Установка и настройка среды программирования adt bundle Задачи лабораторной работы


    Скачать 3.46 Mb.
    НазваниеЦель лабораторной работы Установка и настройка среды программирования adt bundle Задачи лабораторной работы
    Анкоросн прог
    Дата05.01.2023
    Размер3.46 Mb.
    Формат файлаpdf
    Имя файлаOsnov_prog_ANDRUS.pdf
    ТипЛабораторная работа
    #873106
    страница6 из 7
    1   2   3   4   5   6   7
    Рис. 12.1. Интерфейс активности для работы с камерой
    Реализуем логику активности, в данном случае необходимо при нажатии на кнопку выполнить снимок. Работаем с java файлом, описывающим соответствующий класс активности, CameraActivity.java.
    Объявим следующие поля класса активности: private Camera camera; //для проведения всех операций с камерой private SurfaceHolder surfaceHolder; //
    длязадания preview private Surf aceView preview; //для отображения окна предпросмотра private View shotBtn; //для выполнения снимка (кнопка)
    Для начала работы с камерой необходимо ее инициализировать, сделать это лучше в методе onResume() класса активности, для инициализации используется следующая конструкция: camera = Camera.open();

    После завершения работы с камерой, необходимо ее освободить для других приложений, сделать это лучше в методе onPause() класса активности, для освобождения камеры используется следующая конструкция:
    Camera.release();
    Для активности, работающей с камерой, имеет смысл сразу задать расположение экрана следующим образом setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); в противном случае, приходится, например, в методе surfaceCreated() проверять расположение экрана и поворачивать окно предварительного просмотра, что не очень удобно, так как поворот экрана занимает некоторое время.
    Выполним настройку окна предварительного просмотра: preview = (SurfaceView) findViewById(R.id.surfaceCamera); surfaceHolder = preview.getHolder(); surfaceHolder.addCallback(new MyCallback()); метод addCallback() используется для отслеживания изменений окна предпросмотра.
    Параметром этого метода служит экземпляр класса реализующего интерфейс
    SurfaceHolder.Callback, в нашем случае для реализации этого интерфейса создан внутренний класс активности MyCallback.
    В этом классе необходимо реализовать методы: public void surfaceCreated(SurfaceHolder holder); public void surfaceChanged(SurfaceHolder holder, int format, int width, int height); public void surfaceDestroyed(SurfaceHolder holder);
    Мы реализуем метод surfaceCreated(), оставшиеся два метода запишем с пустой реализацией.
    В методе surfaceCreated() зададим окно предварительного просмотра: camera.setPreviewDisplay(holder);
    Выполним необходимые настройки окна предпросмотра (см.
    Листинг 12.1
    ).
    Запустим отображение окна предварительного просмотра: camera.startPreview();
    Пришло время обсудить и реализовать выполнение фотосъемки. Для того, чтобы сделать снимок необходимо вызвать метод takePicture(). Вызов этого метода можно выполнить из метода-обработчика события нажатия кнопки, тогда при нажатии на кнопку сразу будет
    получена фотография, а можно "растянуть удовольствие" и воспользоваться предварительной автофокусировкой.
    Сначала инициализируем кнопку и добавим слушателя события нажатия в методе onCreate() активности: shotBtn = findViewById(R.id.bCameraShot); shotBtn.setOnClickListener(new MyViewListener());
    Вданномслучаеслушателемявляетсяэкземплярвнутреннегокласса MyViewListener, которыйреализуетинтерфейс View.OnClickListener. class MyViewListener implements View.OnClickListener{
    @Override public void onClick(View v){ if (v == shotBtn){ camera.autoFocus(new MyAutoFocusCallback());
    }
    }
    }
    В методе onClick() вызываем обработчик автофокуса, слушателем события автофокусировки в данном случае является экземпляр внутреннего класса
    MyAutoFocusCallback, который реализует интерфейс Camera.AutoFocusCallback. class MyAutoFocusCallback implements Camera.AutoFocusCallback{
    @Override public void onAutoFocus(boolean paramBoolean, Camera paramCamera){ if (paramBoolean){
    // если удалось сфокусироваться, делаем снимок paramCamera.takePicture(null, null, null, new MyPictureCallback());
    }
    }
    }
    Метод takePicture() имеетчетырепараметра:
    Camera.ShutterCallback shutter
    - вызывается в момент получения изображения с матрицы;
    Camera.PictureCallback raw - программе передаются для обработки raw данные (если поддерживается аппаратно);
    Camera.PictureCallback postview
    - программе передаются полностью обработанные данные
    (если поддерживается аппаратно);
    Camera.PictureCallback jpg - программе передается изображение в формате jpg. Здесь может быть организована запись изображения на карту памяти.
    В нашем случае последним параметром является экземпляр класса MyPictureCallback(), который реализует интерфейс Camera.PictureCallback. В этом классе реализован единственный метод (см.
    Листинг 12.1
    ):
    public void onPictureTaken(byte[] paramArrayOfByte, Camera paramCamera){...}
    В листинге 12.1
    представлен код активности, реализующей работу с камерой и позволяющей выполнять снимки.
    Чтобы разрешить приложению работать с камерой и сохранять фотографии на карте памяти, в манифест необходимо добавить следующие разрешения:


    12.4 Настройка интерфейса и реализация логики активности для
    воспроизведения аудио и видео
    Настроим интерфейс активности для воспроизведения аудио и видео. Нам понадобится окно предварительного просмотра, добавим в окно активности элемент SurfaceView. Для работы приложения необходимо поле для задания расположения медиа контента для проигрывания, добавим элемент EditText, а также потребуются несколько кнопок, добавим в окно активности следующие кнопки:
    b_Start
    - для запуска воспроизведения контента с начала, зададим свойству On Click этой кнопки значение onClickStart;
    b_Pause
    - для приостановки воспроизведения, зададим свойству On Click этой кнопки значение onClick;
    b_Resume - для продолжения воспроизведения с места приостановки, зададим свойству
    On Click этой кнопки значение onClick;
    b_Stop
    - для полной остановки воспроизведения, зададим свойству On Click этой кнопки значение onClick.
    Для возможности выбора зацикленного воспроизведения медиа контента добавим в окно активности элемент CheckBox.
    Далее предлагаем настроить интерфейс самостоятельно. В нашем случае активность выглядит так, как показано на рис. 12.2
    увеличить изображение
    Рис. 12.2. Интерфейс активности для воспроизведения аудио и видео
    Реализуем логику активности, в данном случае необходимо выполнять следующие действия:
    • при нажатии на кнопку Try to play, запускается воспроизведение с начала контента, расположенного по адресу, указанному в поле ввода, расположенном слева от кнопки;
    • при нажатии на кнопку Pause, воспроизведение контента приостанавливается;
    • при нажатии на кнопку Resume, воспроизведение контента продолжается с места приостановки;
    • при нажатии на кнопку Stop, воспроизведение контента останавливается и может быть возобновлено только с начала, т. е. необходимо снова нажать Try to play.
    Элемент Loop управляет возможностью повтора воспроизведения.
    Работать будем с файлом MediaActivity.java, описывающим соответствующий класс активности.
    Объявим следующие поля класса активности:
    MediaPlayer mediaPlayer; //управляет воспроизведением
    CheckBox chbLoop; //управляет режимом повтора
    В методе onCreate() активности настроим чек-бокс так, чтобы он включал/выключал режим повтора для плеера. chbLoop = (CheckBox) findViewById(R.id.chb_Loop); chbLoop.setOnCheckedChangeListener(new
    OnCheckedChangeListener() {
    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (mediaPlayer != null) mediaPlayer.setLooping(isChecked);
    }
    });
    Метод onClickStart() используется для обработки нажатий на кнопку Try to play. В этом метода сначала освобождаем ресурсы текущего проигрывателя, используя вызов метода: releaseMP();
    Этот метод рекомендуется вызывать по окончанию использования плеера, а также при onPause/onStop, если нет острой необходимости держать объект.
    Реализация метода releaseMP(): private void releaseMP() { if (mediaPlayer != null) { try { mediaPlayer.release(); mediaPlayer = null;
    } catch (Exception e) { e.printStackTrace();
    }
    }
    }
    Продолжим рассмотрение метода onClickStart(). В нем после освобождения ресурсов, занимаемся подготовкой плеера к воспроизведению. mediaPlayer = new MediaPlayer(); mediaPlayer.setDataSource(DATA); mediaPlayer.setDisplay(((SurfaceView) findViewById(R.id.surfaceView1)).getHolder()); mediaPlayer.setOnPreparedListener(this); mediaPlayer.prepareAsync();
    Создаем новый объект класса MediaPlayer.
    Используем метод setDataSource() для задания источника данных, в качестве параметра передаем строку из поля ввода, сохраненную в переменной DATA.
    Используя метод setDisplay(), задаем экран для воспроизведения, в нашем случае элемент
    SurfaceView, добавленный в окно активности на этапе формирования интерфейса.
    Метод prepareAsync() выполняет асинхронную подготовку плеера к воспроизведению и когда подготовка будет завершена сообщает об этом слушателю, указанному в методе setPreparedListener(). В нашем случае слушателем является сам класс активности, для этого он объявлен, как класс реализующий интерфейс OnPreparedListener. В случае готовности плеера вызывается метод onPrepared(MediaPlayer mp), объявленный в указанном интерфейсе и реализованный в классе активности, в этом методе выполняется запуск воспроизведения:
    mp.start();
    Существует еще метод prepare(), он также выполняет подготовку плеера, но в синхронном режиме. Для прослушивания файлов из интернета, необходимо использовать асинхронный режим, что мы и сделали.
    Последние две строки метода onClickStart(): mediaPlayer.setLooping(chbLoop.isChecked()); mediaPlayer.setOnCompletionListener(this);
    В первой из них определяется возможность циклического воспроизведения в зависимости от значения чек-бокса.
    Во второй - задается слушатель для получения сообщения о достижении конца воспроизводимого контента. В нашем случае этим слушателем будет сам класс активности для этого он объявлен, как класс реализующий интерфейс
    OnCompletionListener. Полную версию метода onClickStart() можно найти в листинге 12.2
    Метод onClick() вызывается при нажатии на любую кнопку: Pause, Resume, Stop. В этом методе выполняется проверка какая кнопка была нажата и после этого выполняются соответствующие действия.
    Если нажата кнопка Pause, выполняется следующая конструкция: if (mediaPlayer.isPlaying()) mediaPlayer.pause();
    Если нажата кнопка Release, выполняется следующая конструкция: if (!mediaPlayer.isPlaying()) mediaPlayer.start();
    Если нажата кнопка Stop, выполняется следующая конструкция: mediaPlayer.stop();
    Имеет смысл обратить внимание на метод активности: protected void onDestroy() { super.onDestroy(); releaseMP();
    }
    В этом методе обязательно необходимо освободить ресурсы, что и выполняется вызовом метода releaseMP().
    Полный код класса MediaActivity представлен в листинге 12.2
    12.5
    Настройка интерфейса и реализация логики активности для
    просмотра изображений

    Настроим интерфейс активности для просмотра изображений. Нам потребуется элемент для просмотра изображений, добавим в окно активности элемент ImageView. Добавим информационное поле, т. е. элемент TextView, для отображения информации об общем количестве изображений в папке и номере просматриваемого изображения. Добавим две кнопки, для перемещения от одного изображения к другому вперед и назад.
    Предлагаем настроить интерфейс самостоятельно. В нашем случае активность выглядит так, как показано на рис. 12.3
    . Но это, разумеется, не единственно возможный вариант. увеличить изображение
    Рис. 12.3. Интерфейс активности для просмотра изображений
    Реализуем логику активности, данная активность ориентирована на просмотр снимков, сделанных в этом же приложении и сохраненных в папке: /sdcard/TrainingMedia/. Кнопка
    Назад выводит в окно просмотра предыдущий снимок, по отношению к уже отображенному, зададим свойству On Click этой кнопки значение onPrevious. Кнопка
    Вперед выводит в окно просмотра следующий снимок, по отношению к уже отображенному, зададим свойству On Click этой кнопки значение onNext.
    Работать будем с файлом GalleryActivity.java, описывающим класс соответствующей активности.
    Объявим поля класса активности: int currentImage=0;
    ArrayList images;
    ImageView imageView;
    TextView nameView;
    Настройку основных элементов для вывода изображений на экран выполним в методе onResume() активности, этот метод вызывается каждый раз, перед выводом активности на передний план (см. жизненный цикл активности в "Виды приложений и их структура"
    ).
    images=new ArrayList(); imageView=((ImageView)findViewById(R.id.image)); try{
    File imagesDirectory=new File("/sdcard/TrainingMedia/"); images=searchImage(imagesDirectory); updatePhoto(Uri.parse(images.get(currentImage)));
    }catch(Exception e){ nameView.setText("Ошибка: Папка '/sdcard/TrainingMedia/' не найдена");
    }
    Для получения списка изображений в переменную images используется метод searchImage(), этот метод, используя переданный в него в качестве параметра адрес директории с изображениями, находит файл с расширением .jpg, .png или .jpeg и добавляет его к списку изображений. Метод возвращает список доступных файлов с изображениями. Код метода представлен в листинге 12.3
    Метод updatePhoto() выполняет обновление счетчика фотографий в информационном поле и выводит на экран изображение, соответствующее переданному в метод URI. Код метода представлен в листинге 12.3
    В методе onPause() активности выполняется очистка списка изображений и освобождение памяти. Этот метод вызывается каждый раз, как активность теряет фокус ввода. Код метода представлен в листинге 12.3
    Осталось рассмотреть еще два метода: onPrevious() и onNext().
    Первый метод вызывается, когда нажата кнопка Назад. В нем уменьшается номер текущего изображения и вызывается метод updatePhoto().
    Второй метод вызывается, когда нажата кнопка Вперед. В нем увеличивается номер, текущего изображения и вызывается метод updatePhoto().
    Полный код класса GalleryActivity представлен в листинге 12.3
    12.6 Настройка интерфейса и реализация логики главной активности
    приложения
    Настроим интерфейс главной активности приложения. Эта активность содержит три кнопки (Image Button):
    bCamera - для вызова активности, предоставляющей возможности работы с камерой;
    bGallery - для вызова активности, предоставляющей возможности просмотра изображений;
    bMusic - для вызова активности, предоставляющей возможности воспроизведения аудио и видео.
    Предлагаем настроить интерфейс самостоятельно. В нашем случае активность выглядит так, как показано на рис. 12.4
    . Но это, разумеется, не единственно возможный вариант.
    увеличить изображение
    Рис. 12.4. Интерфейс главной активности приложения
    Реализуем логику главной активности. В данном случае достаточно настроить обработку событий нажатия на кнопки, таким образом, чтобы при нажатии на кнопку запускалась соответствующая активность. Работаем с java файлом, описывающим класс активности.

    Создадим переменную btnClick, как реализацию интерфейса-слушателя
    OnClickListener:
    • OnClickListener btnClick=new OnClickListener() {
    • @Override
    • public void onClick(View v) {
    • Click(v.getId());
    • }
    • };

    Добавим слушателя события нажатия к каждой кнопке активности:
    • ((ImageButton)findViewById(R.id.bMusic)).setOnClickListener(btnClick);
    • ((ImageButton)findViewById(R.id.bCamera)).setOnClickListener(btnClick);
    • ((ImageButton)findViewById(R.id.bGallery)).setOnClickListener(btnClick)
    ;

    В методе onClick() слушателя вызываем метод Click(), в котором выполняется запуск соответствующей активности:
    • protected void Click(int view){
    • Intent intent=null;
    • switch (view){
    • case R.id.bMusic: intent=new Intent(this,mediaPlayer.class); break;
    • case R.id.bGallery: intent=new
    Intent(this,GalleryActivity.class); break;
    • case R.id.bCamera: intent=new
    Intent(this,CameraActivity.class); break;

    • default: break;
    • }
    • if(intent!=null){
    • startActivity(intent);
    • }
    • }
    В листинге 12.4
    представлен код главной активности. package com.example.lab5_4_media; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import android.hardware.Camera; import android.hardware.Camera.Size; import android.os.Bundle; import android.app.Activity; import android.content.pm.ActivityInfo; import android.content.res.Configuration; import android.util.Log; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; import android.view.Window; import android.view.WindowManager; import android.view.ViewGroup.LayoutParams; public class CameraActivity extends Activity { private Camera camera; private SurfaceHolder surfaceHolder; private SurfaceView preview; private View shotBtn;
    @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
    // если хотим, чтобы приложение постоянно имело портретную ориентацию setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
    // если хотим, чтобы приложение было полноэкранным getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
    // и без заголовка requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_camera); preview = (SurfaceView) findViewById(R.id.surfaceCamera); surfaceHolder = preview.getHolder(); surfaceHolder.addCallback(new MyCallback(this)); surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); shotBtn = findViewById(R.id.bCameraShot); shotBtn.setOnClickListener(new MyViewListener());
    }
    @Override protected void onResume() {
    super.onResume(); camera = Camera.open();
    }
    @Override protected void onPause(){ super.onPause(); if (camera != null){ camera.setPreviewCallback(null); camera.stopPreview(); camera.release(); camera = null;
    }
    } class MyCallback implements SurfaceHolder.Callback{
    Activity host;
    MyCallback(Activity act){ host=act;
    }
    @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height){}
    @Override public void surfaceCreated(SurfaceHolder holder){ try { camera.setPreviewDisplay(holder); camera.setPreviewCallback(new MyPreviewCallback());
    } catch (IOException e){
    Log.d("myLogs","Ошибка камеры"); e.printStackTrace();
    }
    Size previewSize = camera.getParameters().getPreviewSize(); float aspect = (float) previewSize.width / previewSize.height; int previewSurfaceWidth = preview.getWidth(); int previewSurfaceHeight = preview.getHeight();
    LayoutParams lp = preview.getLayoutParams();
    // здесь корректируем размер отображаемого preview, чтобы не было искажений if (host.getResources().getConfiguration().orientation !=
    Configuration.ORIENTATION_LANDSCAPE){
    // портретный вид camera.setDisplayOrientation(90); lp.height = previewSurfaceHeight; lp.width = (int) (previewSurfaceHeight / aspect);
    } else {
    // ландшафтный camera.setDisplayOrientation(0); lp.width = previewSurfaceWidth; lp.height = (int) (previewSurfaceWidth / aspect);
    } preview.setLayoutParams(lp); camera.startPreview();
    }

    @Override public void surfaceDestroyed(SurfaceHolder holder){}
    } class MyViewListener implements View.OnClickListener{
    @Override public void onClick(View v) { if (v == shotBtn) {
    // либо делаем снимок непосредственно здесь
    // либо включаем обработчик автофокуса
    //camera.takePicture(null, null, null, this); camera.autoFocus(new MyAutoFocusCallback());
    }
    }
    } class MyAutoFocusCallback implements Camera.AutoFocusCallback{
    @Override public void onAutoFocus(boolean paramBoolean, Camera paramCamera){ if (paramBoolean){
    // если удалось сфокусироваться, делаем снимок paramCamera.takePicture(null, null, null, new MyPictureCallback());
    }
    }
    } class MyPictureCallback implements Camera.PictureCallback{
    @Override public void onPictureTaken(byte[] paramArrayOfByte, Camera paramCamera){
    // сохраняем полученные jpg в папке /sdcard/CameraExample/
    // имя файла - System.currentTimeMillis() try {
    File saveDir = new File("/sdcard/CameraExample/"); if (!saveDir.exists()) { saveDir.mkdirs();
    }
    FileOutputStream os = new
    FileOutputStream(String.format("/sdcard/CameraExample/%d.jpg",
    System.currentTimeMillis())); os.write(paramArrayOfByte); os.close();
    } catch (Exception e) {}
    // после того, как снимок сделан, показ превью отключается.
    // Необходимо включить его paramCamera.startPreview();
    }
    } class MyPreviewCallback implements Camera.PreviewCallback{
    @Override public void onPreviewFrame(byte[] paramArrayOfByte, Camera paramCamera) {
    // здесь можно обрабатывать изображение, показываемое в preview
    }
    }
    }

    Листинг 12.1. Класс CameraActivity для работы с камерой package com.example.lab5_4_media; import android.media.MediaPlayer; import android.media.MediaPlayer.OnCompletionListener; import android.media.MediaPlayer.OnPreparedListener; import android.os.Bundle; import android.view.Gravity; import android.view.SurfaceView; import android.view.View; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.EditText; import android.widget.Toast; import android.widget.CompoundButton.OnCheckedChangeListener; import android.app.Activity; public class MediaActivity extends Activity implements OnPreparedListener,
    OnCompletionListener{
    MediaPlayer mediaPlayer;
    CheckBox chbLoop;
    @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_media); chbLoop = (CheckBox) findViewById(R.id.chb_Loop); chbLoop.setOnCheckedChangeListener(new OnCheckedChangeListener() {
    @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (mediaPlayer != null) mediaPlayer.setLooping(isChecked);
    }
    });
    } public void onClickStart(View view) { releaseMP();
    String
    DATA=((EditText)findViewById(R.id.et_MediaPath)).getText().toString(); try { mediaPlayer = new MediaPlayer(); mediaPlayer.setDataSource(DATA); mediaPlayer.setDisplay(((SurfaceView) findViewById(R.id.surfaceView1)).getHolder());
    //mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); mediaPlayer.setOnPreparedListener(this); mediaPlayer.prepareAsync();
    } catch (Exception e) { showMessage("Ошибка воспроизведения");
    } if (mediaPlayer == null) return; mediaPlayer.setLooping(chbLoop.isChecked()); mediaPlayer.setOnCompletionListener(this);
    } private void showMessage(String text){

    Toast toast = Toast.makeText(getApplicationContext(), text,
    Toast.LENGTH_SHORT); toast.setGravity(Gravity.CENTER, 0, 0); toast.show();
    } private void releaseMP() { if (mediaPlayer != null) { try { mediaPlayer.release(); mediaPlayer = null;
    } catch (Exception e) { e.printStackTrace();
    }
    }
    } public void onClick(View view) { if (mediaPlayer == null) return; switch (view.getId()) { case R.id.b_Pause: if (mediaPlayer.isPlaying()) mediaPlayer.pause(); break; case R.id.b_Resume: if (!mediaPlayer.isPlaying()) mediaPlayer.start(); break; case R.id.b_Stop: mediaPlayer.stop(); break;
    }
    }
    @Override public void onPrepared(MediaPlayer mp) { mp.start();
    }
    @Override public void onCompletion(MediaPlayer mp) {}
    @Override protected void onDestroy() { super.onDestroy(); releaseMP();
    }
    }
    Листинг 12.2. Класс MediaActivity package com.example.lab5_4_media; import java.io.File; import java.util.ArrayList; import android.net.Uri; import android.os.Bundle; import android.app.Activity; import android.util.Log; import android.view.View; import android.widget.ImageView; import android.widget.TextView;
    public class GalleryActivity extends Activity { int currentImage=0;
    ArrayList images;
    ImageView imageView;
    TextView nameView;
    @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_gallery);
    }
    @Override public void onResume(){ super.onResume(); currentImage=0;
    Log.d("myLogs","onResume cI="+currentImage); nameView=((TextView)findViewById(R.id.imageName)); images=new ArrayList(); imageView=((ImageView)findViewById(R.id.image)); try{
    File imagesDirectory=new File("/sdcard/TrainingMedia/"); images=searchImage(imagesDirectory); updatePhoto(Uri.parse(images.get(currentImage)));
    }catch(Exception e){ nameView.setText("Ошибка: Папка '/sdcard/TrainingMedia/' не найдена");
    Log.d("myLogs","
    Ошибка");
    }
    }
    @Override protected void onPause()
    { super.onPause(); images.clear();
    Log.d("myLogs","onPause cI="+currentImage);
    } private ArrayList searchImage(File dir){
    ArrayList imagesFinded=new ArrayList(); for(File f:dir.listFiles()){ if(!f.isDirectory()){
    String fileExt=getFileExt(f.getAbsolutePath()); if(fileExt.equals("png") || fileExt.equals("jpg") || fileExt.equals("jpeg")){
    Log.d("myLogs","
    Файлнайден "+f.getAbsolutePath()); imagesFinded.add(f.getAbsolutePath());
    }
    }
    } return imagesFinded;
    } public static String getFileExt(String filename){ return filename.substring(filename.lastIndexOf(".") + 1);
    } public void updatePhoto(Uri uri){ try{
    nameView.setText((currentImage+1)+"/"+images.size()); imageView.setImageURI(uri);
    }catch(Exception e){ nameView.setText("
    Ошибказагрузкифайла");
    }
    } public void onNext(View v){ if(currentImage+10){ currentImage++; updatePhoto(Uri.parse(images.get(currentImage)));
    }
    } public void onPrevious(View v){ if(currentImage>0 && images.size()>0){ currentImage--; updatePhoto(Uri.parse(images.get(currentImage)));
    }
    }
    }
    Листинг 12.3. Класс GalleryActivity package com.example.lab5_4_media; import android.os.Bundle; import android.app.Activity; import android.content.Intent; import android.util.Log; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.ImageButton; public class MainActivity extends Activity {
    @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
    OnClickListener btnClick=new OnClickListener() {
    @Override public void onClick(View v) {
    Log.d("myLogs",v.getId()+"");
    Click(v.getId());
    }
    };
    ((ImageButton)findViewById(R.id.bMusic)).setOnClickListener(btnClick);
    ((ImageButton)findViewById(R.id.bCamera)).setOnClickListener(btnClick);
    ((ImageButton)findViewById(R.id.bGallery)).setOnClickListener(btnClick);
    } protected void Click(int view){
    Intent intent=null;
    Log.d("myLogs",view+""); switch (view){ case R.id.bMusic: intent=new Intent(this,MediaActivity.class); break; case R.id.bGallery: intent=new Intent(this,GalleryActivity.class); break; case R.id.bCamera: intent=new Intent(this,CameraActivity.class); break; default: break;
    }
    if(intent!=null){
    Log.d("myLogs","
    Интент = "+intent.toString()); startActivity(intent);
    }
    }
    }
    Листинг 12.4. Класс MainActivity
    Внимание! Если Вы увидите ошибку на нашем сайте, выделите её и нажмите Ctrl+Enter.
    © Национальный Открытый Университет "ИНТУИТ", 2016 | www.intuit.ru

    Самостоятельная работа 8. Геолокационные возможности
    1   2   3   4   5   6   7


    написать администратору сайта