Monodroid将imageview设置为存储在SD卡上的图像

时间:2011-12-09 16:45:29

标签: android camera xamarin.android

如何拍摄照片并将其保存到特定文件夹。我知道它保存到sdcard / DCIM / etc

但我不希望它存在,我希望它存储在/ sdcard / Camera中的文件夹中

我使用以下内容制作了目录:

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

然后我启动相机意图并尝试将保存文件指向我制作的路径。

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

这不起作用。图像仍然保存到/ sdcard / dcim / etc

想法?

2 个答案:

答案 0 :(得分: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 :(得分: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);
}

一旦你获得了真正的路径,就可以将它移动到你想要的地方。