私のアプリの機能は、カメラアプリで写真を撮り、それを外部ストレージに保存してから、カメラを呼び出したアクティビティの ImageView に配置することです。コードは次のようになります。
public class ProjectActivity extends Activity {
private static final String JPEG_FILE_SUFFIX = ".jpeg";
private Bitmap _ImageBitmap;
private ImageView _ImageView;
private int _index;
private String _CurrentPhotoPath;
onCreate メソッドは ImageView を見つけて、ビットマップ メンバーが開始されている場合にそれを設定します (後で追加する機能のために)。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_project);
if(_ImageBitmap != null)
_ImageView.setImageBitmap(_ImageBitmap);
}
ビットマップが初期化されている場合、onResume メソッドはイメージを ImageView にロードする必要があります。
@Override
protected void onResume() {
if(_ImageBitmap != null)
_ImageView.setImageBitmap(_ImageBitmap);
super.onResume();
}
写真を撮る方法は、アクティビティを再開するまではすべて正常に機能します。
public void takePicture(View view){
this.dispatchTakePictureIntent(0);
}
/**
* invokes an intent to take a picture
* @param actionCode
*/
private void dispatchTakePictureIntent(int actionCode) {
String action = MediaStore.ACTION_IMAGE_CAPTURE;
if(Data.isIntentAvailable(this, action)){
if(this.isExternalStorageWritable()){
File f = createImageFile();
if(f != null){
Intent takePictureIntent = new Intent(action);
//takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(f));
startActivityForResult(takePictureIntent, actionCode);
}
}
}
}
/**
* Checks if external storage is available for read and write
*/
public boolean isExternalStorageWritable() {
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state)) {
return true;
}
return false;
}
private File createImageFile() {
// Create an image file name
String imageFileName = this._projName + getIndex();
File image;
File dir = getAlbumDir(this, this.getAlbumName());
try {
image = File.createTempFile(
imageFileName,
JPEG_FILE_SUFFIX,
dir
);
_CurrentPhotoPath = image.getAbsolutePath();
return image;
} catch (IOException e) {
Toast.makeText(getApplicationContext(), e.toString(), Toast.LENGTH_LONG).show();
return null;
}
}
private File getAlbumDir(Context context, String albumName) {
File file = new File(context.getExternalFilesDir(
Environment.DIRECTORY_PICTURES), albumName);
file.mkdirs();
if (!file.isDirectory()) {
return null;
}
return file;
}
private String getAlbumName() {
return this._projName;
}
private String getIndex() {
this._index++;
return String.valueOf(this._index);
}
画像キャプチャ アクションから戻ると、onActivityResult は resultCode -1 とカメラ アプリからのデータを返します。
protected void onActivityResult (int requestCode, int resultCode, Intent data){
switch(requestCode){
case 0:
if(resultCode != Activity.RESULT_CANCELED){
handleSmallCameraPhoto(data);
}
break;
default: break;
}
}
このメソッドでは、インテントからビットマップを抽出し、ImageView にロードします。
/**
* adds the picture unto an ImageView
* @param intent
*/
private void handleSmallCameraPhoto(Intent intent) {
Bundle extras = intent.getExtras();
_ImageBitmap = (Bitmap) extras.get("data");
_ImageView.setImageBitmap(_ImageBitmap);
}
}
これはレイアウト xml です。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".ProjectActivity" >
<ImageView
android:id="@+id/project_image_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@string/project_image_view" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<Button
android:id="@+id/add_picture_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/add_picture_button_text"
android:onClick="takePicture" />
<Button
android:id="@+id/make_movie_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/make_movie_button_text" />
<Button
android:id="@+id/edit_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/edit_button_text" />
</LinearLayout>
カメラと外部ストレージの権限があります。
これをテストすると、写真を撮ってこのアクティビティに戻った後、写真を問題なく見ることができますが、onResume が呼び出されると (カメラ アプリのモニターの回転により)、画像が消えてボタンだけが表示されます。
助けていただければ幸いです、イダン
更新: 何らかの理由で、onResume が 2 回目に呼び出されたときに _ImageBitmap が null になります。なぜそれが起こるのですか?