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ć?