티스토리 뷰
이번 글에서는 아래의 4가지 기능이 구현되어있는 앱을 만들겠습니다.
1. 앨범에 있는 사진을 선택하면 이미지 뷰를 통해 보여주기
2. 앨범에서 가져온 사진을 내부저장소에 저장하기
3. 앱 시작시 내부저장소에 저장돼있는 사진을 이미지 뷰에 적용하기
4. 내부저장소에 저장된 이미지 삭제하기
해당 화면은 앱을 실행하고 이미지 선택을 누른 후 앨범에서 사진을 선택하여 화면에 이미지를 띄운 상태입니다.
xml코드를 다음과 같습니다.
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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">
<Button
android:id="@+id/button2"
android:layout_width="0dp"
android:layout_height="50dp"
android:background="#ffffff"
android:onClick="bt2"
android:text="이미지 삭제"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<Button
android:id="@+id/button"
android:layout_width="0dp"
android:layout_height="50dp"
android:background="#ffffff"
android:onClick="bt1"
android:text="이미지 선택"
app:layout_constraintBottom_toTopOf="@+id/button2"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<ImageView
android:id="@+id/imageView"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toTopOf="@+id/button"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
기능을 수행하기 위한 2개의 버튼과 이미지를 띄울 이미지뷰가 하나 있습니다.
각 버튼은 클릭하면 bt1과 bt2를 호출하게 됩니다.
java 전체 코드는 다음과 같습니다.
package com.ehsehsl.osz;
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.ImageView;
import android.widget.Toast;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
public class MainActivity extends AppCompatActivity {
ImageView imageView;
String imgName = "osz.png"; // 이미지 이름
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView = findViewById(R.id.imageView);
try {
String imgpath = getCacheDir() + "/" + imgName; // 내부 저장소에 저장되어 있는 이미지 경로
Bitmap bm = BitmapFactory.decodeFile(imgpath);
imageView.setImageBitmap(bm); // 내부 저장소에 저장된 이미지를 이미지뷰에 셋
Toast.makeText(getApplicationContext(), "파일 로드 성공", Toast.LENGTH_SHORT).show();
} catch (Exception e) {
Toast.makeText(getApplicationContext(), "파일 로드 실패", Toast.LENGTH_SHORT).show();
}
}
public void bt1(View view) { // 이미지 선택 누르면 실행됨 이미지 고를 갤러리 오픈
Intent intent = new Intent();
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) {
Uri fileUri = data.getData();
ContentResolver resolver = getContentResolver();
try {
InputStream instream = resolver.openInputStream(fileUri);
Bitmap imgBitmap = BitmapFactory.decodeStream(instream);
imageView.setImageBitmap(imgBitmap); // 선택한 이미지 이미지뷰에 셋
instream.close(); // 스트림 닫아주기
saveBitmapToJpeg(imgBitmap); // 내부 저장소에 저장
Toast.makeText(getApplicationContext(), "파일 불러오기 성공", Toast.LENGTH_SHORT).show();
} catch (Exception e) {
Toast.makeText(getApplicationContext(), "파일 불러오기 실패", Toast.LENGTH_SHORT).show();
}
}
}
}
public void saveBitmapToJpeg(Bitmap bitmap) { // 선택한 이미지 내부 저장소에 저장
File tempFile = new File(getCacheDir(), imgName); // 파일 경로와 이름 넣기
try {
tempFile.createNewFile(); // 자동으로 빈 파일을 생성하기
FileOutputStream out = new FileOutputStream(tempFile); // 파일을 쓸 수 있는 스트림을 준비하기
bitmap.compress(Bitmap.CompressFormat.PNG, 100, out); // compress 함수를 사용해 스트림에 비트맵을 저장하기
out.close(); // 스트림 닫아주기
Toast.makeText(getApplicationContext(), "파일 저장 성공", Toast.LENGTH_SHORT).show();
} catch (Exception e) {
Toast.makeText(getApplicationContext(), "파일 저장 실패", Toast.LENGTH_SHORT).show();
}
}
public void bt2(View view) { // 이미지 삭제
try {
File file = getCacheDir(); // 내부저장소 캐시 경로를 받아오기
File[] flist = file.listFiles();
for (int i = 0; i < flist.length; i++) { // 배열의 크기만큼 반복
if (flist[i].getName().equals(imgName)) { // 삭제하고자 하는 이름과 같은 파일명이 있으면 실행
flist[i].delete(); // 파일 삭제
Toast.makeText(getApplicationContext(), "파일 삭제 성공", Toast.LENGTH_SHORT).show();
}
}
} catch (Exception e) {
Toast.makeText(getApplicationContext(), "파일 삭제 실패", Toast.LENGTH_SHORT).show();
}
}
}
주석이 있긴 하지만 어디가 무슨 기능을 담당하는지 알아보기 쉽게 전체 코드에서 기능별로 나눠보겠습니다.
public void bt1(View view) { // 이미지 선택 누르면 실행됨 이미지 고를 갤러리 오픈
Intent intent = new Intent();
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) {
Uri fileUri = data.getData();
ContentResolver resolver = getContentResolver();
try {
InputStream instream = resolver.openInputStream(fileUri);
Bitmap imgBitmap = BitmapFactory.decodeStream(instream);
imageView.setImageBitmap(imgBitmap); // 선택한 이미지 이미지뷰에 셋
instream.close(); // 스트림 닫아주기
saveBitmapToJpeg(imgBitmap); // 내부 저장소에 저장
Toast.makeText(getApplicationContext(), "파일 불러오기 성공", Toast.LENGTH_SHORT).show();
} catch (Exception e) {
Toast.makeText(getApplicationContext(), "파일 불러오기 실패", Toast.LENGTH_SHORT).show();
}
}
}
}
1. 앨범에 있는 사진을 선택하면 이미지뷰를 통해 보여주기
이미지 선택을 누르면 bt1함수가 호출되고 onActivityResult로 넘어가 선택한 사진을 이미지 뷰를 통해 보여주고 내부 저장소에 저장하기 위한 함수를 호출합니다.
public void saveBitmapToJpeg(Bitmap bitmap) { // 선택한 이미지 내부 저장소에 저장
File tempFile = new File(getCacheDir(), imgName); // 파일 경로와 이름 넣기
try {
tempFile.createNewFile(); // 자동으로 빈 파일을 생성하기
FileOutputStream out = new FileOutputStream(tempFile); // 파일을 쓸 수 있는 스트림을 준비하기
bitmap.compress(Bitmap.CompressFormat.PNG, 100, out); // compress 함수를 사용해 스트림에 비트맵을 저장하기
out.close(); // 스트림 닫아주기
Toast.makeText(getApplicationContext(), "파일 저장 성공", Toast.LENGTH_SHORT).show();
} catch (Exception e) {
Toast.makeText(getApplicationContext(), "파일 저장 실패", Toast.LENGTH_SHORT).show();
}
}
2. 앨범에서 가져온 사진을 내부저장소에 저장하기
화면에 보이는 이미지를 내부 저장소에도 저장해줍니다.
try {
String imgpath = getCacheDir() + "/" + imgName; // 내부 저장소에 저장되어 있는 이미지 경로
Bitmap bm = BitmapFactory.decodeFile(imgpath);
imageView.setImageBitmap(bm); // 내부 저장소에 저장된 이미지를 이미지뷰에 셋
Toast.makeText(getApplicationContext(), "파일 로드 성공", Toast.LENGTH_SHORT).show();
} catch (Exception e) {
Toast.makeText(getApplicationContext(), "파일 로드 실패", Toast.LENGTH_SHORT).show();
}
3. 앱 시작시 내부저장소에 저장돼있는 사진을 이미지 뷰에 적용하기
내부 저장소에 저장되어 있는 이미지가 있다면 이미지뷰에 나타나고 없으면 나타나지 않습니다.
public void bt2(View view) { // 이미지 삭제
try {
File file = getCacheDir(); // 내부저장소 캐시 경로를 받아오기
File[] flist = file.listFiles();
for (int i = 0; i < flist.length; i++) { // 배열의 크기만큼 반복
if (flist[i].getName().equals(imgName)) { // 삭제하고자 하는 이름과 같은 파일명이 있으면 실행
flist[i].delete(); // 파일 삭제
Toast.makeText(getApplicationContext(), "파일 삭제 성공", Toast.LENGTH_SHORT).show();
}
}
} catch (Exception e) {
Toast.makeText(getApplicationContext(), "파일 삭제 실패", Toast.LENGTH_SHORT).show();
}
}
4. 내부저장소에 저장된 이미지 삭제하기
이미지 삭제를 누르면 호출되는 함수이며 경로에서 삭제하고 싶은 이름과 일치하는 것을 찾아 삭제해줍니다.
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
마지막으로 이미지 파일에 접근하기 위한 위험권한을 AndroidManifest.xml에 추가해줍니다.
'안드로이드 네이티브' 카테고리의 다른 글
안드로이드 진동, 소리, 음악 파일 제어하기 (0) | 2020.10.04 |
---|---|
안드로이드 동영상 실행시키기 (앨범에서 선택, 웹에서 불러오기, 앱 내부 영상) (0) | 2020.10.01 |
안드로이드 스레드(Thread) 사용하기 (0) | 2020.09.29 |
안드로이드 웹뷰 사용과 웹으로 이동해보기 (추가로 http 연결하기) (0) | 2020.09.14 |
안드로이드 UI 보이게 안 보이게 하는 방법 (visibility) (0) | 2020.09.13 |
- Total
- Today
- Yesterday
- 코틀린
- 오토핫키
- inputbox
- 안드로이드네이티브
- 안드로이드앱
- 구구단앱
- MouseMove
- sendinput
- 로또
- 명언
- 구구단어플
- 안드로이드앱개발
- 자바스크립트
- 채팅
- 플러터
- 안드로이드클라이언트
- loop
- 구구단
- 챗봇
- 구구단공부
- 노래
- 앱개발
- 카카오봇
- 매크로
- 자동답장
- 안드로이드
- 안드로이드스튜디오
- JS
- 카카오톡
- Flutter
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |