我有一個應用程序,我從一個教程中複製而來,該教程使用MediaStore.ACTION_IMAGE_CAPTURE
捕獲圖像。當我在手機上運行應用程序時,出現了一些奇怪的現象。Android應用程序在方向更改期間丟失數據
即使我沒有移動手機,相機應用本身也在操作過程中多次翻轉其方向。在返回教程應用程序之前,它會暫時進入橫向模式。因此,教程應用程序在控件返回後將翻轉回肖像模式,並且圖像丟失。我嘗試將相機活動的方向設置爲橫向,並且圖像不會丟失。
但該應用程序的佈局旨在用於肖像模式。或者,如果我在捕捉照片時以橫向方向握住相機,則在應用程序返回焦點後可以打開手機,而不會丟失圖像。
我在網上做了一些動作。有人在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。有其他人遇到這個問題嗎?它如何被修復?
onSaveInstanceState無法保存位圖 – Budius 2013-02-23 17:36:16
@Budius是的它可以 - http://it-ride.blogspot.com/2010/08/save-image-in-instance-state-android.html – 2013-02-27 02:43:31
雖然你的鏈接doesn沒有工作,在我發表評論後,我發現我錯了,我爲此道歉,我會很樂意讓你失望,但除非你編輯你的答案,否則我不會。但我堅持認爲,儘管Bitmaps是可以parcelable的,但在SavedInstanceState期間不宜使用它,因爲它需要時間和內存來完成此類事務,並且可能會使輪換非常滯後。 – Budius 2013-02-27 09:54:05