title: Cannot Upload Image From Gallery in Android Studio
body: <p>I want to upload image from gallery in my android app. When I click on button, the gallery should be opened. <strong>After selecting image, I want to open another activity named UploadActivity. There the thumbnail of the image should be previewed.</strong> The Upload Button will below the thumbnail.</p>
  
  <p><a href="https://i.stack.imgur.com/408TL.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/408TL.png" alt="Upload Image From Gallery"></a></p>
  
  <p><strong>But when I Choose photo from gallery, then the thumbnail of the image are not previewing. I am unable to upload the photo also.</strong> My Code goes here: (Scan.Java)    </p>
  
  <pre><code> private static final int CAMERA_CAPTURE_IMAGE_REQUEST_CODE = 100;
  public static final int MEDIA_TYPE_IMAGE = 1;
  private static final int SELECT_IMAGE = 2;
  private Uri fileUri; // file url to store image/video
  ImageView dummy;
  private Button btnCapturePicture;
  private Button btnGallery;
  
  @Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.scan);
      dummy = (ImageView) findViewById(R.id.dummyphoto);
      btnCapturePicture = (Button) findViewById(R.id.btnCapturePicture);
      btnGallery = (Button) findViewById(R.id.btnGallery);
      /**
       * Capture image button click event
       */
      btnCapturePicture.setOnClickListener(new View.OnClickListener() {
  
          @Override
          public void onClick(View v) {
              // capture picture
              captureImage();
          }
      });
  
      btnGallery.setOnClickListener(new View.OnClickListener(){
  
          @Override
          public void onClick(View v){
              openGallery();
          }
  
      });
  
      // Checking camera availability
      if (!isDeviceSupportCamera()) {
          Toast.makeText(getApplicationContext(),
                  "Sorry! Your device doesn't support camera",
                  Toast.LENGTH_LONG).show();
          // will close the app if the device does't have camera
          finish();
      }
  }
  
  /**
   * Checking device has camera hardware or not
   * */
  private boolean isDeviceSupportCamera() {
      if (getApplicationContext().getPackageManager().hasSystemFeature(
              PackageManager.FEATURE_CAMERA)) {
          // this device has a camera
          return true;
      } else {
          // no camera on this device
          return false;
      }
  }
  
  /**
   * Launching camera app to capture image
   */
  private void captureImage() {
      Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
  
      fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE);
  
      intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
  
      // start the image capture Intent
      startActivityForResult(intent, CAMERA_CAPTURE_IMAGE_REQUEST_CODE);
  }
  
  /**
   * Launching Gallery to Choose Image
   */
  private void openGallery(){
      Intent intent = new Intent();
      intent.setType("image/*");
      intent.setAction(Intent.ACTION_GET_CONTENT);
      fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE);
      intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
      startActivityForResult(Intent.createChooser(intent, "Select Image"),SELECT_IMAGE);
  }
  
  /**
   * Here we store the file url as it will be null after returning from camera
   * app
   */
  @Override
  protected void onSaveInstanceState(Bundle outState) {
      super.onSaveInstanceState(outState);
  
      // save file url in bundle as it will be null on screen orientation
      // changes
      outState.putParcelable("file_uri", fileUri);
  }
  
  @Override
  protected void onRestoreInstanceState(Bundle savedInstanceState) {
      super.onRestoreInstanceState(savedInstanceState);
  
      // get the file url
      fileUri = savedInstanceState.getParcelable("file_uri");
  }
  
  
  
  /**
   * Receiving activity result method will be called after closing the camera
   * */
  @Override
  protected void onActivityResult(int requestCode, int resultCode, Intent data) {
      // if the result is capturing Image
      if (requestCode == CAMERA_CAPTURE_IMAGE_REQUEST_CODE) {
          if (resultCode == RESULT_OK) {
  
              // successfully captured the image
              // launching upload activity
              launchUploadActivity(true);
  
  
          } else if (resultCode == RESULT_CANCELED) {
  
              // user cancelled Image capture
              Toast.makeText(getApplicationContext(),
                      "User cancelled image capture", Toast.LENGTH_SHORT)
                      .show();
  
          } else {
              // failed to capture image
              Toast.makeText(getApplicationContext(),
                      "Sorry! Failed to capture image", Toast.LENGTH_SHORT)
                      .show();
          }
  
      }
  
      else if (requestCode == SELECT_IMAGE)
      {
          if (resultCode == Activity.RESULT_OK)
          {
              if (data != null)
              {
                      launchUploadActivity(true);
              }
          } else if (resultCode == Activity.RESULT_CANCELED)
          {
              Toast.makeText(getApplicationContext(), "Cancelled", Toast.LENGTH_SHORT).show();
          }
      }
  
  }
  
  private void launchUploadActivity(boolean isImage){
      Intent i = new Intent(Scan.this, UploadActivity.class);
      i.putExtra("filePath", fileUri.getPath());
      i.putExtra("isImage", isImage);
      startActivity(i);
  }
  </code></pre>
  
  <p>UploadActivity.Java Code goes here:</p>
  
  <pre><code>private ProgressBar progressBar;
  private String filePath = null;
  private TextView txtPercentage;
  private ImageView imgPreview;
  private Button btnUpload;
  long totalSize = 0;
  
  @Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_upload);
      txtPercentage = (TextView) findViewById(R.id.txtPercentage);
      btnUpload = (Button) findViewById(R.id.btnUpload);
      progressBar = (ProgressBar) findViewById(R.id.progressBar);
      imgPreview = (ImageView) findViewById(R.id.imgPreview);
  
      // Receiving the data from previous activity
      Intent i = getIntent();
  
      // image path that is captured in previous activity
      filePath = i.getStringExtra("filePath");
  
      // boolean flag to identify the media type, image
      boolean isImage = i.getBooleanExtra("isImage", true);
  
      if (filePath != null) {
          // Displaying the image on the screen
          previewMedia(isImage);
      } else {
          Toast.makeText(getApplicationContext(),
                  "Sorry, file path is missing!", Toast.LENGTH_LONG).show();
      }
  
      btnUpload.setOnClickListener(new View.OnClickListener() {
  
          @Override
          public void onClick(View v) {
              // uploading the file to server
              new UploadFileToServer().execute();
          }
      });
  
  }
  
  /**
   * Displaying captured image on the screen
   * */
  private void previewMedia(boolean isImage) {
      // Checking whether captured media is image
      if (isImage) {
          imgPreview.setVisibility(View.VISIBLE);
          // bimatp factory
          BitmapFactory.Options options = new BitmapFactory.Options();
  
          // down sizing image as it throws OutOfMemory Exception for larger
          // images
          options.inSampleSize = 8;
  
          final Bitmap bitmap = BitmapFactory.decodeFile(filePath, options);
  
          imgPreview.setImageBitmap(bitmap);
      } else {
          imgPreview.setVisibility(View.GONE);
      }
  }
  
  /**
   * Uploading the file to server
   * */
  private class UploadFileToServer extends AsyncTask&lt;Void, Integer, String&gt; {
      @Override
      protected void onPreExecute() {
          // setting progress bar to zero
          progressBar.setProgress(0);
          super.onPreExecute();
      }
  
      @Override
      protected void onProgressUpdate(Integer... progress) {
          // Making progress bar visible
          progressBar.setVisibility(View.VISIBLE);
  
          // updating progress bar value
          progressBar.setProgress(progress[0]);
  
          // updating percentage value
          txtPercentage.setText(String.valueOf(progress[0]) + "%");
      }
  
      @Override
      protected String doInBackground(Void... params) {
          return uploadFile();
      }
  
      @SuppressWarnings("deprecation")
      private String uploadFile() {
          String responseString = null;
  
          HttpClient httpclient = new DefaultHttpClient();
          HttpPost httppost = new HttpPost(Config.FILE_UPLOAD_URL);
  
          try {
              AndroidMultiPartEntity entity = new AndroidMultiPartEntity(
                      new ProgressListener() {
  
                          @Override
                          public void transferred(long num) {
                              publishProgress((int) ((num / (float) totalSize) * 100));
                          }
                      });
  
              File sourceFile = new File(filePath);
  
              // Adding file data to http body
              entity.addPart("image", new FileBody(sourceFile));
  </code></pre>
  
  <p>Here is Logcat:</p>
  
  <pre><code>E/MainActivity: Response from server: java.io.FileNotFoundException: /mnt/sdcard/Pictures/master/IMG_20170127_152930.jpg: open failed: ENOENT (No such file or directory)
  </code></pre>