Android-приложение теряет данные во время изменения ориентации
у меня есть приложение, которое яскопировал из учебника, который захватывает изображение сMediaStore.ACTION_IMAGE_CAPTURE
, Я'когда я запускаю приложение на своем телефоне, происходит какая-то странность.
Само приложение камеры меняет ориентацию пару раз во время работы, хотя я не двигаю телефон. Он кратко переходит в ландшафтный режим, прежде чем вернуться в учебное приложение. Следовательно, учебное приложение переходит обратно в портретный режим после того, как элемент управления возвращается к нему, и изображение теряется. Я пытался установить активность камеры "s ориентация на ландшафт, и изображение не теряется.
Но макет приложения предназначен для портретного режима. Или, если я держу камеру в альбомной ориентации во время захвата фотографии, я могу повернуть телефон после того, как мое приложение вернулось в фокус, и не потерять изображение.
Я немного покопался в Интернете. Кто-то в Stackoverflow упомянул, что изменение ориентации вызвало дополнительные вызовы. "onCreate
Причина того, чтоonCreate()
Это вызвано тем, что когда вы вызываете действие камеры во время портретной ориентации, оно изменит ориентацию и разрушит вашу предыдущую активность. " Я запустил приложение в режиме отладки с точками останова, установленными в onCreate и вonActivityResult
методы. Это правда, чтоonCreate
вызывается, когда я делаю фотографию в портретном режиме. Порядок вызовов: onCreate, onActivityResult, onCreate. Если я сделаю снимок в ландшафтном режиме (где мое приложение камеры в любом случае заканчивается), onCreate не будет вызван. Теперь, когда у меня есть представление о том, что происходит, как мне избежать проблемы? Вот'Как приложение выглядит сейчас:
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);
}
}
}
И здесь'Что я имею в манифесте для этой деятельности: я
android:name="com.example.testapp.CameraActivity" android:label="Camera Activity" android:configChanges="orientation" android:screenOrientation="portrait"
мы проделали значительный поиск, но многое из того, что я нашел, не содержит конкретных примеров. Мне нужно знать, как выглядит код, а не только какую функцию использовать.
Мой телефон LG Motion. Кто-нибудь еще сталкивался с этой проблемой? Как это можно исправить?