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

相關問題