我有一个应用程序,是从教程中复制的,它使用 MediaStore.ACTION_IMAGE_CAPTURE
来捕获图像。但当我在手机上运行该应用程序时,出现了一些奇怪的问题。
摄像头应用程序在操作过程中会自动翻转屏幕方向几次,即使我没有移动手机。 它在暂时切换到横屏模式,然后返回到教程应用程序。 因此,在控制权返回到教程应用程序后,教程应用程序会重新切换回竖屏模式,并且图像会丢失。 我尝试将相机活动的方向设置为横向,这样图像就不会丢失。
但是应用程序的布局是为竖屏模式设计的。 或者,如果我在拍摄照片时将相机保持在横向方向,则可以在我的应用程序重新获得焦点后旋转手机,而不会丢失图像。
我在网上进行了一些搜索。 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="相机活动" android:configChanges="方向" android:screenOrientation="竖屏"
我进行了不少搜索,但大部分内容缺乏具体示例。 我需要知道代码长什么样,而不仅仅是要使用哪个功能。
我的手机是LG Motion。 有其他人遇到过这个问题吗? 该怎么解决?
orientation
标志是答案中最重要的部分,它拯救了我的一天... - JamesC