2011-12-09 9 views
2

写真を撮って特定のフォルダに保存するにはどうすればいいですか?私は次のようにディレクトリを作ってきた私は、それは/ SDカード/カメラ内のフォルダにモノドローイングの設定イメージビューをSDカードに保存

を格納したい、私はそれが/ DCIMの/ etc

SDカードに保存されます知っているしかし、私はそこにそれをしたくありません:

String destPath = Android.OS.Environment.ExternalStorageDirectory + "/Camera"; 

次に、私はカメラの意図を立ち上げ、私が作ったパスに保存ファイルをポイントしようとします。

Intent launchCamera = new Intent(Android.Provider.MediaStore.ActionImageCapture); 
launchCamera.PutExtra(MediaStore.ExtraOutput, destPath); 

これは機能しません。イメージはまだ/ sdcard/dcim/etcに保存されます

アイデア?

答えて

2

私がMonodroidを使ってアプリケーションを開発したときに収集したことは、カメラが非常にバギーであり、ほとんどの時間にカメラを使いたくないということです。これには、画像キャプチャを保存する宛先を指定することが含まれます。 私の知る限りでは、これらの問題はMonodroid特有の問題ではなく、java android sdkで発生します。

この問題を回避するには、宛先を指定せずにイメージをキャプチャし、次にOnActivityResultメソッドでギャラリーに保存されている最新のイメージを取得することが必要です。最新の画像を取得したら、それをあなたの好みの場所に移動することができます。

ここでは、OnActivityResult内のコード例を示します。

は、ご希望の目的地、私はlanksのソリューションに追加したい

System.IO.File.Move (origin, "yourdestinationfilenamehere"); 
1

に画像を移動

撮影した画像

Android.Net.Uri targetUri = data.Data; 
String origin = ""; 
String [] proj = { MediaStore.MediaColumns.Data.ToString(), BaseColumns.Id }; 

var qry = ManagedQuery (MediaStore.Images.Media.ExternalContentUri, proj, null, null, "date_added DESC"); 

qry.MoveToFirst(); 

origin = qry.GetString (qry.GetColumnIndexOrThrow (MediaStore.MediaColumns.Data.ToString())); 
のファイル名を取得します。

のは、あなたがACTIVITY_RESULT_PICTURE_TAKENあなたが完了したアクティビティをチェックする OnActivityResultに使用できるだけの単純な値である絵

var uri = ContentResolver.Insert(MediaStore.Images.Media.ExternalContentUri, 
           new ContentValues()); 

var intent = new Intent(MediaStore.ActionImageCapture); 
intent.PutExtra(MediaStore.ExtraOutput, uri); 
StartActivityForResult(intent, ACTIVITY_RESULT_PICTURE_TAKEN); 

pictureUri = uri; 

を取るために、次のコードを使用しましょう。

あなたOnActivityResultは次のようになります:

protected override void OnActivityResult(int requestCode, 
             Result resultCode, Intent data) 
{ 
    if (resultCode == Result.Ok && requestCode == ACTIVITY_RESULT_PICTURE_TAKEN) 
    { 
     string picturePath = GetRealPathFromURI(pictureUri); 
     //Do something with the file 
    } 
} 

以前に得たウリは、Androidに特有のもので、翻訳する必要があります。

有効なパスではない "// content:// media/external/media/11917"のように見えます。 GetRealPathFromURI機能はまったく同じものです

:あなたは本当のパスを持ったら、あなたはlanksが示唆されているように好きな場所に移動することができます

public string GetRealPathFromURI(Android.Net.Uri contentUri) 
{    
    var mediaStoreImagesMediaData = "_data"; 
    string[] projection = { mediaStoreImagesMediaData }; 
    Android.Database.ICursor cursor = this.ManagedQuery(contentUri, projection, 
                 null, null, null); 
    int columnIndex = cursor.GetColumnIndexOrThrow(mediaStoreImagesMediaData); 
    cursor.MoveToFirst(); 
    return cursor.GetString(columnIndex); 
}