0

Я пытаюсь загрузить рис из моего устройства в server.Uploading ПОС из галереи работает нормально, но загрузка ПИК из камеры дает ошибкуjava.io.FileNotFoundException при загрузке фото с камеры с помощью HTTP Post MultipartEntity

java.io.FileNotFoundException: /storage/emulated/0/1421501712960.jpg: open failed: ENOENT (No such file or directory) 

Я использую следующий код для загрузки картинки с камеры. Я прокомментировал другие пути, которые я пробовал.

if (requestCode == REQUEST_CAMERA) 
       { 
        File f = new File(Environment.getExternalStorageDirectory() 
          .toString()); 

        for (File temp : f.listFiles()) 
        { 
         if (temp.getName().equals("temp.jpg")) 
         { 
          f = temp; 
          break; 
         } 
        } 
        try { 
         Bitmap bm; 
         BitmapFactory.Options btmapOptions = new BitmapFactory.Options(); 

         bm = BitmapFactory.decodeFile(f.getAbsolutePath(), 
           btmapOptions); 

         String path =android.os.Environment 
           .getExternalStorageDirectory().getPath(); 

         /*String path = android.os.Environment 
           .getExternalStorageDirectory() 
           + File.separator 
           + "Phoenix" + File.separator + "default";*/ 



/*    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", 
          Locale.getDefault()).format(new Date()); 
        String path = android.os.Environment 
          .getExternalStorageDirectory() 
          + File.separator 
          + "IMG_" + timeStamp + ".jpg";*/ 



         f.delete(); 

         File file = new File(path, String.valueOf(System 
           .currentTimeMillis()) + ".jpg"); 
         new UpdateProfilePicApi().execute(file.getPath()); 


        } catch (Exception e) { 
         e.printStackTrace(); 
        } 



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

      String lOutput=""; 

      @Override 
      public String doInBackground(String... realPath) 
      { 


       try { 
        File file = new File(realPath[0]); 
        HttpClient mHttpClient = new DefaultHttpClient(); 
        HttpPost mHttpPost = new HttpPost(XYZ.URL); 
        mHttpPost.addHeader("X-MZ-Token", mSettingsManager.getAccessToken()); 

        MultipartEntity entity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE); 
        entity.addPart("albumId", new StringBody(mHomeActivity.getVideoOption("album_id"))); 
        entity.addPart("caption", new StringBody("photo")); 
        entity.addPart("socialType", new StringBody("sharedAlbum")); 
        entity.addPart("pic", new FileBody(file)); 
        mHttpPost.setEntity(entity); 

        HttpResponse response = mHttpClient.execute(mHttpPost); 

        lOutput = ""+response.getStatusLine().getStatusCode(); 

       } catch (Exception e) { 

        lOutput = e.toString(); 

       } 
       return ""; 
      } 

      @Override 
      public void onPostExecute(String result) 
      { 
       mProgressDialog.setVisibility(View.GONE); 
       sharedPicsAdapter.notifyDataSetChanged(); 
       Toast.makeText(getActivity().getApplicationContext(),lOutput,Toast.LENGTH_LONG).show(); 
       Log.e("loutput",lOutput); 

      } 

      @Override 
      public void onPreExecute() 
      { 
       mProgressDialog.setVisibility(View.VISIBLE); 
      } 
     } 
+0

Что делает ваш код: вы пытаетесь найти 'temp.jpg', и если вы его найдете, вы абсолютно ничего не делаете с ним, кроме его удаления. Затем вы пытаетесь загрузить файл с именем ' .jpg'. Имейте в виду, что время отличается от того, когда вы просили изображение и когда вы получили ответ от приложения камеры. –

+0

@EugenPechanec Можете ли вы отправить сообщение в ответ, какой должен быть мой код? –

+0

Не без какого-то поиска. Я думаю, что есть способ указать имя файла в намерении захвата изображения, но я не уверен. Я отправлю еще одно решение, которое будет работать для меня. –

ответ

1

Excepstion говорит, что файл Donot существует по указанному пути

иметь чек на пути к файлу

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (requestCode == CAMERA_REQUEST && resultCode == RESULT_OK) { 
     Bitmap photo = (Bitmap) data.getExtras().get("data"); 

     ByteArrayOutputStream bytes = new ByteArrayOutputStream(); 
     photo.compress(Bitmap.CompressFormat.JPEG, 40, bytes); 

     //you can create a new file name "test.jpg" in sdcard folder. 
     File f = new File(Environment.getExternalStorageDirectory() 
           + File.separator + "test.jpg"); 
     try { 

      f.createNewFile(); 
      //write the bytes in file 
      FileOutputStream fo = new FileOutputStream(f); 
      fo.write(bytes.toByteArray()); 
      // remember close de FileOutput 
      fo.close(); 

     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     if (f.exists()) { 

      Toast.makeText(this, "Image Found : "+f.getAbsolutePath().toString(), Toast.LENGTH_SHORT).show(); 
      new UpdateProfilePicApi().execute(f.getAbsolutePath().toString()); 
     }else{ 
       Toast.makeText(this, "Image Not Found", Toast.LENGTH_SHORT).show(); 
     } 


    } 
} 

и ваши намерения

Intent cameraIntent = new Intent(
        android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
      startActivityForResult(cameraIntent, CAMERA_REQUEST); 
0

Проблема заключается в том, что System.currentTimeMillis() быстро меняется, поэтому вы просите вход камеры и получаете образ отличается, и вы не можете найти файл (и это только если вы заранее указали имя файла).

Я могу рекомендовать только чтение и использование documentation for obtaining a full-sized image from camera. Единственное отличие состоит в том, что вместо getExternalStoragePublicDirectory() вы бы использовали getExternalFilesDir(), потому что вы не хотите, чтобы изображение было общедоступным. Если вы следуете руководству, путь к нему будет сохранен в String mCurrentPhotoPath;, чтобы вы могли загрузить его и легко удалить.