[英]Upload Image from gallery to server in android
我正在創建一個 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("abc@gmail.com"));
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();
}
}
從畫廊上傳工作需要進行哪些更改
我的應用程序現在正在運行。 我對我的代碼進行了以下更改。
在活動結果部分
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;
}
現在我可以從畫廊和相機上傳
請檢查清單中的權限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
希望這可以幫助。:)
OkHttpClient 客戶端 = new OkHttpClient();
RequestBody requestBody = new MultipartBody.Builder().setType(MultipartBody.FORM)
.addFormDataPart("SessionId", "")
.addFormDataPart("UserDeviceGuid", "")
.addFormDataPart("UserPhoto", "photo.png", RequestBody.create(MEDIA_TYPE_PNG, new File(path)))
.build();
serverURL = serverURL + "/FileUpload/UserPhotoUpload";
Request request = new Request.Builder().url(serverURL).post(requestBody).build();
try {
Response response = client.newCall(request).execute();
String strResponse = response.body().string();
Log.d("upload image", "Response" + strResponse);
if (!response.isSuccessful()) {
} else {
JSONObject jsonResponse = null;
try {
jsonResponse = new JSONObject(strResponse);
} catch (JSONException e) {
e.printStackTrace();
}
if (jsonResponse != null && jsonResponse.has("Success") && jsonResponse.getBoolean("Success")) {
isSuccess = true;
}
}
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
獲取改造對象 if (retrofit == null) { retrofit = new retrofit2.Retrofit.Builder() .baseUrl(BASE_URL) .addConverterFactory(GsonConverterFactory.create()) .build(); } 返回改造;
接口@GET("/photos") 調用<List> getAllPhotos();
獲取 galary 圖像路徑私有上下文上下文;
/* 獲取uri相關內容真實本地文件路徑。 */ public String getUriRealPath(Context ctx, Uri uri, int type) { this.context = ctx;
String ret = ""; if (isAboveKitKat()) { // Android OS above sdk version 19. ret = getUriRealPathAboveKitkat(ctx, uri, type); } else { // Android OS below sdk version 19 ret = getImageRealPath(context.getContentResolver(), uri, null); } return ret;
}
public Uri getImageUri(Context context, Bitmap bitmap) { try { ByteArrayOutputStream baos = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos); String path = MediaStore.Images.Media.insertImage(context.getContentResolver(), bitmap, "img", null); 返回 Uri.parse(path); } catch (IllegalArgumentException e) { } catch (Exception e) { } return null; }
@TargetApi(Build.VERSION_CODES.KITKAT) private String getUriRealPathAboveKitkat(Context ctx, Uri uri, int type) { String ret = "";
if (ctx != null && uri != null) { if (type == 1) { if (isFileUri(uri)) { ret = uri.getPath(); } else if (isDocumentUri(ctx, uri)) { ret = getPath(uri); } else if (isGooglePhotoDoc(uri.getAuthority())) { ret = uri.getLastPathSegment(); } else if (uri.toString().startsWith("content://com.google.android.apps.photos.contentprovider")){ try { InputStream inputStream = context.getContentResolver().openInputStream(uri); // context needed File photoFile = createTemporalFileFrom(inputStream); ret = photoFile.getPath(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } else if (isContentUri(uri)) { if (isGooglePhotoDoc(uri.getAuthority())) { ret = uri.getLastPathSegment(); } else if (uri.toString().startsWith("content://com.google.android.apps.photos.contentprovider")){ try { InputStream inputStream = context.getContentResolver().openInputStream(uri); // context needed File photoFile = createTemporalFileFrom(inputStream); ret = photoFile.getPath(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } else if (uri.toString().startsWith("content://com.google.android.apps.photos.content")){ try { InputStream is = context.getContentResolver().openInputStream(uri); if (is != null) { Bitmap pictureBitmap = BitmapFactory.decodeStream(is); ret = getImageUri(context, pictureBitmap).toString(); } } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } else { ret = getImageRealPath(context.getContentResolver(), uri, null); } } else if (isFileUri(uri)) { ret = uri.getPath(); } else if (isDocumentUri(ctx, uri)) { ret = getPath(uri); } } return ret;
}
私有文件 createTemporalFileFrom(InputStream inputStream) 拋出 IOException { File targetFile = null;
if (inputStream != null) { int read; byte[] buffer = new byte[8 * 1024]; targetFile = createTemporalFile(); OutputStream outputStream = new FileOutputStream(targetFile); while ((read = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, read); } outputStream.flush(); try { outputStream.close(); } catch (IOException e) { e.printStackTrace(); } } return targetFile;
}
私有文件 createTemporalFile() { return new File(context.getExternalCacheDir(), "tempFile.jpg"); // 需要上下文 }
@RequiresApi(api = Build.VERSION_CODES.KITKAT) private String getPath(Uri uri) { String ret = "";
// Get uri related document id. String documentId = DocumentsContract.getDocumentId(uri); // Get uri authority. String uriAuthority = uri.getAuthority(); if (isMediaDoc(uriAuthority)) { String idArr[] = documentId.split(":"); if (idArr.length == 2) { // First item is document type. String docType = idArr[0]; // Second item is document real id. String realDocId = idArr[1]; // Get content uri by document type. Uri mediaContentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; if ("image".equals(docType)) { mediaContentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; } else if ("video".equals(docType)) { mediaContentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI; } else if ("audio".equals(docType)) { mediaContentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; } // Get where clause with real document id. String whereClause = MediaStore.Images.Media._ID + " = " + realDocId; ret = getImageRealPath(context.getContentResolver(), mediaContentUri, whereClause); } } else if (isDownloadDoc(uriAuthority)) { // Build download uri. Uri downloadUri = Uri.parse("content://downloads/public_downloads"); // Append download document id at uri end. Uri downloadUriAppendId = ContentUris.withAppendedId(downloadUri, Long.valueOf(documentId)); ret = getImageRealPath(context.getContentResolver(), downloadUriAppendId, null); } else if (isExternalStoreDoc(uriAuthority)) { String idArr[] = documentId.split(":"); if (idArr.length == 2) { String type = idArr[0]; String realDocId = idArr[1]; if ("primary".equalsIgnoreCase(type)) { ret = Environment.getExternalStorageDirectory() + "/" + realDocId; } } } return ret;
}
/* 檢查當前 android os 版本是否大於 kitkat。 */ private boolean isAboveKitKat() { boolean ret = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT; 返回 ret; }
/* 檢查這個 uri 是否代表一個文檔。 */ @TargetApi(Build.VERSION_CODES.KITKAT) private boolean isDocumentUri(Context ctx, Uri uri) { boolean ret = false; if (ctx != null && uri != null) { ret = DocumentsContract.isDocumentUri(ctx, uri); 返回 ret; }
/* 檢查這個 uri 是否是內容 uri。
/* 檢查這個 uri 是否是一個文件 uri。
/* 檢查此文檔是否由 ExternalStorageProvider 提供。 */ private boolean isExternalStoreDoc(String uriAuthority) { boolean ret = false;
if ("com.android.externalstorage.documents".equals(uriAuthority)) { ret = true; } return ret;
}
/* 檢查此文檔是否由 DownloadsProvider 提供。 */ private boolean isDownloadDoc(String uriAuthority) { boolean ret = false;
if ("com.android.providers.downloads.documents".equals(uriAuthority)) { ret = true; } return ret;
}
/* 檢查此文檔是否由 MediaProvider 提供。 */ private boolean isMediaDoc(String uriAuthority) { boolean ret = false;
if ("com.android.providers.media.documents".equals(uriAuthority)) { ret = true; } return ret;
}
/* 檢查此文檔是否由 google 照片提供。 */ private boolean isGooglePhotoDoc(String uriAuthority) { boolean ret = false;
if ("com.google.android.apps.photos.content".equals(uriAuthority)) { ret = true; } return ret;
}
/* 返回 uri 表示的文檔文件真實本地路徑。*/ public String getImageRealPath(ContentResolver contentResolver, Uri uri, String whereClause) { String ret = "";
// Query the uri with condition. Cursor cursor = contentResolver.query(uri, null, whereClause, null, null); if (cursor != null) { boolean moveToFirst = cursor.moveToFirst(); if (moveToFirst) { // Get columns name by uri type. String columnName = MediaStore.Images.Media.DATA; if (uri == MediaStore.Images.Media.EXTERNAL_CONTENT_URI) { columnName = MediaStore.Images.Media.DATA; } else if (uri == MediaStore.Audio.Media.EXTERNAL_CONTENT_URI) { columnName = MediaStore.Audio.Media.DATA; } else if (uri == MediaStore.Video.Media.EXTERNAL_CONTENT_URI) { columnName = MediaStore.Video.Media.DATA; } // Get column index. int imageColumnIndex = cursor.getColumnIndex(columnName); // Get column value which is the uri related file local path. ret = cursor.getString(imageColumnIndex); } } if (cursor != null){ cursor.close(); } return ret;
}
下面的代碼從圖庫中獲取圖像並在圖像視圖中顯示
@Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); switch (requestCode) { case 1111: if (resultCode == Activity.RESULT_OK) { if (data != null) { Uri selectedImage = data.getData(); if (selectedImage == null) { Bitmap bitmap = (Bitmap) data.getExtras().get("data");
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
String name = "" + System.currentTimeMillis();
String path = MediaStore.Images.Media.insertImage(getContentResolver(), bitmap, name, null);
selectedImage = Uri.parse(path);
}
if (selectedImage != null) {
adapter.dataList.get(index).setUri(selectedImage);
adapter.notifyDataSetChanged();
gotoUploadImage(selectedImage);
}
}
}
break;
}
}
下面的代碼是從網絡服務器獲取列表
GetDataService 服務 = RetrofitClientInstance.getRetrofitInstance().create(GetDataService.class);
Call<List<RetroPhoto>> call = service.getAllPhotos();
call.enqueue(new Callback<List<RetroPhoto>>() {
@Override
public void onResponse(Call<List<RetroPhoto>> call, Response<List<RetroPhoto>> response) {
progressDoalog.dismiss();
generateDataList(response.body());
}
@Override
public void onFailure(Call<List<RetroPhoto>> call, Throwable t) {
progressDoalog.dismiss();
Toast.makeText(HomeScreenActivity.this, "Something went wrong...Please try later!", Toast.LENGTH_SHORT).show();
}
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.