Monodroid настройка изображения для изображения, хранящегося на SDCard - PullRequest
2 голосов
/ 09 декабря 2011

Как сделать фотографию и сохранить ее в определенную папку.Я знаю, что это сохраняет в SDCard / DCIM / и т. Д.

Но я не хочу его там, я хочу, чтобы он был сохранен в папке в / 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 ]

2 голосов
/ 14 декабря 2011

Из того, что я понял, когда разрабатывал приложение с использованием 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 голос
/ 04 января 2012

Я бы хотел добавить решение Лэнкса.

Допустим, вы используете следующий код, чтобы сделать снимок

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

Как только у вас будет реальный путь, вы можете переместить его туда, куда вам нужно, как подсказывают лэнки.

...