2009-03-16 5 views
10

私のアプリケーションでは、独自のカメラクラスを使用して画像と自分のデータベースを取得していましたが、間もなく変更に追いつくことができず、アンドロイドで内蔵のカメラアプリケーションを使用することにしましたしかし、私はそれをファイルを保存するように見えることはできません。私はここで何が欠けていますか?アプリケーションはファイルを保存しているようですが、ちょうど0バイトです。私はカメラアプリケーションのソースコードを調べて、ファイルを保存するためにExtrasの「出力」を探しています。どんな助けでも大歓迎です。AndroidのMediaStoreを使用してカメラからディスクにデータを保存するにはどうすればよいですか?

Public class CameraTest extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     Button cameraButton = (Button) findViewById(R.id.cameraButton); 
     cameraButton.setOnClickListener(new OnClickListener(){ 
      public void onClick(View v){ 
       ContentValues values = new ContentValues(); 
       values.put(Images.Media.TITLE, "title"); 
       values.put(Images.Media.BUCKET_ID, "test"); 
       values.put(Images.Media.DESCRIPTION, "test Image taken"); 
       Uri uri = getContentResolver().insert(Media.EXTERNAL_CONTENT_URI, values); 
       Intent intent = new Intent("android.media.action.IMAGE_CAPTURE"); 
       intent.putExtra("output", uri.getPath()); 
       startActivityForResult(intent,0); 
      } 
     }); 

    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (requestCode== 0 && resultCode == Activity.RESULT_OK){ 
      ((ImageView)findViewById(R.id.pictureView)).setImageURI(data.getData()); 
     } 
    } 


} 

答えて

14

これは次のコードで動作しました。私は最後のもので少しばかげていました。私はまだ元のイメージがまだどこかに保存されるように、より良い方法が必要だと思っています。それでも私は小さい25%のサイズの画像を送ります。

public class CameraTest extends Activity { 
/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    Button cameraButton = (Button) findViewById(R.id.cameraButton); 
    cameraButton.setOnClickListener(new OnClickListener(){ 
     public void onClick(View v){ 

      Intent intent = new Intent("android.media.action.IMAGE_CAPTURE"); 

      startActivityForResult(intent,0); 
     } 
    }); 

} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (requestCode== 0 && resultCode == Activity.RESULT_OK) { 
     Bitmap x = (Bitmap) data.getExtras().get("data"); 
     ((ImageView)findViewById(R.id.pictureView)).setImageBitmap(x); 
     ContentValues values = new ContentValues(); 
     values.put(Images.Media.TITLE, "title"); 
     values.put(Images.Media.BUCKET_ID, "test"); 
     values.put(Images.Media.DESCRIPTION, "test Image taken"); 
     values.put(Images.Media.MIME_TYPE, "image/jpeg"); 
     Uri uri = getContentResolver().insert(Media.EXTERNAL_CONTENT_URI, values); 
     OutputStream outstream; 
     try { 
      outstream = getContentResolver().openOutputStream(uri); 
      x.compress(Bitmap.CompressFormat.JPEG, 70, outstream); 
      outstream.close(); 
     } catch (FileNotFoundException e) { 
      // 
     } catch (IOException e) { 
      // 
     } 
    } 
} 

また、Androidのカップケーキリリースですぐに小さな画像サイズを修正する必要があることはわかっています。

+1

ちょっとはそうuの感謝のu – Geetanjali

+0

に感謝:ねえ、私はウルのコードを使用しているが、私はアスペクト比と作物のオプションを使用していた1 problem.Iを持っているが、そのアスペクト比.Whyを取っていませんこの異常な行動ですか?助けてください – Geetanjali

4

初めての試みでは、「出力」を余分に読み込んだときにカメラアプリケーションがクラッシュする可能性があります。これは、文字列を提供している間にUriと予想されるためです。カメラアプリは、写真をキャプチャした後、余分なフラグを読み取っているようです。 uri.getPath()ではなくuriを提供するだけです。その後、あなたはすでに写真のURIを知っているので、それはonResult呼び出しで返されません。メンバー変数のURIを覚えておく必要があります。

2回目の試行では、縮小された(50%)ビットマップが戻されます。主にビューを対象としています。私はフルサイズのビットマップは、アプリケーションのメモリの予算には大きすぎると思う。これがダウンスケールの理由かもしれません。

+0

意味があります。私は大きな画像や画面上の拡大されていない複数の画像でバッファオーバーフローのタイプの問題を覚えています... – prasanna

0

エミュレータで同じ問題が発生しました 実際の電話機で試しましたが、 仮想電話機で実際にPicuresを使用できない可能性があります。

+0

あなたは正しいエミュレータはカメラで動作しません。 –

+0

nopeエミュレータはカメラで作業します – Trikaldarshi

4

FYI、これはドキュメントにあります: 発信者は、この画像が書き込まれる場所を制御するために余分なEXTRA_OUTPUTを渡すことがあります。 EXTRA_OUTPUTが存在しない場合は、余分なフィールドに小さな画像がビットマップオブジェクトとして返されます。これは、小さな画像しか必要としないアプリケーションに役立ちます。 EXTRA_OUTPUTが存在する場合、フルサイズの画像はEXTRA_OUTPUTのUri値に書き込まれます。

がここにあります:http://developer.android.com/reference/android/provider/MediaStore.html

をあなたはどこにそれを伝えるのであればアプリは、あなたのためのフルサイズの画像を保存することができます。

**編集:これはHTCデバイスでは当てはまりません。 htc senseを使用するHTC(ネクサスではない)は、アンドロイド1.5から分岐し、常に低解像度で画像を保存するバグを持っています。カメラのランチアクティビティを使用して、カメラの共有機能を使用してフルサイズの画像を使用することができます。

6

以下のコードは、デフォルトのカメラを起動し、カメラが指定したURIに画像を保存するようにします。重要なのは、追加の "MediaStore.EXTRA_OUTPUT"を目的のURIとともに配置することです。 much.itが実際に動作するようにして

File file = new File(Environment.getExternalStorageDirectory().getPath() + "/Images/" + image_name + ".jpg"); 
Uri imageUri = Uri.fromFile(file); 

Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); 

startActivityForResult(intent, 0); 
+0

画像が撮影されたら自動的にファイルを保存する方法はありますか?または、カメラを起動して写真を撮ったら、ユーザーが決定する方が良いでしょう。 –

関連する問題