2016-10-01 64 views
0

我想捕獲圖像,將其保存到外部存儲並顯示在ImageView中。圖像捕獲並保存成功,但ImageView當執行onActivityResult()時不顯示。它給出了null的值。onActivityResult()在Android 4.1.2中捕獲圖像後給出空值。

請告訴我爲什麼它給我空值。

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    imageView = (ImageView) findViewById(R.id.imageView); 

    //camera stuff 
    Intent imageIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
    timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 

    //folder stuff 
    imagesFolder = new File(Environment.getExternalStorageDirectory(), "MyImages"); 
    imagesFolder.mkdirs(); 

    File image = new File(imagesFolder, "QR_" + timeStamp + ".png"); 
    uriSavedImage = Uri.fromFile(image); 

    imageIntent.putExtra(MediaStore.EXTRA_OUTPUT, uriSavedImage); 
    startActivityForResult(imageIntent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE); 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 

    try { 
     if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) { 
      if (resultCode == RESULT_OK) { 
       Toast.makeText(this, "Image saved to:\n", Toast.LENGTH_LONG).show(); 
       Bitmap bitmap = (Bitmap) data.getExtras().get(MediaStore.EXTRA_OUTPUT); 
       imageView.setImageBitmap(bitmap); 

      } else if (resultCode == RESULT_CANCELED) { 
       // User cancelled the image capture 
      } else { 
       // Image capture failed, advise user 
      } 
     } 
    } catch (Exception e) { 
     Log.d("onActivityResult", " error "+e.getMessage()); 
    } 
} 

登錄錯誤:

10-01 10:57:14.008 18530-18530/com.example.zohaibsiddique.camera D/onActivityResult: error null 
+0

'onActivityResult()給出空value'。廢話。在Log.d(「onActivityResult」,「error」+ e.getMessage());'中,'e.getMessage()'是'null'。你的代碼產生一個catch。 – greenapps

+0

你的廢話是什麼意思?使用道德字請@greenapps –

+0

看看這個SO答案:[android-camera-onactivityresult-resets-photo-path-to-null](http://stackoverflow.com/questions/32722402/android-camera-onactivityresult-resets -photo-path-to-null/32723550#32723550) –

回答

1

如果你傳遞額外的參數MediaStore.EXTRA_OUTPUT用相機意圖,然後相機活動將寫入所拍攝的圖像,以這條道路,它不會在onActivityResult方法返回的位圖。

如果您將檢查您傳遞的路徑,那麼您將知道實際上攝像頭已將捕獲的文件寫入該路徑。

欲瞭解更多信息,您可以按照thisthisthis

+0

那我該如何返回位圖? –

0

調用內部的onCreate(此方法)

public void startCameraIntent() { 
     File imageFile = new File("YOUR PATH"); 
     Uri imageFileUri = Uri.fromFile(imageFile); // convert path to Uri 

     Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
     intent.putExtra(MediaStore.EXTRA_OUTPUT, imageFileUri); // set the image file name 
     startActivityForResult(intent, 02); 
    } 

不是把這些行內onActivityResult()

new ImageCompression(this).execute("PATH"); 

創建類:

public class ImageCompression extends AsyncTask<String, Void, String> { 

     private Context context; 
     private static final float maxHeight = 1280.0f; 
     private static final float maxWidth = 1280.0f; 


     public ImageCompression(Context context) { 
      this.context = context; 
     } 

     @Override 
     protected String doInBackground(String... strings) { 
      if (strings.length == 0 || strings[0] == null) 
       return null; 

      return compressImage(strings[0]); 
     } 

     protected void onPostExecute(String imagePath) { 
      // imagePath is path of new compressed image. 
      imageView.setImageBitmap(BitmapFactory.decodeFile(new File(imagePath).getAbsolutePath())); 
     } 


     public String compressImage(String imagePath) { 
      Bitmap scaledBitmap = null; 

      BitmapFactory.Options options = new BitmapFactory.Options(); 
      options.inJustDecodeBounds = true; 
      Bitmap bmp = BitmapFactory.decodeFile("YOUR PATH", options); 

      int actualHeight = options.outHeight; 
      int actualWidth = options.outWidth; 

      float imgRatio = (float) actualWidth/(float) actualHeight; 
      float maxRatio = maxWidth/maxHeight; 

      if (actualHeight > maxHeight || actualWidth > maxWidth) { 
       if (imgRatio < maxRatio) { 
        imgRatio = maxHeight/actualHeight; 
        actualWidth = (int) (imgRatio * actualWidth); 
        actualHeight = (int) maxHeight; 
       } else if (imgRatio > maxRatio) { 
        imgRatio = maxWidth/actualWidth; 
        actualHeight = (int) (imgRatio * actualHeight); 
        actualWidth = (int) maxWidth; 
       } else { 
        actualHeight = (int) maxHeight; 
        actualWidth = (int) maxWidth; 

       } 
      } 

      options.inSampleSize = calculateInSampleSize(options, actualWidth, actualHeight); 
      options.inJustDecodeBounds = false; 
      options.inDither = false; 
      options.inPurgeable = true; 
      options.inInputShareable = true; 
      options.inTempStorage = new byte[16 * 1024]; 

      try { 
       bmp = BitmapFactory.decodeFile(imagePath, options); 
      } catch (OutOfMemoryError exception) { 
       exception.printStackTrace(); 

      } 
      try { 
       scaledBitmap = Bitmap.createBitmap(actualWidth, actualHeight, Bitmap.Config.RGB_565); 
      } catch (OutOfMemoryError exception) { 
       exception.printStackTrace(); 
      } 

      float ratioX = actualWidth/(float) options.outWidth; 
      float ratioY = actualHeight/(float) options.outHeight; 
      float middleX = actualWidth/2.0f; 
      float middleY = actualHeight/2.0f; 

      Matrix scaleMatrix = new Matrix(); 
      scaleMatrix.setScale(ratioX, ratioY, middleX, middleY); 

      Canvas canvas = new Canvas(scaledBitmap); 
      canvas.setMatrix(scaleMatrix); 
      canvas.drawBitmap(bmp, middleX - bmp.getWidth()/2, middleY - bmp.getHeight()/2, new Paint(Paint.FILTER_BITMAP_FLAG)); 

      if (bmp != null) { 
       bmp.recycle(); 
      } 

      ExifInterface exif; 
      try { 
       exif = new ExifInterface(imagePath); 
       int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, 0); 
       Matrix matrix = new Matrix(); 
       if (orientation == 6) { 
        matrix.postRotate(90); 
       } else if (orientation == 3) { 
        matrix.postRotate(180); 
       } else if (orientation == 8) { 
        matrix.postRotate(270); 
       } 
       scaledBitmap = Bitmap.createBitmap(scaledBitmap, 0, 0, scaledBitmap.getWidth(), scaledBitmap.getHeight(), matrix, true); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      FileOutputStream out = null; 
      String filepath = getFilename(); 
      try { 
       new File("YOUR PATH").delete(); 
       out = new FileOutputStream(filepath); 

       //write the compressed bitmap at the destination specified by filename. 
       scaledBitmap.compress(Bitmap.CompressFormat.JPEG, 80, out); 
/* 

       Uri uri = Uri.parse(filepath + "/tmp.x"); 
       sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uri)); 

*/ 
      } catch (FileNotFoundException e) { 
       e.printStackTrace(); 
      } 

      return filepath; 
     } 

     public int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) { 
      final int height = options.outHeight; 
      final int width = options.outWidth; 
      int inSampleSize = 1; 

      if (height > reqHeight || width > reqWidth) { 
       final int heightRatio = Math.round((float) height/(float) reqHeight); 
       final int widthRatio = Math.round((float) width/(float) reqWidth); 
       inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio; 
      } 
      final float totalPixels = width * height; 
      final float totalReqPixelsCap = reqWidth * reqHeight * 2; 

      while (totalPixels/(inSampleSize * inSampleSize) > totalReqPixelsCap) { 
       inSampleSize++; 
      } 

      return inSampleSize; 
     } 
    } 

比在活動類的創建方法:

public String getFilename() { 
    File mediaStorageDir = new File(Environment.getExternalStorageDirectory() 
      + "/Tax Images"); 

    MediaScannerConnection.scanFile(this, new String[]{mediaStorageDir.toString()}, null, null); 
    // Create the storage directory if it does not exist 
    if (!mediaStorageDir.exists()) { 
     mediaStorageDir.mkdirs(); 
    } 


    String uriString = (mediaStorageDir.getAbsolutePath() + "/" + "IMAGE_NAME"); 

    return uriString; 
} 
1

你有兩個選擇有圖像,從畫廊和捕捉從相機。如果您意圖將EXTRA_OUTPUT,它不會返回Bitmap。那麼你必須使用Uri

使用這兩種方法來startActivityForResult

private void selectFromCamera() { 

    try { 
     File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "DCIM"); 
     if (!file.exists()) { 
      file.mkdirs(); 
     } 

     File localFile = new File(file + File.separator + "IMG_" + String.valueOf(System.currentTimeMillis()) + ".jpg"); 
     imageUri = Uri.fromFile(localFile); 

     Intent cameraIntent = new Intent("android.media.action.IMAGE_CAPTURE"); 

     cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { 
      cameraIntent.setClipData(ClipData.newRawUri(null, Uri.fromFile(localFile))); 
     } 

     startActivityForResult(cameraIntent, REQUEST_CAMERA); 
    } catch (Exception localException) { 
     Toast.makeText(ActivityAddMemory.this, "Exception:" + localException, Toast.LENGTH_SHORT).show(); 
    } 
} 

private void selectFromGallery() { 
    Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
    intent.setType("image/*"); 
    startActivityForResult(Intent.createChooser(intent, "Select File"), SELECT_FILE); 
} 

現在裏面onActivityForResult

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent intent) { 
    super.onActivityResult(requestCode, resultCode, intent); 

    if(resultCode == RESULT_OK) { 
     String path=null; 
     Uri uri; 
     if (intent == null || intent.getData() == null) 
      uri = this.imageUri; 
     else 
      uri = intent.getData(); 

     if(requestCode == SELECT_FILE) { 
      path = getRealPathFromURI(uri); 
     } else if(requestCode == REQUEST_CAMERA){ 
      path = uri.getEncodedPath(); 
     } 

    imageView.setImageBitmap(BitmapFactory.decodeFile(path)); 
} 

下面是getRealPathFromUri

public String getRealPathFromURI(Uri uri){ 
    String filePath = ""; 
    String[] filePahColumn = {MediaStore.Images.Media.DATA}; 
    Cursor cursor = getContentResolver().query(uri, filePahColumn, null, null, null); 
    if (cursor != null) { 
     if(cursor.moveToFirst()){ 
      int columnIndex = cursor.getColumnIndex(filePahColumn[0]); 
      filePath = cursor.getString(columnIndex); 
     } 
     cursor.close(); 
    } 
    return filePath; 
}