で画像をキャプチャするチュートリアルからコピーしたアプリがあり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モーションです。他の誰かがこの問題に遭遇しましたか? どうすれば修正できますか?