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로 출력하고 서버에서 제대로 받았는지를 안드로이드에서 다이얼로그로 표출하여보았습니다
다음엔 서버에 이미지를 업로드하는 포스팅으로 찾아뵙겠습니다 감사합니다.
'안드로이드 자바' 카테고리의 다른 글
[Java][Android] 바인드서비스로 데이터 받기 (0) | 2022.02.02 |
---|---|
[JAVA][Android] 원형 그래프 만들기 (0) | 2022.01.31 |
[Java][Android] MPAndroidChart (0) | 2022.01.26 |
[JAVA][Android] ArrayAdapter를 이용하여 Spinner 구현 (0) | 2022.01.24 |
[Java][Android] BroadCast 이벤트 송신, 수신하기 (0) | 2022.01.23 |