반응형
실제 앱을 만들 때는 내용 제공자를 사용해야 하는 경우가 더 많다
내용 제공자를 이용해 앨범에 저장된 사진과 연락처에 저장된 정보를 조회해 보는 것은, 내용 제공자를 사용하는 가장 대표적인 경우이다
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 |