1

IMAGE_CAPTURE インテントを使用して写真を撮り、この写真をすぐに画面に表示しようとしています。私がやること:

File photoFile = createImageFile();
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile));
startActivityForResult(intent, REQUEST_CAMERA);

画像ファイルの作成方法:

private File createImageFile() {
    File dir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
    File photoFile = null;
    try {
        photoFile = File.createTempFile("photo", ".jpg", dir);
        mPhotoPath = photoFile.getAbsolutePath();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return photoFile;
}

onActivityResultが呼び出されたら、次を実行します。

Bitmap photo = BitmapFactory.decodeFile(mPhotoPath);
mPhoto.setImageBitmap(photo);

ここに問題があります。どうやら IMAGE_CAPTURE アクティビティは画像をバックグラウンドでファイルに保存し、画像が保存されるonActivityResultに実行されます。このため、私の。呼び出しの前にブレークポイントを置いても機能しますが。私は醜いハックでそれを修正しました:photo == nullBitmapFactory.decodeFile

while (photo == null) {
    photo = BitmapFactory.decodeFile(mPhotoPath);
}

それで、私は何か間違ったことをしていますか?なぜこのように機能するのですか?

マシュマロ ネクサス 5 でテストしています。

4

1 に答える 1

1

どうやら IMAGE_CAPTURE アクティビティは画像をバックグラウンドでファイルに保存し、画像が保存される前に onActivityResult が実行されます

あなたのリクエストを処理している特定のカメラアプリのバグだと思います. そのようなカメラアプリは数千とは言わないまでも数百あり、このようなバグはやや一般的です.

私は醜いハックでそれを修正しました

このようなビジー ループは決して良い考えではありません。とりわけ、メイン アプリケーション スレッドで実行すると UI がフリーズし、バックグラウンド スレッドで実行されたとしても、CPU を著しく消費します。

よりイベント駆動型になるように、ファイルが閉じられたときに監視しようとします。FileObserver何らかの理由で、それを機能させることができない場合:

  • ファイル監視ロジックをバックグラウンド スレッドで実行していることを確認してください
  • 試行間に妥当な期間を追加SystemClock.sleep()します (例: 50ms)
于 2015-10-17T14:30:51.420 に答える