-
[ Android ] 사진 찍기Android/멀티미디어 2020. 3. 16. 15:51
이 글은 부스트코스 강의를 공부하며 요약한 글입니다.
CatServant
SufaceView는 일반 뷰처럼 화면의 일정 영역을 할당받는다. 하지만 View와 독립적으로 구성되어 있어서 직접 SurfaceHolder를 통해서 상태를 관찰하고 상태에 맞게 처리해줘야 한다.
getexternalfilesdir / getexternalstoragedirectory
** 이후 추가
Code
- AndroidManifest.xml
: xml 파일의 경로를 넣어줘야 한다.
<provider android:authorities="com.example.movie.FileProvider" 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>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
현재에는 android.hardware.camera2 가 더 많이 사용된다.
<uses-feature android:name="android.hardware.camera" android:required="true"/>
- build.gradle ( Module.app ) → 위험 권한 추가하기
allprojects { repositories { maven { url 'https://jitpack.io' } } } dependencies { implementation 'com.github.pedroSG94:AutoPermissions:1.0.3' }
- res/xml/file_paths.xml
※ external-path : 외부 폴더를 지정해준다.
<?xml version="1.0" encoding="utf-8"?> <paths xmlns:android="http://schemas.android.com/apk/res/android"> <external-path name="sdcard" path="."/> </paths>
- MainActivity.java
public class MainActivity extends AppCompatActivity implements AutoPermissionsListener { Button button; ImageView imageView; File file; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); button = (Button) findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { takePicture(); } }); imageView = (ImageView) findViewById(R.id.imageView); // 처음부터 부여하겠다. AutoPermissions.Companion.loadAllPermissions(this, 101); } @Override public void onRequestPermissionsResult( int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); AutoPermissions.Companion.parsePermissions(this, requestCode, permissions, this); } @Override public void onDenied(int requestCode, String[] permissions) { Toast.makeText(this, "permissions denied : "+ permissions.length, Toast.LENGTH_LONG); } @Override public void onGranted(int requestCode, String[] permissions) { Toast.makeText(this, "permissions granted : "+ permissions.length, Toast.LENGTH_LONG); } public void takePicture() { if (file == null) { file = createFile(); } Uri fileUri = FileProvider.getUriForFile(this, "com.example.movie.fileprovider", file); // 사진 앱을 띄워줌 Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); // 사진 찍은 결과물을 fileUri에 저장해 주세요 intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); if (intent.resolveActivity(getPackageManager()) != null) { startActivityForResult(intent, 101); } } public File createFile() { String filename = "capture.jpg"; // File storageDir = Environment.getExternalStorageDirectory(); File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES); File outFile = new File(storageDir, filename); return outFile; } @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == 101 && resultCode == RESULT_OK) { BitmapFactory.Options options = new BitmapFactory.Options(); options.inSampleSize = 6; Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath(), options); // imageView에 결과 사진 적용 imageView.setImageBitmap(bitmap); } } }
실행 결과
출처
'Android > 멀티미디어' 카테고리의 다른 글
[ Android ] 임시 파일 생성해서 외부 앱으로 찍은 사진 받기 (0) 2020.09.16 [ Android ] 음성 녹음하기 (1) 2020.03.26 [ Android ] 음악 재생하기 (0) 2020.03.25 [ Android ] 동영상 파일 재생하기 (0) 2020.03.24 [ Android ] 사진 미리보기 - Camera 이용 (0) 2020.03.17