2013-06-01 3 views
2

Я смотрел несколько примеров, которые запускают намерение android.media.action.IMAGE_CAPTURE и используют переменную уровня класса для хранения полученного изображения. Я не хочу этого делать. Я думаю, что должен уметь указать URI файла, а затем вернуть этот URI из намерения, когда он будет завершен. Я пытаюсь сделать это:Как извлечь URI файла из камеры?

void snapPixButton_Click(object sender, EventArgs e) 
{ 
    Intent cameraIntent = new Intent(MediaStore.ActionImageCapture); 
    File file = new File(Home.SnapStorageLocation, string.Format("{0}.jpg", Guid.NewGuid())); 

    cameraIntent.PutExtra(MediaStore.ExtraOutput, file.ToURI().ToString()); 

    StartActivityForResult(cameraIntent, SnapPixIntentRequestCode); 
} 

protected override void OnActivityResult(int requestCode, Result resultCode, Intent data) 
{ 
    if (requestCode == SnapPixIntentRequestCode && resultCode == Result.Ok) 
    { 
     URI uri = new URI(data.GetStringExtra(MediaStore.ExtraOutput)); 
     File file = new File(uri); 

     using (Bitmap bitmap = LoadAndResizeBitmap(file.Path, this.ImageView.Width, this.ImageView.Height)) 
     { 
      this.ImageView.SetImageBitmap(bitmap); 
     } 
    } 
} 

Но в OnActivityResult, вызов data.GetStringExtra(MediaStore.ExtraOutput) результатов в сообщении: Неизвестный идентификатор: MediaStore

Что я делаю неправильно? Я не думаю, что мне придется держать переменные уровня класса, я должен уметь передавать данные в намерение, а затем извлекать их потом, не так ли?

+0

check: http://stackoverflow.com/questions/6341329/built-in-camera-using-the-extra-mediastore-extra-output-stores-pictures-twice –

+0

@PareshMayani: Спасибо, этот пост не " Однако я полностью отвечаю на мой вопрос. –

ответ

0

я получить Ури этот путь

String[] filePathColumn = { MediaStore.Images.Media.DATA }; 
    Uri imageFilePathUri = null; 
    if (cameraImagePath != null) { 
     Cursor imageCursor = getContentResolver().query(
      cameraImagePath, filePathColumn, null, null, null); 
    if (imageCursor != null && imageCursor.moveToFirst()) { 
     int columnIndex = imageCursor.getColumnIndex(filePathColumn[0]); 
     String filePath = imageCursor.getString(columnIndex); 
     imageCursor.close(); 
     imageFilePathUri = filePath != null ? Uri 
       .parse(filePath) : null; 
    } 

и начало этой Intent

Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
    ContentValues values = new ContentValues(3); 

    values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg"); 
    cameraImagePath = getContentResolver().insert(
      MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); 
    takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, cameraImagePath); 
    startActivityForResult(takePictureIntent, CAMERA_REQUEST); 
+0

Похоже, вы по-прежнему используете глобальную переменную уровня класса 'cameraImagePath'. Я специально спрашиваю, как НЕ делать это и просто извлекать путь сохранения из «Intent» после того, как будет сделана фотография. Исправьте меня, если я ошибаюсь, и код, который вы опубликовали, не завершен. Благодаря! –

0

так, как я делаю это с новым объектом File. Прежде чем я сделаю снимок, я создаю новый файл, чтобы я знал, какой файл использовать.

Моего кода для запуска в Intent:

var cameraIntent = new Intent(MediaStore.ActionImageCapture); 
var availableActivies = PackageManager.QueryIntentActivities(cameraIntent, 
                  PackageInfoFlags.Permissions); 

if (availableActivies != null && availableActivies.Count > 0) 
{ 
    var dir = 
     new File(
      Android.OS.Environment.GetExternalStoragePublicDirectory(
       Android.OS.Environment.DirectoryPictures), "Map name"); 
    if (!dir.Exists()) 
    { 
     dir.Mkdirs(); 
    } 
    _imageFile = new File(dir, string.Format("CP2{0}.jpg", DateTime.Now.Ticks)); 
    cameraIntent.PutExtra(MediaStore.ExtraOutput, Android.Net.Uri.FromFile(_imageFile)); 

    StartActivityForResult(cameraIntent,100); 
} 

Тогда на Результате деятельности я просто делаю это:

using (Bitmap usedBitmap = BitmapFactory.DecodeFile(_imageFile.AbsolutePath)) 
{ 
    _usedImageView = FindViewById<ImageView>(Resource.Id.imageView1); 
    _usedImageView.SetImageBitmap(usedBitmap); 
    _usedImageView.Dispose(); 
    usedBitmap.Dispose(); 
} 

Надеется, что это помогает с вашей проблемой.

+1

Спасибо. И я получаю это, но вы все еще используете переменную уровня класса ('_imageFile') вместо того, чтобы получать путь/данные из' Intent'. Похоже, супер-хромому приходится поддерживать переменные уровня класса для выполнения асинхронной работы. Когда камера сделана, щелкнув фотографию, она должна вернуть вам намерение вместе с дорожкой/данными для изображения (если пользователь взял один) или нулевой путь/данные. Кажется очень странным (возможно, ошибкой), что «намерение» отправляется как «null», если вы ранее предоставили путь сохранения. –

+0

Хм, да, я понимаю, что было бы неплохо, если бы вы могли спросить о намерении предоставить путь. Я не могу с этим поделать, поскольку я никогда не рассматривал это, потому что переменная класса для меня не проблема. Удачи вам в поиске ответа! – jHogen

Смежные вопросы