Android, фотокамера и onSaveInstanceState

Android, фотокамера, альбом
и onSaveInstanceState

Когда разработчики андроида делали свое творение, они хотели все-таки как-то подшутить над программистами. И получилось довольно остроумно - они решили при повороте экрана не сохранять данные Activity.

Шутка удалась. Теперь надо бдительно следить, чтобы пользователь не поворачивал экран чтобы при повороте экрана данные не пропадали.

Как я это заметил.

В приложении, которое я имею честь разрабатывать среди всего прочего есть надобность сделать фото и потом это фото сохранить в отдельной фотогалерее приложения. Теоретически, тут все просто. С заковыкой. При вызове Intent фотокамеры, мы должны передать в нее URI файла, который будет записан в результате из того, что камера андроида увидит. Никакого альбома эта операция не создает.

Вот несколько измененный пример из андроидного мануала:

Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
File f = setUpPhotoFile();
mCurrentPhotoPath = f.getAbsolutePath();
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(f));
startActivityForResult(takePictureIntent, INTENT_CODE_PHOTO);

 

 

Соответственно, альбом мы должны создать после окончания работы приложения камеры где-то в методе onActivityResult.

 

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
   if (resultCode == RESULT_OK && requestCode == INTENT_CODE_PHOTO) {
        Intent mediaScanIntent = new Intent("android.intent.action.MEDIA_SCANNER_SCAN_FILE");
        File f = new File(mCurrentPhotoPath);
        Uri contentUri = Uri.fromFile(f);
        mediaScanIntent.setData(contentUri);
        this.sendBroadcast(mediaScanIntent);
   }
}

 

Тут нам понадобилась свойство Activity mCurrentPhotoPath чтобы хранить ссылку на файл между тем, как мы создали намерение сделать фото и тем, что сохранили полученное фото в альбоме.

Вот тут и скрывается шутка гугловцев. Если пользователь в процессе фотографирования будет вертеть экраном, содержимое этой переменной гарантированно теряется, файл создается внутри файловой системы андроида, а в галерею не добавляется, ибо мы в момент добавления ничего не знаем о ссылке на файл. Попробуйте потом найти этот потерянный для пользователя фотоснимок стандартными приложениями андроида!

Решение отдано на откуп и внимательность программистов. Оно примерно такое:

 

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        mCurrentPhotoPath = savedInstanceState.getString("mCurrentPhotoPath");
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        outState.putString("mCurrentPhotoPath", mCurrentPhotoPath);
        super.onSaveInstanceState(outState);
    }

 

Вот эти два метода создают бандл с данными для промежуточного хранения и вытаскивают данные оттуда соответственно. В теории, любая активность, хранящая данные в своих полях должна реализовывать эти два метода для сохранения и восстановления своего состояния.

Такие дела!

Комментарии (0)

mem: 1099 total: 26 module: 16 xsl: 6