2013-06-01 58 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

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

+0

@PareshMayani:谢谢,那篇文章doesn'尽管我很好的回答了我的问题。 –

回答

0

检索到的Uri这样

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

的方式。在拍摄照片之前,我会创建一个新文件,以便我知道要使用哪个文件。

我的代码开始在意图:

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'获取路径/数据。看起来,为了做异步工作,必须保持类级别的变量非常蹩脚。当照相机完成拍摄时,它应该将图像的路径/数据(如果用户拿走一张)或空路径/数据返回给您。看起来很奇怪(也许是一个bug),如果你以前提供了保存路径,那么'intent'被发送为'null'。 –

+0

嗯,是的,我明白,如果你可以要求提供路径的意图,这将是很好的。我无法帮助你,因为我从来没有研究过,因为类变量对我来说不是问题。祝你找到答案! – jHogen