2014-05-16 99 views
0

ALL,檢索攝像機圖像上的Android

我有以下代碼:

try 
    { 
     Intent captureIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
     File storage = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); 
     cameraImageFiles = File.createTempFile("user_photo", ".png", storage); 
     captureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(cameraImageFiles)); 
     final Intent galleryIntent = new Intent(); 
     galleryIntent.setType("image/*"); 
     galleryIntent.setAction(Intent.ACTION_GET_CONTENT); 
     Intent photoIntent = Intent.createChooser(galleryIntent, "Select or take a new picture"); 
     photoIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[] { captureIntent }); 
     startActivityForResult(photoIntent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE); 
    } 
    catch(IOException e) 
    { 
     Utils.displayErrorDialog(context, e.getMessage()); 
    } 

在網絡上的每一個例子,在這裏談談從攝像機獲取圖像時,只有1意圖。

在這裏,我有一個IntentChooser來選擇圖庫圖像或使用相機拍攝新照片。據我瞭解使用這段代碼,我不能簡單地獲取圖像,因爲在「onActivityResult()」我應該將圖片保存到文件 - 它不會自動保存。

現在我想要做的就是從相機拍攝圖像。我真的不在乎它是否會被保存 - 我只是想要一張照片。

我知道如何從圖庫中獲取圖像 - 我有這個代碼,它的工作原理。但從相機獲取圖像現在是一個難題。

謝謝。

[編輯] 這是我放在onActivityResult()的代碼

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) 
{ 
    if(requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) 
    { 
     if(resultCode == RESULT_OK) 
     { 
      Uri uri = null; 
      if(data == null) 
      { 
       if(cameraImageFiles.exists()) 
       { 
        uri = Uri.fromFile(cameraImageFiles); 
        InputStream input; 
        try 
        { 
         input = getContentResolver().openInputStream(uri); 
         BitmapFactory.Options opts = new BitmapFactory.Options(); 
         opts.inJustDecodeBounds = true; 
         bmp = BitmapFactory.decodeStream(input, null, opts); 
         input.close(); 
         int height = opts.outHeight; 
         int width = opts.outWidth; 
         int inSampleSize = 1; 
         int reqHeight = camera.getHeight(); 
         int reqWidth = camera.getWidth(); 
         if(height > reqHeight || width > reqWidth) 
         { 
          int halfHeight = height/2; 
          int halfWidth = width/2; 
          while((halfHeight/inSampleSize) > reqHeight && (halfWidth/inSampleSize) > reqWidth) 
           inSampleSize *= 2; 
         } 
         opts.inSampleSize = inSampleSize; 
         opts.inJustDecodeBounds = false; 
         bmp = BitmapFactory.decodeStream(input, null, opts); 
         camera.setImageBitmap(bmp); 
        } 
        catch(FileNotFoundException e) 
        { 
         Utils.displayErrorDialog(this, e.getMessage()); 
        } 
        catch(IOException e) 
        { 
         Utils.displayErrorDialog(this, e.getMessage()); 
        } 
       } 
       photoReady = true; 
      } 

執行後,代碼給出空爲bmp,所以我想不保存圖像。

[/編輯]

+0

它被保存。否則無法獲得照片。 – CommonsWare

+0

您需要使用SurfaceView創建自己的相機。 – njzk2

+0

爲什麼有意在畫廊或照相機之間進行選擇?這沒有任何意義,爲什麼你沒有提出一個對話框,並在對話結果 – Tascalator

回答

0

相機將節省磁盤上的所拍攝的畫面,但不會是PNG,將JPEG格式。此外,如果使用ACTION_IMAGE_CAPTURE,數據將不會爲空,因此您的代碼根本無法工作。此外,相機捕獲意圖應該仔細啓動,以避免尋找許多設備的well documented bug。請參閱https://stackoverflow.com/a/16433874/192373及其附近。

注意ACTION_GET_CONTENT需要在奇巧特殊處理,你可能會ACTION_OPEN_DOCUMENT得到更好的服務,請參閱https://stackoverflow.com/a/20177611/192373

+0

好吧,所以我最好用我自己的對話框進行動作選擇?因爲它看起來像標準的一個太麻煩了...... – Igor

+0

我不認爲系統選擇器對話會讓你的生活變得更難。即使你打開了自己的對話框,你仍然需要正確處理這兩個操作,並準備好在Kit-Kat中引入的更改。 –

+0

所以讓我重申一遍。拍攝照片後,系統將自行將其保存到擴展名爲「.jpeg」的文件中。我不需要將它保存在onActivityResult()中,我只需要將此文件加載到內存中。現在Kit-Kat的變化是否向後兼容?這意味着我將能夠使用以前版本的代碼.... – Igor