Android Studio "코드 1행"학습-카메라 및 포토 앨범 호출

34252 단어 AndroidStudio
카메라와 앨범 호출
  • 카메라 호출 촬영
  • 1.레이아웃 파일 수정
  • 2.호출 카메라의 구체적인 논리 작성
  • 3.작은 질문 하나
  • 앨범 호출
  • 1.레이아웃 파일 수정
  • 2.앨범을 호출하는 논리 추가
  • 카메라로 사진을 찍다
    응용 프로그램에서 카메라를 호출하는 것은 매우 흔히 볼 수 있는 기능이다. 이제 학습의 길을 열어보자!
    1. 레이아웃 파일 수정
    activity 수정main.xml의 내용, 새 Button과 ImageView는 각각 사진을 찍고 표시하는 데 사용됩니다. 다음과 같습니다.
    
    
    
        

    2.编写调用摄像头的具体逻辑

    (1)获取Button和ImageView的实例,并注册button的点击事件,click后调用摄像头,具体处理逻辑如下:

    • 创建file对象,存储拍下的图片
    File outputImage = new File(getExternalCacheDir(), "output_image.jpg");
    try {
        if (outputImage.exists()) {
            outputImage.delete();
        }
        outputImage.createNewFile();
    } catch (IOException e) {
        e.printStackTrace();
    }
    
  • Android 7보다 낮은 경우 디바이스의 시스템 버전을 판단합니다.0은 File 대상을 Uri 대상으로 변환합니다. 그렇지 않으면 FileProvider의 getUriFor File 방법을 사용해서 File 대상을 봉인된 Uri 대상으로 변환합니다.
  • if(Build.VERSION.SDK_INT>=24){
    	imageUri=FileProvider.getUriForFile(MainActivity.this,
    	"com.example.cameraalbumtest.fileprovider",outputImage);
    }else{
    	imageUri=Uri.fromFile(outputImage);
    }
    
  • Intent 대상을 구축하고 action을 android.media.action.IMAGE_CAPTURE로 지정하고putExtra 방법을 사용하여 그림 출력 주소를 지정합니다
  • Intent intent=new Intent("android.media.action.IMAGE_CAPTURE");
    intent.putExtra(MediaStore.EXTRA_OUTPUT,imageUri);
    startActivityForResult(intent,TAKE_PHOTO);
    

    Android7.0 시스템이 시작되면 로컬 실제 경로를 직접 사용하는 Uri가 이상을 던집니다. FileProvider는 특수한 내용 제공기로서 봉인된 Uri를 외부에 공유하여 안전성을 높일 수 있습니다.
    (2) AndroidManifest에 등록 컨텐트 공급자가 있습니다.xml에 FileProvider 등록
    <provider
       android:name="androidx.core.content.FileProvider"
       android:authorities="com.example.cameraalbumtest.fileprovider"
       android:exported="false"
       android:grantUriPermissions="true">
       <meta-data
           android:name="android.support.FILE_PROVIDER_PATHS"
           android:resource="@xml/file_paths"/>
    </provider>
    

    (3) onActivity Result () 방법에 그림의 시작 활동을 표시하면 이 방법으로 결과를 되돌려줍니다. BitmapFactory의 decodeStream () 방법을 호출하여 사진을 분석하고 ImageView에 표시합니다. 구체적인 코드는 다음과 같습니다.
        @Override
        protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
            switch (requestCode){
                case TAKE_PHOTO:
                    if(resultCode==RESULT_OK){
                        try{
                            Bitmap bitmap=BitmapFactory.decodeStream
                            (getContentResolver().openInputStream(imageUri));
                            picture.setImageBitmap(bitmap);
                        }catch(FileNotFoundException e){
                            e.printStackTrace();
                        }
                    }
                    break;
                default:
                    break;
            }
        }
    

    (4) file 만들기paths.xml 파일, external-path를 인용하여 Uri 공유를 지정합니다. 그 중에서 path 속성은 구체적인 경로를 표시하고 빈 설명으로 설정하여 전체 SD 카드를 공유합니다.
    <?xml version="1.0" encoding="utf-8" ?>
    <paths xmlns:android="http://schemas.android.com/apk/res/android">
        <external-path
            name="my_images"
            path="" />
    </paths>
    

    (5) 선언 권한 구성 파일에서 SD 카드 액세스 권한 선언
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.cameraalbumtest">
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
        ...
    </manifest>
    

    Android4.4 시스템 이전에는 SD 카드의 어플리케이션 연결 디렉토리에 액세스하기 위해 선언 권한이 필요하지만 이후에는 필요하지 않음
    3. 사소한 질문 하나
    filepaths.xml 파일에서 path 속성 값을 공백으로 설정하면 "Value must not be empty"메시지가 빨간색으로 표시되지만 실행에 영향을 주지 않습니다.path = "/"을 설정하면 경로가 잘못되지 않습니다...
    앨범
    카메라를 사용해 사진을 찍는 것 외에 앨범에서 직접 사진을 선택하는 것이 흔히 사용되는데 다음은 앨범에서 사진을 선택하여 표시하는 것을 실현한다.
    1. 레이아웃 파일 수정
    앨범에서 사진을 선택할 수 있도록 button 추가
    <Button
        android:id="@+id/choose_from_album"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="choose photo"/>
    

    2. 앨범을 호출하는 논리를 넣는다
    (1) button 실례를 획득하고 클릭 이벤트를 등록하여 이벤트에서 실행 시 권한 신청을 하고 WRITE 획득EXTERNAL_STORAGE 권한, sd 카드에서 읽기 및 쓰기 가능
    Button chooseFromAlbum=findViewById(R.id.choose_from_album);
    chooseFromAlbum.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if(ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
            != PackageManager.PERMISSION_GRANTED){
                ActivityCompat.requestPermissions(MainActivity.this,
                        new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},1);
            }else{
                openAlbum();
            }
        }
    });
    

    (2) 오픈 Album () 방법을 만들고 앨범 프로그램을 시작하여 이 방법에서 Intent를 구축하고 action을android로 지정합니다.intent.action.GET_CONTENT 코드는 다음과 같습니다.
    private void openAlbum(){
        Intent intent=new Intent("android.intent.action.GET_CONTENT");
        intent.setType("image/*");
        startActivityForResult(intent,CHOOSE_PHOTO);
    }
    

    (3) onActivityResult 방법에서 그림의 시작 활동을 처리한 후 CHOOSE 로 전송PHOTO 값, 이 방법에서 시스템 버전 판단을 하고 각각 다른 방법으로 그림을 처리한다
    case CHOOSE_PHOTO:
        if(resultCode==RESULT_OK){
            //         
            if(Build.VERSION.SDK_INT>=19){
                //4.4     
                handleImageOnKitKat(data);
            }else{
                //4.4    
                handleImageBeforeKitKat(data);
            }
        }
        break;
    

    안드로이드 시스템은 4.4 버전부터 그림을 선택하면 실제 Uri를 되돌려주지 않고 봉인하여 되돌려줍니다. 따라서 4.4 버전 이상의 시스템은 이 Uri를 분석해야 합니다.
    (4)handleImageOnKitKat() 방법을 만들어 그림을 해석하고 Uri 유형을 먼저 판단하며 서로 다른 유형의uri에 대해 서로 다른 처리 방식을 취한 다음에 getImagePath 방법을 통해 그림 경로를 얻은 다음displayImage 방법으로 그림을 표시한다
  • handleImageOnKitKat() 방법
  • @TargetApi(19)
    private void handleImageOnKitKat(Intent data){
        String imagePath=null;
        Uri uri=data.getData();
        if(DocumentsContract.isDocumentUri(this,uri)){
            //document   Uri    
            String docId=DocumentsContract.getDocumentId(uri);
            if("com.android.providers.media.documents".equals(uri.getAuthority())){
                String id=docId.split(":")[1];
                String seletion=MediaStore.Images.Media._ID+"="+id;
                imagePath=getImagePath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,seletion);
            }else if("com.android.providers.downloads.documents".equals(uri.getAuthority())){
                Uri contentUri= ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"),Long.valueOf(docId));
                imagePath=getImagePath(contentUri,null);
            }
        }else if("content".equalsIgnoreCase(uri.getScheme())){
            //content   Uri    
            imagePath=getImagePath(uri,null);
        }else if("file".equalsIgnoreCase(uri.getScheme())){
            //file   Uri,        
            imagePath=uri.getPath();
        }
        displayImage(imagePath);
    }
    

    Android API는 높은 버전의 일부 기능을 낮은 버전에서 사용할 수 없으며 오류가 발생할 수 있으므로 @TargetApi(19)를 사용하여 오류를 방지해야 합니다.
  • getImagePath() 방법
  • private String getImagePath(Uri uri,String selection){
        String path=null;
        //         
        Cursor cursor=getContentResolver().query(uri,null,selection,null,null);
        if(cursor!=null){
            if(cursor.moveToFirst()){
                path=cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
            }
            cursor.close();
        }
        return path;
    }
    
  • displayImage() 방법
  • private void displayImage(String imagePath){
        if(imagePath!=null){
            Bitmap bitmap=BitmapFactory.decodeFile(imagePath);
            picture.setImageBitmap(bitmap);
        }else{
            Toast.makeText(this,"failed to get image",Toast.LENGTH_SHORT).show();
        }
    }
    

    (5)handleImageBeforeKitKat 만들기 () 방법은 4.4 이하 버전 시스템의 그림을 처리합니다.Uri가 봉인되지 않았기 때문에 getImagePath 방법으로 그림 경로를 가져오고 디스플레이 Image 방법으로 그림을 표시하면 됩니다
    private void handleImageBeforeKitKat(Intent data){
        Uri uri=data.getData();
        String imagePath=getImagePath(uri,null);
        displayImage(imagePath);
    }
    

    이로써 카메라를 이용해 사진을 찍고 앨범에서 사진을 선택하는 데 성공했다.

    좋은 웹페이지 즐겨찾기