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) 찍고 가져오기
[안드로이드] TextToSpeech 텍스트(Text)를 음성으로 전환시켜주는 방법 (0) | 2021.01.15 |
---|---|
[안드로이드] 차트(Chart) - 데이터를 그래픽으로 표현 Bar, Pie, Radar (2) | 2021.01.14 |
[안드로이드] 카메라(Camera) 사진(Image) 찍고 가져오기 (0) | 2021.01.12 |
[안드로이드] 동적 메뉴(ActionMode) 만들어 보기 (0) | 2021.01.11 |
[안드로이드] 리스트(RecyclerView) 와 바로가기메뉴(ContextMenu) (0) | 2021.01.10 |
댓글 영역