티스토리 뷰

실제 앱을 개발할 때, 직접 내용 제공자를 사용하는 일보다 이미 존재하는 내용 제공자를 사용해야 하는 경우가 더 많을 것이다. 

 

그 중 앨범이나 연락처에 있는 데이터를 조회하는 경우가 내용 제공자를 사용하는 가자우 대표적인 경우라고 할 수 있다.

 

이번 포스팅은 앨범을 조회하여 간단하게 이미지 뷰에 띄우는 예제를 확인해보려고 한다.


우선, 앨범을 가져와야 하는 위험 권한을 설정해줘야 하므로 매니페스트 파일에서 권한 설정과 어플이 실행되었을 때 권한을 허용할 수 있도록 해줘야 한다.

 

◎AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.example.ssssssdead">

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

    <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/Theme.Ssssssdead">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>

                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
    </application>

</manifest>

 

다음으로 Intent 객체를 하나 생성하여 해당 Intent 객체의 MIME 타입과 액션 정보를 지정한 뒤, startActivity()를 호출하여 해당 intent 객체가 액티비티를 띄우도록 설정해준다.

 

Intent 객체가 성공적으로 액티비티를 띄우고 결과를 가져올 때,  콜백 메서드에서 ContentResolver를 실행하여 이미지 Stream을 Bitmap 객체로 만들고 이미지 뷰에 삽입되도록 설정해준다.

 

◎MainActivity.java

package com.example.ssssssdead;

import android.app.Activity;
import android.content.ContentResolver;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import androidx.activity.result.ActivityResult;
import androidx.activity.result.ActivityResultCallback;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import com.yanzhenjie.permission.Action;
import com.yanzhenjie.permission.AndPermission;
import com.yanzhenjie.permission.runtime.Permission;

import java.io.InputStream;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    ImageView imageView;

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

        AndPermission.with(this)
                .runtime()
                .permission(Permission.READ_EXTERNAL_STORAGE)
                .onGranted(new Action<List<String>>() {
                    @Override
                    public void onAction(List<String> permissions) {
                    }
                })
                .onDenied(new Action<List<String>>() {
                    @Override
                    public void onAction(List<String> permissions) {
                    }
                })
                .start();

        imageView = findViewById(R.id.imageView);


        Button button = findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                openGallery();
            }
        });
    }

    public void  openGallery() {
        Intent intent = new Intent();
        intent.setType("image/*");
        intent.setAction(Intent.ACTION_GET_CONTENT);

        mGetContent.launch(intent);
    }


    ActivityResultLauncher<Intent> mGetContent = registerForActivityResult(
            new ActivityResultContracts.StartActivityForResult(),
            new ActivityResultCallback<ActivityResult>() {
                @Override
                public void onActivityResult(ActivityResult result) {
                    if(result.getResultCode() == Activity.RESULT_OK) {
                        Intent data = result.getData();

                        Uri fileUri = data.getData();

                        ContentResolver resolver = getContentResolver();

                        try{
                            InputStream inputStream = resolver.openInputStream(fileUri);
                            Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
                            imageView.setImageBitmap(bitmap);
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }
            });
}

Comments