2017-02-27 208 views
1

我正在創建一個android應用程序。我需要實現一個代碼,用於從圖庫或從相機捕獲上傳配置文件圖片。單擊要上傳圖片的部分時會顯示一條提示。它由三個選項之一,從攝像頭捕捉到,一當我嘗試從畫廊上傳圖片我得到這個錯誤,從畫廊拿,從相機買一到cancel.I可以成功 圖像捕獲從圖庫中上傳圖片到服務器在android

E/MainActivity:java.io.FileNotFoundException:從服務器響應/storage/emulated/0/Pictures/Upload/IMG_20170227_142713.jpg(沒有這樣的文件或目錄)

這是我用來警報生成器的代碼顯示選項,並打開圖庫或啓動相機

//code to choose profile pic 
    iv.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      /*Toast.makeText(getApplicationContext(), 
        "Please choose a photo", Toast.LENGTH_LONG) 
        .show();*/ 
      final CharSequence[] items = { "Take Photo", "Choose from Library", 
        "Cancel" }; 

      AlertDialog.Builder builder = new AlertDialog.Builder(LeftMenusMediaActivity.this); 
      builder.setTitle("Add Photo!"); 
      builder.setItems(items,new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int item) { 


        if (items[item].equals("Take Photo")) { 

         //define the file-name to save photo taken by Camera activity 
         String fileName = "new-photo-name.jpg"; 
         //create parameters for Intent with filename 
         ContentValues values = new ContentValues(); 
         values.put(MediaStore.Images.Media.TITLE, fileName); 
         values.put(MediaStore.Images.Media.DESCRIPTION,"Image captured by camera"); 
         //imageUri is the current activity attribute, define and save it for later usage (also in onSaveInstanceState) 
         imageUri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); 
         //create new Intent 
         Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
         imageUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE); 

         intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); 

         intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1); 
         startActivityForResult(intent, PICK_Camera_IMAGE); 




        } else if (items[item].equals("Choose from Library")) { 


         try { 
          Intent gintent = new Intent(); 
          gintent.setType("image/*"); 
          gintent.setAction(Intent.ACTION_GET_CONTENT); 

          startActivityForResult(
            Intent.createChooser(gintent, "Select Picture"), 
            PICK_IMAGE); 
         } catch (Exception e) { 
          Toast.makeText(getApplicationContext(), 
            e.getMessage(), 
            Toast.LENGTH_LONG).show(); 
          Log.e(e.getClass().getName(), e.getMessage(), e); 
         } 



        } else if (items[item].equals("Cancel")) { 
         dialog.dismiss(); 
        } 
       } 
      }); 
      builder.show(); 
     } 
    }); 

這是我onActivity結果函數

@Override 

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    selectedImageUri = null; 
    String filePath = null; 
    switch (requestCode) { 
     case PICK_IMAGE: 
      if (resultCode == Activity.RESULT_OK) { 
       selectedImageUri = data.getData(); 
       // getPath(selectedImageUri); 
       launchUploadActivity(true); 
       Toast.makeText(this, selectedImageUri.toString(), Toast.LENGTH_SHORT).show(); 
      } 
      break; 
     case PICK_Camera_IMAGE: 
      if (resultCode == RESULT_OK) { 
       //use imageUri here to access the image 
       selectedImageUri = imageUri; 
       launchUploadActivity(true); 
        /*Bitmap mPic = (Bitmap) data.getExtras().get("data"); 
        selectedImageUri = Uri.parse(MediaStore.Images.Media.insertImage(getContentResolver(), mPic, getResources().getString(R.string.app_name), Long.toString(System.currentTimeMillis())));*/ 
      } else if (resultCode == RESULT_CANCELED) { 
       Toast.makeText(this, "Picture was not taken", Toast.LENGTH_SHORT).show(); 
      } else { 
       Toast.makeText(this, "Picture was not taken", Toast.LENGTH_SHORT).show(); 
      } 
      break; 
    } 

這是我的功能推出上載活動

private void launchUploadActivity(boolean isImage){ 
    Intent i = new Intent(LeftMenusMediaActivity.this, UploadActivity.class); 
    i.putExtra("filePath", selectedImageUri.getPath()); 
    i.putExtra("isImage", isImage); 
    startActivity(i); 
} 

這在我的上傳活動類

public class UploadActivity extends Activity { 
// LogCat tag 
private static final String TAG = MainActivity.class.getSimpleName(); 


private String filePath = null; 

long totalSize = 0; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    // Changing action bar background color 
/*  getActionBar().setBackgroundDrawable(
      new ColorDrawable(Color.parseColor(getResources().getString(
        R.color.action_bar))));*/ 

    // Receiving the data from previous activity 
    Intent i = getIntent(); 

    // image or video path that is captured in previous activity 
    filePath = i.getStringExtra("filePath"); 

    // boolean flag to identify the media type, image or video 
    boolean isImage = i.getBooleanExtra("isImage", true); 

    if (filePath != null) { 
     // Displaying the image or video on the screen 
     //previewMedia(isImage); 
     new UploadFileToServer().execute(); 
    } else { 
     Toast.makeText(getApplicationContext(), 
       "Sorry, file path is missing!", Toast.LENGTH_LONG).show(); 
    } 



} 

/** 
* Uploading the file to server 
* */ 
private class UploadFileToServer extends AsyncTask<Void, Integer, String> { 
    @Override 
    protected void onPreExecute() { 
     // setting progress bar to zero 
    // progressBar.setProgress(0); 
     super.onPreExecute(); 
    } 

    @Override 
    protected String doInBackground(Void... params) { 
     return uploadFile(); 
    } 

    @SuppressWarnings("deprecation") 
    private String uploadFile() { 
     String responseString = null; 

     HttpClient httpclient = new DefaultHttpClient(); 
     HttpPost httppost = new HttpPost(AppConfig.URL_PHOTO); 

     try { 
      AndroidMultiPartEntity entity = new AndroidMultiPartEntity(
        new AndroidMultiPartEntity.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)); 

      // Extra parameters if you want to pass to server 
      entity.addPart("website", 
        new StringBody("www.androidhive.info")); 
      entity.addPart("email", new StringBody("[email protected]")); 

      totalSize = entity.getContentLength(); 
      httppost.setEntity(entity); 

      // Making server call 

      HttpResponse response = httpclient.execute(httppost); 

      HttpEntity r_entity = response.getEntity(); 

      int statusCode = response.getStatusLine().getStatusCode(); 

      if (statusCode == 200) { 
       // Server response 

       responseString = EntityUtils.toString(r_entity); 

      } else { 
       responseString = "Error occurred! Http Status Code: " 
         + statusCode; 
      } 

     } catch (ClientProtocolException e) { 
      responseString = e.toString(); 
     } catch (IOException e) { 
      responseString = e.toString(); 
     } 

     return responseString; 

    } 

    @Override 
    protected void onPostExecute(String result) { 
     Log.e(TAG, "Response from server: " + result); 

     // showing the server response in an alert dialog 
     showAlert(result); 

     super.onPostExecute(result); 

    } 

} 

/** 
* Method to show alert dialog 
* */ 
private void showAlert(String message) { 
    AlertDialog.Builder builder = new AlertDialog.Builder(this); 
    builder.setMessage(message).setTitle("Response from Servers") 
      .setCancelable(false) 
      .setPositiveButton("OK", new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int id) { 
        // do nothing 
       } 
      }); 
    AlertDialog alert = builder.create(); 
    alert.show(); 
} 

}

什麼是需要的變化使從畫廊上傳工作

+0

請參考以下鏈接它會幫助http://stackoverflow.com/questions/28000218/java-io-filenotfoundexception-when-uploading-pics-from -camera-using-http-post-mu –

+0

可能應該嘗試上傳位圖而不是傳遞文件路徑,因爲Web服務正在檢測文件,並且您提供了一個字符串 –

+0

'來自服務器的響應:java.io.FileNotFoundException: /storage/emulated/0/Pictures/Upload/IMG_20170227_142713.jpg(沒有這樣的文件或目錄)'。這是來自服務器的非常奇怪的迴應!首先:爲什麼服務器應該知道Android設備上文件的路徑?其次:哪個服務器會嘗試打開Android設備上的文件? – greenapps

回答

1

我的應用程序正在工作。我對我的代碼進行了以下更改。

上的活動導致部分

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    selectedImageUri = null; 

    switch (requestCode) { 
     case PICK_IMAGE: 
      if (resultCode == Activity.RESULT_OK) { 
       selectedImageUri = data.getData(); 
       imagepath = getPath(selectedImageUri); 


       launchUploadActivity2(true); 
       Bitmap bitmap=BitmapFactory.decodeFile(imagepath); 
       iv.setImageBitmap(bitmap); 


       Toast.makeText(this, selectedImageUri.toString(), Toast.LENGTH_SHORT).show(); 
      } 
      break; 
     case PICK_Camera_IMAGE: 
      if (resultCode == RESULT_OK) { 
       //use imageUri here to access the image 
       selectedImageUri = imageUri; 
       imagepath2=selectedImageUri.getPath(); 
       launchUploadActivity(true); 
       Bitmap bitmap=BitmapFactory.decodeFile(imagepath2); 
       iv.setImageBitmap(bitmap); 
       Log.d(TAG,selectedImageUri.toString()); 
       Toast.makeText(this, selectedImageUri.toString(), Toast.LENGTH_SHORT).show(); 

      } else if (resultCode == RESULT_CANCELED) { 
       Toast.makeText(this, "Picture was not taken", Toast.LENGTH_SHORT).show(); 
      } else { 
       Toast.makeText(this, "Picture was not taken", Toast.LENGTH_SHORT).show(); 
      } 
      break; 
    } 

我做了兩個單獨的函數用於啓動上傳活動。 功能用於啓動上傳活動課從畫廊上傳圖像到服務器是這個

private void launchUploadActivity2(boolean isImage){ 

    filePath=imagepath; 
    if (filePath != null) { 
     // Displaying the image or video on the screen 
     //previewMedia(isImage); 
     new UploadImageToServer1().execute(); 
    } else { 
     Toast.makeText(getApplicationContext(), 
       "Sorry, file path is missing!", Toast.LENGTH_LONG).show(); 
    } 
} 

功能上載活動類通過捕獲到服務器上傳圖像

private void launchUploadActivity(boolean isImage){ 

    filePath=selectedImageUri.getPath(); 
    if (filePath != null) { 
     // Displaying the image or video on the screen 
     //previewMedia(isImage); 
     new UploadImageToServer().execute(); 
    } else { 
     Toast.makeText(getApplicationContext(), 
       "Sorry, file path is missing!", Toast.LENGTH_LONG).show(); 
    } 
} 

上傳活動類

private class UploadImageToServer extends AsyncTask<Void, Integer, String> { 
    @Override 
    protected void onPreExecute() { 
     // setting progress bar to zero 
     // progressBar.setProgress(0); 
     super.onPreExecute(); 
    } 

    @Override 
    protected String doInBackground(Void... params) { 
     return uploadFile(); 
    } 

    @SuppressWarnings("deprecation") 
    private String uploadFile() { 
     String responseString = null; 

     HttpClient httpclient = new DefaultHttpClient(); 
     HttpPost httppost = new HttpPost(AppConfig.URL_PHOTO); 

     try { 
      AndroidMultiPartEntity entity = new AndroidMultiPartEntity(
        new AndroidMultiPartEntity.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)); 

      // Extra parameters if you want to pass to server 
      entity.addPart("userid", 
        new StringBody(session.getuid())); 


      totalSize = entity.getContentLength(); 
      httppost.setEntity(entity); 

      // Making server call 

      HttpResponse response = httpclient.execute(httppost); 

      HttpEntity r_entity = response.getEntity(); 

      int statusCode = response.getStatusLine().getStatusCode(); 

      if (statusCode == 200) { 
       // Server response 

       responseString = EntityUtils.toString(r_entity); 

      } else { 
       responseString = "Error occurred! Http Status Code: " 
         + statusCode; 
      } 

     } catch (ClientProtocolException e) { 
      responseString = e.toString(); 
     } catch (IOException e) { 
      responseString = e.toString(); 
     } 

     return responseString; 

    } 

    @Override 
    protected void onPostExecute(String result) { 
     Log.e(TAG, "Response from server: " + result); 

     // showing the server response in an alert dialog 


     super.onPostExecute(result); 

    } 




} 

這是在捕捉圖像時創建特定文件夾路徑的功能

/** 
* Creating file uri to store image/video 
*/ 
public Uri getOutputMediaFileUri(int type) { 
    return Uri.fromFile(getOutputMediaFile(type)); 
} 

/** 
* returning image/video 
*/ 
private static File getOutputMediaFile(int type) { 

    // External sdcard location 
    File mediaStorageDir = new File(
      Environment 
        .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), 
      AppConfig.IMAGE_DIRECTORY_NAME); 

    // Create the storage directory if it does not exist 
    if (!mediaStorageDir.exists()) { 
     if (!mediaStorageDir.mkdirs()) { 
      Log.d(TAG, "Oops! Failed create " 
        + AppConfig.IMAGE_DIRECTORY_NAME + " directory"); 
      return null; 
     } 
    } 

    // Create a media file name 
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", 
      Locale.getDefault()).format(new Date()); 
    File mediaFile; 
    if (type == MEDIA_TYPE_IMAGE) { 
     mediaFile = new File(mediaStorageDir.getPath() + File.separator 
       + "IMG_" + timeStamp + ".jpg"); 
    } else if (type == MEDIA_TYPE_VIDEO) { 
     mediaFile = new File(mediaStorageDir.getPath() + File.separator 
       + "VID_" + timeStamp + ".mp4"); 
    } else { 
     return null; 
    } 

    return mediaFile; 
} 

現在我可以從兩個畫廊和相機上傳

1

請檢查清單

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

希望這有助於權限。:)

+0

我已經包含它我的Android清單文件。這不是問題 – user1810

+0

試試這個http://stackoverflow.com/questions/28000218/java-io-filenotfoundexception-when-uploading-pics-from-camera-using-http-post-mu –

+0

你提供的鏈接是上傳通過從相機捕捉圖像。這對我來說工作得很好。我需要將代碼從圖庫上傳到服務器的代碼 – user1810