2016-04-04 10 views
2

私はこれらの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なので、私は何かへのアクセス権を持っていません。

私の質問:

  1. あなたがAndroidのカメラを使って写真を撮って、それは一般的に2つのファイルを作成しない - サムネイルと完全なファイルを?

  2. シナリオ1では、これらのファイルは内部または外部ストレージに書き込まれていませんが、RAMだけです。サムネイルはインテントに保存されますが、これは完全なファイルが失われた/取得できないことを意味しますか?

  3. シナリオ2では、何らかの理由でtakePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile));を使用したため、インテントがnullです。このファイルの場所を知るには? mPhotoPathが本当に必要なのでしょうか、またはFile photoFileへのアクセスを維持する必要がありますか。これはonActivityResultメソッドに到達するまでに失われましたか?このファイルを保持するための適切な方法は何ですか?メンバー変数にする?

  4. この例の画像作成機能では、getExternalStoragePublicDirectoryが使用されています。これは内部ストレージに保存されていますか?私は、内部ストレージ、RAM、SDカード、電話機(外付けHDDなど)に接続されたストレージデバイス、クラウドなど、ファイルを保存する方法はいくつかあると想定していました。

答えて

1
  1. それは(ファイル名を指定しない場合)Intentにサムネイルを返すか、元Intentエキストラで指定したファイル名にファイルを保存しますか。私は両方を行う方法があるとは思わない。フルイメージを保存してからサムネイルを作成する場合は、自分でサムネイルを作成する必要があります。テントの詳細についてはこちらをご覧ください:http://developer.android.com/reference/android/provider/MediaStore.html#ACTION_IMAGE_CAPTURE
  2. ファイルには、ここで指定したIntentphotoFileUriに保存されている:takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile));

  3. あなたはそう、おそらくメンバ変数として、Uriどこかに保存する必要があります後でアクセスすることができます。つまり、画像が正常に撮影された場合に画像が保存されるのはUriです。

  4. これは、この場合、AndroidユーザーのデフォルトのPhotosフォルダになります。 getExternalStoragePublicDirectoryは、共有データ(おそらくSDカードまたは内蔵SDストレージ)に使用されるメディアに関係なく使用されます。

+0

基本的にファイル名を指定しないと、サムネイルがRAMに保存されます。ファイル名を指定すると、ファイル名に完全な画像が保存されますお望みならば)? –

+0

PicturesディレクトリまたはDCIMに保存することをお勧めしますか? –

+0

最初のコメントを修正してください。画像やDCIMを使用するかどうかに関するベストプラクティスはわかりませんが、画像を他のアプリと共有したい場合にのみ使用してください。あなたがカメラとして働いているなら、DCIMを使うといいでしょう。ギャラリーに新しい画像が表示されないようにするには、アプリのプライベート保存場所を使用します。 – Egg

関連する問題