私はこれらの2つのシナリオで何が起こっているのか理解したいと思います。私は公式の文書から直接コードを使用していますhttp://developer.android.com/training/camera/photobasics.htmlAndroidで写真を撮る2つの方法の違いは何ですか?
マニフェストファイルには、必要なすべての読み取り/書き込み権限があるとします。
シナリオ1:
static final int REQUEST_IMAGE_CAPTURE = 1;
private void dispatchTakePictureIntent() {
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
Bundle extras = data.getExtras();
Bitmap imageBitmap = (Bitmap) extras.get("data");
mImageView.setImageBitmap(imageBitmap);
}
}
このコードは、私のために働くように見えますが、私はそれが正確にやっているのか分かりません。それは基本的にカメラを起動し、私は写真を撮ることができますし、次にonActivityResultで、私はこの方法でサムがインテントから引っ張ることができます。
シナリオ2:
String mCurrentPhotoPath;
private File createImageFile() throws IOException {
// Create an image file name
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
String imageFileName = "JPEG_" + timeStamp + "_";
File storageDir = Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES);
File image = File.createTempFile(
imageFileName, /* prefix */
".jpg", /* suffix */
storageDir /* directory */
);
// Save a file: path for use with ACTION_VIEW intents
mCurrentPhotoPath = "file:" + image.getAbsolutePath();
return image;
}
static final int REQUEST_TAKE_PHOTO = 1;
private void dispatchTakePictureIntent() {
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// Ensure that there's a camera activity to handle the intent
if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
// Create the File where the photo should go
File photoFile = null;
try {
photoFile = createImageFile();
} catch (IOException ex) {
// Error occurred while creating the File
...
}
// Continue only if the File was successfully created
if (photoFile != null) {
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT,
Uri.fromFile(photoFile));
startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO);
}
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
Bundle extras = data.getExtras(); //data is null here!!!
Bitmap imageBitmap = (Bitmap) extras.get("data");
mImageView.setImageBitmap(imageBitmap);
}
}
このシナリオは、他の一方で、私は完全なファイルを取得できるようになっているが、それは動作しませんし、テント変数ので、私のためにエラーがスローされますnullなので、私は何かへのアクセス権を持っていません。
私の質問:
あなたがAndroidのカメラを使って写真を撮って、それは一般的に2つのファイルを作成しない - サムネイルと完全なファイルを?
シナリオ1では、これらのファイルは内部または外部ストレージに書き込まれていませんが、RAMだけです。サムネイルはインテントに保存されますが、これは完全なファイルが失われた/取得できないことを意味しますか?
シナリオ2では、何らかの理由で
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile));
を使用したため、インテントがnullです。このファイルの場所を知るには?mPhotoPath
が本当に必要なのでしょうか、またはFile photoFile
へのアクセスを維持する必要がありますか。これはonActivityResultメソッドに到達するまでに失われましたか?このファイルを保持するための適切な方法は何ですか?メンバー変数にする?この例の画像作成機能では、
getExternalStoragePublicDirectory
が使用されています。これは内部ストレージに保存されていますか?私は、内部ストレージ、RAM、SDカード、電話機(外付けHDDなど)に接続されたストレージデバイス、クラウドなど、ファイルを保存する方法はいくつかあると想定していました。
基本的にファイル名を指定しないと、サムネイルがRAMに保存されます。ファイル名を指定すると、ファイル名に完全な画像が保存されますお望みならば)? –
PicturesディレクトリまたはDCIMに保存することをお勧めしますか? –
最初のコメントを修正してください。画像やDCIMを使用するかどうかに関するベストプラクティスはわかりませんが、画像を他のアプリと共有したい場合にのみ使用してください。あなたがカメラとして働いているなら、DCIMを使うといいでしょう。ギャラリーに新しい画像が表示されないようにするには、アプリのプライベート保存場所を使用します。 – Egg