1. 준비물
기본적인 구조는 다음과 같습니다.
@Override public void onClick(View view) { if (returnUri != null) { if (!mEditTextdialogOpenField.getText().toString().equals("")) { } else { Snackbar.make(getView(), "You have to say any words", Snackbar.LENGTH_LONG).show(); } } else { Snackbar.make(getView(), "You have to get any image from gallery", Snackbar.LENGTH_LONG).show(); } } | cs |
if 구문에 Snackbar를 등록한 형태입니다. 이제 이 안을 채울 것입니다. Dialog로부터 입력받은 텍스트가 존재하면 실행되는 구문입니다. 그렇지 않다면 Snackbar로 에러를 표시합니다.
2. 내용물
Bitmap bitmap = null; try { bitmap = getBitmapFromUri(returnUri); } catch (IOException e) { e.printStackTrace(); } | cs |
이 것으로 비트맵을 가져옵니다. uri를 통해 비트맵을 열 수 있습니다. 비트맵은 그림파일이라고 생각하시면 됩니다.
File imageFile = null; try { imageFile = createFileFromBitmap(bitmap); } catch (IOException e) { e.printStackTrace(); } | cs |
여기는 파일을 가져오는 부분을 구현했습니다. 이 파일을 이제 비동기통신으로 연결하겠습니다.
가져온 텍스트를 Retrofit에 실어주는 부분입니다. okHttpClient를 사용할 때엔 builder를 호출해서 생성해야 합니다. 그리고 interceptor()를 builder에서 호출하여 현재 activity의 view.getContext() 속성을 넣어줍니다.
String givenText = mEditTextdialogOpenField.getText().toString(); OkHttpClient client = new OkHttpClient(); OkHttpClient.Builder builder = new OkHttpClient.Builder(); builder.interceptors().add(new AddCookiesInterceptor(view.getContext())); client = builder.build(); Retrofit retrofit = new Retrofit.Builder() .client(client) .addConverterFactory(GsonConverterFactory.create()) .baseUrl(Constants.BASE_URL) .build(); | cs |
okHttpClient의 구현 방법에 주의하시기 바랍니다.
사전에 만들어 놓은 api 서비스가 있습니다. 이 api 서비스를 이용해서 사진을 다루겠습니다.
PostApiService postApiService = retrofit.create(PostApiService.class); RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), imageFile); MultipartBody.Part body = MultipartBody.Part.createFormData("image", makeImageFileName(), requestFile); | cs |
좌표는 int혹은 string으로 다뤄질 수 있습니다. 이번엔 String 변수에 담겠습니다. 사용하실 때 편한 방법으로 값을 저장해두면 불러오거나 다시 저장할 때 유용합니다.
ReferSharedPreference preferenceCoordinates = new ReferSharedPreference(getContext()); final String lat = preferenceCoordinates.getValue("Lat", "13"); final String lon = preferenceCoordinates.getValue("Lon", "15"); String pointString = "{ \"longitude\": \""+lon+"\", \"latitude\": \""+lat+"\" } "; | cs |
Request할 Body 부분을 구현합니다. http통신이므로 request가 존재합니다.
RequestBody coordinatePoint = RequestBody.create( MediaType.parse("multipart/form-data"), pointString); RequestBody textToPost = RequestBody.create( MediaType.parse("multipart/form-data"), givenText); | cs |
이제 Retrofit를 이용해서 Call을 구현하면 됩니다. call은 서버에 요청하는 과정입니다.
Call<ResponseBody> call = postApiService.uploadFile(body, coordinatePoint, textToPost); call.enqueue(new Callback<ResponseBody>() { @Override public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) { Snackbar.make(getView(), "Success, posted at \n" + lat + " , " + lon , Snackbar.LENGTH_LONG).show(); } @Override public void onFailure(Call<ResponseBody> call, Throwable t) { } }); | cs |
그 다음 ImageView를 정리합니다.
mImageview.setImageBitmap(null); returnUri = null; mEditTextdialogOpenField.setText(""); | cs |
이러면 전송 후 이미지뷰가 깨끗해집니다. 이미지가 계속 남아있으면 다음 요청시에 에러가 발생할 수 있기 때문입니다.
'Java' 카테고리의 다른 글
[android] 이미지 갤러리 그 외 사용방법 (0) | 2018.02.03 |
---|---|
[android] 이미지 갤러리 (0) | 2018.02.03 |
[android] Activity 구현 팁 (1) | 2018.02.03 |
[android] 경과한 시간에 따른 날짜 표현 방식 (0) | 2018.02.03 |
[android] Glide와 intent 사용하기 (0) | 2018.02.03 |