반응형
dependencies {
implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'com.google.android.material:material:1.2.1'
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
implementation 'gun0912.ted:tedpermission:2.0.0'
testImplementation 'junit:junit:4.+'
androidTestImplementation 'androidx.test.ext:junit:1.1.2'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
}
특정 상황에서 권한이 필요하기 때문에, tedpermission을 쓰면 쉽게 권한 창을 만들 수 있다.
//res. xml. file_paths
<?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.com.gohool.cameraexample/files/Pictures"/>
</paths>
//manifest
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.gohool.cameraexample">
<!--카메라 권한 -->
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_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.CameraExample">
<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:authorities="com.gohool.cameraexample"
android:name="androidx.core.content.FileProvider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths"/>
</provider>
</application>
</manifest>
//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">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1">
<ImageView
android:id="@+id/result"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
<LinearLayout
android:gravity="center"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:id="@+id/btnCapture"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="촬영"/>
</LinearLayout>
</LinearLayout>
// activity main .java
package com.gohool.cameraexample;
import android.Manifest;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.media.ExifInterface;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.view.View;
import android.widget.ImageView;
import android.widget.Toast;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.FileProvider;
import com.gun0912.tedpermission.PermissionListener;
import com.gun0912.tedpermission.TedPermission;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
public class MainActivity extends AppCompatActivity {
private static final int REQUEST_IMAGE_CAPTURE = 672;
private String imageFilePath;
private Uri photoUri;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//권한 체크
TedPermission.with(getApplicationContext())
.setPermissionListener(permissionListener)
.setRationaleMessage("카메라 권한이 필요합니다.") //카메라권한 열때 사용자에게 보여주는 메세지
.setDeniedMessage("카메라 권한을 거부하셨습니다.")
.setPermissions(Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.CAMERA) //manifest에 추가한 권한
.check();
findViewById(R.id.btnCapture).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if(intent.resolveActivity(getPackageManager()) != null){
File photoFile = null; //파일쓰기시에는 항상 try catch문 필요
try {
photoFile = createImageFile();
}catch (IOException e){
}
if(photoFile != null){
photoUri = FileProvider.getUriForFile(getApplicationContext(), getPackageName(),photoFile);
intent.putExtra(MediaStore.EXTRA_OUTPUT,photoUri);
startActivityForResult(intent, REQUEST_IMAGE_CAPTURE);
}
}
}
});
}
private File createImageFile() throws IOException{ //년원일분초 시간단위로 생성 후 저장
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
String imageFileName = "TEST_" + timeStamp + "_";
File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
File image = File.createTempFile(
imageFileName,
".jpg",
storageDir
);
imageFilePath = image.getAbsolutePath();
return image;
}
//forresult
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
Bitmap bitmap = BitmapFactory.decodeFile(imageFilePath);
ExifInterface exifInterface = null;
try {
exifInterface = new ExifInterface(imageFilePath);
} catch (IOException e) {
e.printStackTrace();
}
int exifOrientation;
int exifDegree;
if (exifInterface != null) {
exifOrientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
exifDegree = exifOrientationToDegree(exifOrientation);
} else {
exifDegree = 0;
}
((ImageView) findViewById(R.id.result)).setImageBitmap(rotate(bitmap, exifDegree));
}
}
private Bitmap rotate(Bitmap bitmap, float degree){
Matrix matrix = new Matrix();
matrix.postRotate(degree);
return Bitmap.createBitmap(bitmap,0,0,bitmap.getWidth(),bitmap.getHeight(),matrix,true);
}
private int exifOrientationToDegree(int exifOrientation) { //촬영중 화면 돌아갈때
if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_90) {
return 90;
} else if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_180) {
return 180;
} else if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_270) {
return 270;
}
return 0;
}
PermissionListener permissionListener = new PermissionListener() {
@Override
public void onPermissionGranted() { //권한 허용에대한 액션
Toast.makeText(getApplicationContext(), "권한이 허용됨", Toast.LENGTH_SHORT).show();
}
@Override
public void onPermissionDenied(ArrayList<String> deniedPermissions) {
Toast.makeText(getApplicationContext(), "권한이 거부됨", Toast.LENGTH_SHORT).show();
}
};
}
반응형
'개발언어 > JAVA' 카테고리의 다른 글
안드로이드 TODOLIST 만들기 (feat. SQL OpenHelper) (0) | 2021.01.05 |
---|---|
안드로이드 상단 분리된 메뉴 (0) | 2021.01.01 |
안드로이드 버튼 애니메이션 (0) | 2021.01.01 |
안드로이드 뒤로가기 두번 누르면 종료 (0) | 2021.01.01 |
안드로이드 로딩화면 (0) | 2021.01.01 |