我有一个应用程序,我从一个教程中复制而来,该教程使用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