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

[Android][Java] 이미지 절대경로 가져와서 Intent로 넘기기

by teamnova 2023. 5. 23.

안녕하세요. 오늘은 이미지의 절대경로를 이용해 Intent로 넘겨보겠습니다.

먼저 manifest파일에 외부 저장소 읽기 권한을 추가합니다.

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

그리고 이미지를 가져오고 넘겨줄 메인액티비티의 xml파일 소스 입니다.

<?xml version="1.0" encoding="utf-8"?>
<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"
    tools:context=".MainActivity"
    android:orientation="vertical">
    <ImageView
        android:layout_width="match_parent"
        android:layout_height="300dp"
        android:id="@+id/image_view"/>
    <Button
        android:layout_marginTop="50dp"
        android:layout_gravity="center_horizontal"
        android:layout_width="300dp"
        android:layout_height="wrap_content"
        android:text="사진 등록"
        android:id="@+id/select_image_btn"/>
    <Button
        android:layout_marginTop="50dp"
        android:layout_gravity="center_horizontal"
        android:layout_width="300dp"
        android:layout_height="wrap_content"
        android:text="이미지 전달"
        android:id="@+id/intent_image_btn"/>


</LinearLayout>

MainActivity.java클래스의 코드입니다.

public class MainActivity extends AppCompatActivity {
    ImageView imageView;
    Button select_image_btn;
    Button intent_image_btn;
    
    Context context;
    String final_uri;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        imageView = findViewById(R.id.image_view);
        select_image_btn = findViewById(R.id.select_image_btn);
        intent_image_btn = findViewById(R.id.intent_image_btn);
        context = this;

        if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 1);
        }

        select_image_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent();
                intent.setAction(Intent.ACTION_PICK);
                intent.setType(MediaStore.Images.Media.CONTENT_TYPE);
                intent.setType("image/*");
                startActivityForResult(intent, 0);
            }
        });

        intent_image_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(intent_image_btn != null){
                    Intent intent = new Intent(context,IntentActivity.class);
                    intent.putExtra("uri",final_uri);
                    startActivity(intent);
                }else {
                    Toast.makeText(context,"이미지를 선택해주세요.",Toast.LENGTH_SHORT).show();
                }
            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(requestCode == 0 && data != null && data.getData() != null){
            Uri filePath = data.getData();
            final_uri = GetUrI(filePath);
            imageView.setImageURI(filePath);
        }
    }

    private String GetUrI(Uri contentURI) {
        String result;
        Cursor cursor = getContentResolver().query(contentURI, null, null, null, null);
        if (cursor == null) { 
            result = contentURI.getPath();
        } else {
            cursor.moveToFirst();
            int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
            result = cursor.getString(idx);
            cursor.close();
        }
        return result;
    }
}

넘겨줄 준비는 마쳤고 이제 다른 액티비에서 넘겨 받은 절대경로로 이미지뷰에 띄워볼게요.

레이아웃 소스입니다.

<?xml version="1.0" encoding="utf-8"?>
<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"
    tools:context=".IntentActivity">
    <ImageView
        android:layout_width="match_parent"
        android:layout_height="300dp"
        android:id="@+id/image_view"/>

</LinearLayout>

다음은 해당 레이아웃의 클래스입니다.

public class IntentActivity extends AppCompatActivity {
    ImageView imageView;
    String uri;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_intent);
        imageView = findViewById(R.id.image_view);
        Intent intent = getIntent();
        uri = intent.getStringExtra("uri");
        File imageFile = new File(uri);
        Uri imageUri = Uri.fromFile(imageFile);
        imageView.setImageURI(imageUri);
    }
}

절대경로를 String형식으로 저장해 보관할 수도 있습니다.

 

결과를 보겠습니다.