Android 핸드폰 호출 시스템 카메라 사진, 재단 및 Url 업로드 이미지 얻기

7876 단어 기술

앞말


최근에 한 사람이 회사에서 독자적인 개발을 하는데 문제가 생기면 스스로 해결할 수밖에 없다. 비록 과정이 비교적 험난하지만 수확은 꽤 많다. 한 사람도 강인해야 한다. 최근에 사용자의 프로필 사진을 만드는 데 작은 문제가 생겼다. 비록 지난 앱에 프로필 사진이 올라왔지만 그 중의 작은 문제를 발견했다. 그래서 자신이 다시 고쳤다. 지금 붙여서 여러분과 공유한다.
*제품 수요: 사용자가 사진을 올리든 갤러리에서 사진을 선택하든 정사각형으로 자르고 서버를 업로드한다.
*발생한 문제: 사진이 완성된 후 서버에 업로드된 것은 원래의 그림이고 사진이 인용된 삼방 라이브러리를 선택하면 문제가 없습니다.

솔루션

 , , , , :
  • 시스템 카메라를 호출하여 사진을 찍는다:
  • 
        private void showCameraAction() {
            Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            if (hasSdcard()) {
                cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, FileProvider.getUriForFile(this,
                        this.getApplicationContext().getPackageName() + ".provider",
                        new File(Environment.getExternalStorageDirectory(), PHOTO_FILE_NAME)));
            }
            startActivityForResult(cameraIntent, 110);
        }
    

    요청은 마음대로 할 수 있고, 정규로 하는 것이 가장 좋다. (이 110은 비정규적) 여기서 안드로이드 7.0의 문제를 주의하고, 콘텐츠 제공자로 그림을 가져와야 한다.
  • 사진을 재단하기:
  •     /**
         *  
         * @param uri
         */
        private void crop(Uri uri) {
            //  
            Intent intent = new Intent("com.android.camera.action.CROP");
            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            intent.setDataAndType(uri, "image/*");
            intent.putExtra("crop", "true");
            //  ,1:1
            intent.putExtra("aspectX", 1);
            intent.putExtra("aspectY", 1);
            //  
            intent.putExtra("outputX", 250);
            intent.putExtra("outputY", 250);
            //  
            intent.putExtra("outputFormat", "JPEG");
            intent.putExtra("noFaceDetection", true);//  
            intent.putExtra("return-data", true);// true: uri,false: uri
            startActivityForResult(intent, 120);
        }
  • 반환 결과에 대한 처리
  • 
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            if (requestCode == 110&&resultCode==RESULT_OK) {
                if (hasSdcard()) {
                    tempFile = new File(Environment.getExternalStorageDirectory(),
                            PHOTO_FILE_NAME);
                    if (tempFile != null) {
                        crop(FileProvider.getUriForFile(this, this.getApplicationContext().getPackageName() + ".provider", tempFile));
                    } else {
                        ToastUtil.showToast(" ");
                    }
                } else {
                    ToastUtil.showToast(" , !");
                }
            } else if (requestCode == 120 && data != null &&resultCode==RESULT_OK) {
                Bundle extras = data.getExtras();
                if (extras != null) {
                    Bitmap photo = extras.getParcelable("data");
                    if (photo != null) {
                        Uri uri = saveBitmap(photo);
                        // 
                        sendimage(uri.getPath());
                    } else {
                        ToastUtil.showToast(" ");
                    }
                } else {
                    ToastUtil.showToast(" ");
                }
            }
        }
    

    주의: 요청 코드가 100일 때 코드는 되돌아오는 데이터에 대해null인지 아닌지를 판단하지 않습니다. 되돌아오는 데이터가 비어 있기 때문에 재단하는 방법이 실행될 때 그림은 경로에 따라 가져옵니다. 재단하는 리셋에서 데이터의 판단을 해야 합니다.
  • 재단한 그림을 저장하고 Url을 가져옵니다
  • 
        /**
         *  Bitmap file Uri
         *
         * @param bitmap
         * @return
         */
        private Uri saveBitmap(Bitmap bitmap) {
            File file = new File(Environment.getExternalStorageDirectory() + "/image");
            if (!file.exists())
                file.mkdirs();
            File imgFile = new File(file.getAbsolutePath() + PHOTO_FILE_NAME);
            if (imgFile.exists())
                imgFile.delete();
            try {
                FileOutputStream outputStream = new FileOutputStream(imgFile);
                bitmap.compress(Bitmap.CompressFormat.JPEG, 85, outputStream);
                outputStream.flush();
                outputStream.close();
                Uri uri = Uri.fromFile(imgFile);
                return uri;
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }
    

    우리가 사진을 올리는 것은 아리운oss에 직접 올린 다음에 되돌아오는 링크를 백그라운드에 가져오는 것이기 때문에 반드시 재단 후의 사진 경로를 얻어야 한다. 그래서 먼저 저장하고 경로를 받아서 업로드해야 한다. 구체적으로 업로드된 코드는 붙이지 않는다.
    갤러리에 있는 사진을 선택하면 제가 쓰는 세 가지 방법은 여기에 적혀 있습니다. 자신에게 맞는 개원 프로젝트를 찾을 수 있습니다.

    총결산

     , , , android , , ~~~
    

    좋은 웹페이지 즐겨찾기