ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [ 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

     

    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);
            }
        }
    }

     

     

     실행 결과

     

     

    출처

     

     

    댓글

Designed by Tistory.