본문 바로가기
안드로이드 자바

[JAVA][Android] Volley+를 이용해서 이미지 파일 값을 보내고 응답받기

by teamnova 2022. 1. 29.
728x90

안녕하세요? 이번 시간에는 안드로이드 http 통신 라이브러리 중 하나인 volley +를 이용하여

서버에 이미지 파일을 보내보고 파일 이 서버에 제대로 보내졌는지

다이얼로그로 보낸 파일 값을 에뮬레이터에 표출해 보겠습니다

 

 

 

volley +  를 사용하기위하여 gradle 에 추가하여주세요

 

 

매니페스트에 http 통신을 위한 인터넷권한 과 저장소 읽기, 쓰기 권한 http 프로토콜 접속 제한을 풀어줍니다

 

xml 코드

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">


    <ImageView
        android:id="@+id/imageView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:srcCompat="@drawable/ic_launcher_foreground" />

    <Button
        android:id="@+id/upload_bt"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="전송"/>

</LinearLayout>

 

 

java 코드 

 

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "Cannot invoke method length() on null object";


    ImageView imageView; // 이미지 뷰
    Button upload_bt;  //서버업로드 버튼
    View.OnClickListener clickListener; //클릭리스너
    private ActivityResultLauncher<Intent> resultLauncher;   //콜백함수
    String imagePath; //절대경로를 담는변수

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

        imageView = findViewById(R.id.imageView);
        upload_bt = findViewById(R.id.upload_bt);

        //외부 저장소에 권한을준다.
        int permissionResult= checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE);
        if(permissionResult== PackageManager.PERMISSION_DENIED){
            String[] permissions= new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE};
            requestPermissions(permissions,10);
        }

        //클릭이벤트
        clickListener = new View.OnClickListener() {
            @SuppressLint("NonConstantResourceId")
            @Override
            public void onClick(View v) {
                switch (v.getId()) {
                    //이미지 클릭시 앨범으로 이동
                    case R.id.imageView:
                        @SuppressLint("IntentReset") Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Audio.Media.EXTERNAL_CONTENT_URI);
                        intent.setType("image/*");
                        resultLauncher.launch(intent);

                        break;
                    //서버에 이미지 업로드
                    case R.id.upload_bt:

                        String url = "http://X.XX.XX.XXX/";
                        SimpleMultiPartRequest smpr = new SimpleMultiPartRequest(Request.Method.POST, url, new Response.Listener<String>() {
                            @Override
                            public void onResponse(String response) {
                                new AlertDialog.Builder(MainActivity.this).setMessage("응답:" + response).create().show();
                            }
                        }, new Response.ErrorListener() {
                            @Override
                            public void onErrorResponse(VolleyError error) {
                                Toast.makeText(MainActivity.this, "ERROR", Toast.LENGTH_SHORT).show();
                            }
                        });
                        //절대경로로 값을 넣어준다.
                        smpr.addFile("image", imagePath);

                        //서버로 보낼 객체
                        RequestQueue requestQueue= Volley.newRequestQueue(MainActivity.this);
                        requestQueue.add(smpr);

                        break;
                }
            }
        };
        imageView.setOnClickListener(clickListener);
        upload_bt.setOnClickListener(clickListener);


        //콜백함수
        resultLauncher = registerForActivityResult(
                new ActivityResultContracts.StartActivityForResult(),
                new ActivityResultCallback<ActivityResult>() {
                    @Override
                    public void onActivityResult(ActivityResult result) {
                        if (result.getResultCode() == Activity.RESULT_OK) {
                            Intent i = result.getData();
                            Uri uri = i.getData();
                            //받은경로 값을 이미지뷰에 set 해서 띄워준다
                            imageView.setImageURI(uri);
                            //string 변수에 절대경로를 저장
                            imagePath = getRealPathFromUri(uri);
                        }
                    }
                }
        );

    }

    //이미지 주소를 절대경로로 바꿔주는 메소드
    String getRealPathFromUri(Uri uri) {
        String[] proj = {MediaStore.Images.Media.DATA};
        CursorLoader loader = new CursorLoader(this, uri, proj, null, null, null);
        Cursor cursor = loader.loadInBackground();
        assert cursor != null;
        int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        String result = cursor.getString(column_index);
        cursor.close();
        return result;
    }


}

 

php 코드

 

<?php 

$image = $_FILES["image"];

var_dump($image);

?>

 

 

이미지 값을 var_dump로 출력하고 서버에서 제대로 받았는지를 안드로이드에서 다이얼로그로 표출하여보았습니다

다음엔 서버에 이미지를 업로드하는 포스팅으로 찾아뵙겠습니다 감사합니다.