2011-12-09 49 views
2

如何拍照并将其保存到特定文件夹。我知道它保存到SD卡/ DCIM /等Monodroid将imageview设置为存储在SD卡上的图像

但我不希望它在那里,我希望它被保存在/ 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中的一些示例代码。

检索所拍摄的图像

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())); 
的文件名

图像移动到您想要的目的地

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

我想添加到lanks的解决方案。

比方说,您使用下面的代码进行拍照

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; 

凡ACTIVITY_RESULT_PICTURE_TAKEN只是一个简单的价值,你可以在 OnActivityResult使用它来检查活动被完成。

你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 
    } 
} 

你早点起床URI是具体到Android的东西,需要翻译。

它看起来像“// content:// media/external/media/11917”,它不是 有效路径。

哪个是GetRealPathFromURI功能不正是:

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); 
} 

一旦你得到了真正的路径,你可以把它移到无论你想为lanks建议。