상세 컨텐츠

본문 제목

[안드로이드]카메라(Camera) 저장공간 지정해서 고화질로 저장하기

안드로이드

by aries574 2021. 1. 13. 18:25

본문


2021/01/09 - [안드로이드] - [안드로이드]바로가기메뉴(ContextMenu) 바탕화면 변경해보기

2021/01/10 - [안드로이드] - [안드로이드] 리스트(RecyclerView) 와 바로가기메뉴(ContextMenu)

2021/01/11 - [안드로이드] - [안드로이드] 동적 메뉴(ActionMode) 만들어 보기

2021/01/12 - [안드로이드] - [안드로이드] 카메라(Camera) 사진(Image) 찍고 가져오기

 

이번 시간에는 카메라로 찍은 사진이 담길 공간을 직접 정해놓고 저장하는 방법을 알아보겠습니다. 

이전에는 AndroidManifest.xml 파일에 카메라기능 선언만 했다면

이번에는 사진을 메모리에 저장해야 하기때문에 권한등록과 콘텐츠 제공자 구성요소를 선언해야 합니다.

 

1. 사진 저장위치 폴더 생성및 파일 생성

1-1 폴더생성

 

1-2 파일생성(file_path.xml) 

xml -> New -> XML Resource File

 

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

    <external-path
        name="my_images"
        path="Android/data/com.kwon.cameraexam/files/Pictures"/>
</paths>

 

2. 기능선언(uses-feature), 권한선언(uses-permission), 공급자 선언(provider)

manifests -> AndroidManifest.xml

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

    <uses-feature
        android:name="android.hardware.Camera"
        android:required="true" />

    <uses-permission
        android:name="android.permission.WRITE_EXTERNAL_STORAGE"
        android:maxSdkVersion="18" />

    <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/AppTheme">
        <activity android:name=".DisplayImage"></activity>
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

        <!-- 콘텐츠 제공자 구성요소를 선언합니다.  -->
        <provider
            android:name="androidx.core.content.FileProvider"
            android:authorities="com.example.android.fileprovider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/file_path" />
        </provider>
    </application>

</manifest>

 

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

    <Button
        android:id="@+id/btn_capture"
        android:layout_width="250dp"
        android:layout_height="wrap_content"
        android:text="사진찍기"
        android:layout_gravity="center_horizontal"
        android:layout_marginTop="55dp"/>

    <Button
        android:id="@+id/btn_display"
        android:layout_width="250dp"
        android:layout_height="wrap_content"
        android:text="사진 보여주기"
        android:layout_gravity="center_horizontal"
        android:layout_marginTop="55dp"/>
</LinearLayout>

 

4. 메인코드 구현(MainActivity.java)


import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.FileProvider;

import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.view.View;
import android.widget.Button;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class MainActivity extends AppCompatActivity {

   String currentImagePath = null;
   private static final int IMAGE_REQUEST = 1;

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

        Button btn_capture = findViewById(R.id.btn_capture);
        Button btn_display = findViewById(R.id.btn_display);

        btn_capture.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                captureImage();
            }
        });

        btn_display.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                displayImage();
            }
        });
    }

    //사진찍기 기능
    public void captureImage(){
        
        Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

        if(cameraIntent.resolveActivity(getPackageManager()) != null){
            File imageFile = null;

            try{
                imageFile = getImageFile();
            }catch(IOException e){
                e.printStackTrace();
            }

            //파일이 null이 아니면
            if(imageFile != null){
                Uri imageUri = FileProvider.getUriForFile(this, "com.example.android.fileprovider", imageFile);
                cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
                startActivityForResult(cameraIntent, IMAGE_REQUEST);
            }
        }
    }

    //사진 가져오기 기능
    public void displayImage(){

        Intent intent = new Intent(this, DisplayImage.class);
        intent.putExtra("image_path", currentImagePath);
        startActivity(intent);

    }

    private File getImageFile() throws IOException {
        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
        String imageName = "jpg_" + timeStamp + "_";
        File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);

        File imageFile = File.createTempFile(imageName, ".jpg", storageDir);
        currentImagePath = imageFile.getAbsolutePath();
        return imageFile;
    }
}

 

5. 사진보여주는 액티비티 생성(DisplayImage)

파일명은 DisplayImage로 했습니다.

 

6. DisplayImage 화면구현(activity_display_image.xml)

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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=".DisplayImage">

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:padding="4dp"
        android:id="@+id/imageView"/>

</RelativeLayout>

 

7. DisplayImage 코드구현(DisplayImage.java)


import androidx.appcompat.app.AppCompatActivity;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.widget.ImageView;

public class DisplayImage extends AppCompatActivity {

    ImageView imageView;

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

        imageView = findViewById(R.id.imageView);

        Bitmap bitmap = BitmapFactory.decodeFile(getIntent().getStringExtra("image_path"));
        imageView.setImageBitmap(bitmap);
    }
}

 

8. 실행화면

2021/01/09 - [안드로이드] - [안드로이드]바로가기메뉴(ContextMenu) 바탕화면 변경해보기

2021/01/10 - [안드로이드] - [안드로이드] 리스트(RecyclerView) 와 바로가기메뉴(ContextMenu)

2021/01/11 - [안드로이드] - [안드로이드] 동적 메뉴(ActionMode) 만들어 보기

2021/01/12 - [안드로이드] - [안드로이드] 카메라(Camera) 사진(Image) 찍고 가져오기

반응형

관련글 더보기

댓글 영역