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


이러면 전송 후 이미지뷰가 깨끗해집니다. 이미지가 계속 남아있으면 다음 요청시에 에러가 발생할 수 있기 때문입니다.

+ Recent posts