Aplikacja na Androida traci dane podczas zmiany orientacji

Mam aplikację, którą skopiowałem z samouczka, który przechwytuje obrazMediaStore.ACTION_IMAGE_CAPTURE. Mam dziwne rzeczy, kiedy uruchamiam aplikację na moim telefonie.

Sama aplikacja aparatu kilkakrotnie zmienia orientację podczas pracy, mimo że nie ruszam telefonem. Krótko przechodzi w tryb krajobrazu przed powrotem do aplikacji samouczka. W rezultacie aplikacja do samouczka powraca do trybu portretu po przywróceniu kontroli i utracie obrazu. Próbowałem ustawić orientację aktywności kamery na krajobraz, a obraz nie został utracony.

Jednak układ aplikacji jest przeznaczony do trybu portretowego. Lub jeśli trzymam aparat w orientacji poziomej podczas robienia zdjęcia, mogę włączyć telefon po tym, jak moja aplikacja powróci do ostrości i nie zgubię obrazu.

Zrobiłem kilka szturchań w sieci. Ktoś na Stackoverflow wspomniał, że zmiana orientacji spowodowała dodatkowe wywołaniaonCreate. „Powód tegoonCreate() jest wywoływana, ponieważ gdy wywołujesz aktywność kamery podczas orientacji pionowej, zmieni ona orientację i zniszczy poprzednią aktywność. "Uruchomiłem aplikację w trybie debugowania z punktami przerwania ustawionymi w Cateate ionActivityResult metody. To rzeczywiście prawdaonCreate dzwoni, gdy robię zdjęcie w trybie portretowym. Kolejność wywołań to onCreate, onActivityResult, onCreate. Jeśli zrobię zdjęcie w trybie poziomym (gdzie moja aplikacja aparatu kończy się w ten sposób), onCreate nie zostanie wywołany. Teraz, gdy mam jakiś pomysł, co się dzieje, jak mogę zapobiec temu, aby był problemem? Oto jak wygląda teraz aplikacja:

package com.example.testapp;

import java.io.IOException;
import java.io.InputStream;

import android.app.Activity;
import android.app.WallpaperManager;
import android.content.Intent;
import android.content.res.Configuration;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.ImageView;

public class CameraActivity extends Activity implements View.OnClickListener {

    ImageButton ib;
    Button b;
    ImageView iv;
    Intent i;
    final static int cameraData = 0;
    Bitmap bmp;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.photo_activity);
        initialize();
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        // TODO Auto-generated method stub
        super.onConfigurationChanged(newConfig);
        setContentView(R.layout.photo_activity);
        initialize();
    }

    private void initialize() {
        iv = (ImageView)findViewById(R.id.imageViewReturnedPicture);
        ib = (ImageButton)findViewById(R.id.imageButtonTakePicture);
        b = (Button)findViewById(R.id.buttonSetWallpaper);
        b.setOnClickListener(this);
        ib.setOnClickListener(this);
    }

    @Override
    public void onClick(View arg0) {
        switch (arg0.getId()) {

        case R.id.buttonSetWallpaper:
            try {
                WallpaperManager wm = WallpaperManager.getInstance(getApplicationContext());
                wm.setBitmap(bmp);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            break;

        case R.id.imageButtonTakePicture:
            i = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
            startActivityForResult(i, cameraData);
            break;
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        // TODO Auto-generated method stub
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == RESULT_OK) {
            Bundle extras = data.getExtras();
            bmp = (Bitmap)extras.get("data");
            iv.setImageBitmap(bmp);
        }
    }
}

A oto co mam w manifeście dla tego działania:

                android:name="com.example.testapp.CameraActivity"
                android:label="Camera Activity"
                android:configChanges="orientation"
                android:screenOrientation="portrait" 

Zrobiłem znaczne poszukiwania, ale wiele z tego, co znalazłem, nie ma konkretnych przykładów. Muszę wiedzieć, jak wygląda kod, a nie tylko, której funkcji użyć.

Mój telefon jest urządzeniem LG Motion. Czy ktoś inny napotkał ten problem? Jak to naprawić?

questionAnswers(7)

yourAnswerToTheQuestion