본문 바로가기

안드로이드

내용 제공자 사용하기, 앨범 조회

반응형

실제 앱을 만들 때는 내용 제공자를 사용해야 하는 경우가 더 많다

내용 제공자를 이용해 앨범에 저장된 사진과 연락처에 저장된 정보를 조회해 보는 것은, 내용 제공자를 사용하는 가장 대표적인 경우이다

 

AndroidManifest.xml

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

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_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.A63_Sample_Album">
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

</manifest>

 

 

build.gradle(Module)

dependencies {
	...
    implementation 'com.yanzhenjie:permission:2.0.3'
}

 

 

activity_main.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"
    android:orientation="vertical"
    tools:context=".MainActivity" >

    <Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="이미지 선택" />

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:srcCompat="@mipmap/ic_launcher" />
</LinearLayout>

 

 

MainActivity

package com.example.a63_sample_album;

import androidx.appcompat.app.AppCompatActivity;

import android.content.ContentResolver;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;

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);

        imageView = findViewById(R.id.imageView);

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

        AndPermission.with(this)
                .runtime()
                .permission(Permission.READ_EXTERNAL_STORAGE, Permission.WRITE_EXTERNAL_STORAGE)
                .onGranted(new Action<List<String>>() {
                    @Override
                    public void onAction(List<String> permissions) {
                        showToast("허용된 권한 갯수 : " + permissions.size());
                    }
                })
                .onDenied(new Action<List<String>>() {
                    @Override
                    public void onAction(List<String> permissions) {
                        showToast("거부된 권한 갯수 : " + permissions.size());
                    }
                })
                .start();

    }

    public void showToast(String message) {
        Toast.makeText(this, message, Toast.LENGTH_LONG).show();
    }


    public void openGallery() {
        Intent intent = new Intent();

//        setType과 setAction 메소드로 인텐트의 속성 설정
//        MIME 타입이 image로 시작하는 데이터를 가져오도록 설정됨
        intent.setType("image/*");
        intent.setAction(Intent.ACTION_GET_CONTENT);

        startActivityForResult(intent, 101);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == 101) {
            if (resultCode == RESULT_OK) {

//                Intent 객체를 참조하는 data 변수에 getData 메소드를 호출하면
//                Uri 자료형의 값이 반환된다
//                이 값은 ContentResolver를 이용해 참조할 수 있는 이미지 파일을 가리킨다
                Uri fileUri = data.getData();

//                중요
//                앨범의 사진을 조회할 때 ContentResolver 객체가 사용되었다는 것은
//                앨범 앱 안에 내용 제공자를 만들어 두었기 때문이다
                ContentResolver resolver = getContentResolver();

                try {

//                    getContentResolver 메소드를 이용해 ContentResovler 객체를 참조한 후,
//                    openInputStream 메소드를 호출할 때 파라미터로 Uri 객체를 전달
//                    openInputStream 메소드를 호출하면 InputStream 객체게 반환됨
                    InputStream instream = resolver.openInputStream(fileUri);

//                    BitMapFActory.decodeStream 메소드를 사용하면 BtmMap 객체를 만들 수 있음
                    Bitmap imgBitmap = BitmapFactory.decodeStream(instream);

                    imageView.setImageBitmap(imgBitmap);

                    instream.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

 

 

 

 

Device FIle Explorer를 이용해 /sdcard/Download/ 에 이미지 파일을 넣었다

 

 

 

앱을 실행하고 이미지 선택 버튼을 누른 후, 사이드 메뉴에서 sdk_gphone_x86을 선택 후, Download 디렉토리를 선택하면 이미지 파일을 선택할 수 있다

선택하면 첫 화면으로 돌아오면서 이미지뷰가 선택한 파일로 바뀐다

 

 

반응형

'안드로이드' 카테고리의 다른 글

뷰에 그래픽 그리기  (0) 2021.11.01
내용 제공자 사용하기, 연락처 조회  (0) 2021.11.01
내용 제공자  (0) 2021.10.30
데이터 조회하기  (0) 2021.10.30
스키마 변경 - SQLiteOpenHelper 클래스  (0) 2021.10.29