2

私のアプリの機能は、カメラアプリで写真を撮り、それを外部ストレージに保存してから、カメラを呼び出したアクティビティの 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 になります。なぜそれが起こるのですか?

4

0 に答える 0