Android 그림 또는 사진 선택 그림 기능 인 스 턴 스 코드

머리말
일반적으로 회사 에 서 는 사용자 의 얼굴 을 바 꾸 는 기능 이 있 으 며,갤러리 에서 사진 을 선택 하거나 사진 을 찍 어야 하 며,기본적으로 그림 을 재단 하기 도 한다.최근 에 시간 을 내 서 간단 한 포장 을 해서 나중에 사용 하기에 편리 하 다.주로 건축 자 모델 을 사 용 했 고 체인 호출 이 편리 하고 간단 하 다.그림 경 로 를 사용자 정의 할 수 있 고 재단 과 간단 한 압축 기능 이 추가 되 어 있 습 니 다.다음 과 같은 실례 를 사용 합 니 다.

ChooseImageTask.getInstance()
    .createBuilder(this)
    .setFileName("    ")//    
    .setFilePath("    ")//    
    .setIsCrop(false)//  
    .setIsCompress(true)//  
    .setOnSelectListener(this)//      
    .setType(ChooseImageTask.TYPE_GALLERY)//  
    .perform();
앨범 사진

/**
  *          
  *
  * @param activity
  * @param builder
  */
 private void takeImageFromGallery(Activity activity, Builder builder) {
  OnSelectListener mOnSelectListener = builder.mOnSelectListener;
  Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
  ComponentName componentName = intent.resolveActivity(activity.getPackageManager());
  if (componentName != null) {
   activity.startActivityForResult(intent, builder.mType);
  } else {
   if (mOnSelectListener != null) {
    mOnSelectListener.onError("takeImageFromGallery---> Activity is illegal");
   }
  }
 }
설명:ComponentName componentName = intent.resolveActivity(activity.getPackageManager())현재 점프 하 는 activity 를 검사 하 는 데 사 용 됩 니 다.뒤의 몇 개의 점프 도 마찬가지 로 추 가 됩 니 다.
갤러리 이미지

/**
  *             
  *
  * @param activity
  */
 private void takeImageFromAlbum(Activity activity, Builder builder) {
  OnSelectListener mOnSelectListener = builder.mOnSelectListener;
  Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);//api19  
//  Intent intent = new Intent(Intent.ACTION_GET_CONTENT);//api19  
  intent.setType("image/*");
  ComponentName componentName = intent.resolveActivity(activity.getPackageManager());
  if (componentName != null) {
   activity.startActivityForResult(intent, builder.mType);
  } else {
   if (mOnSelectListener != null) {
    mOnSelectListener.onError("takeImageFromAlbum---> Activity is illegal");
   }
  }
 }
주의:ACTION 은 안 드 로 이 드 버 전에 따라 달라 집 니 다.
사진 을 찍다
사진 촬영 이 특이 한 것 은 Android 7.0 이후 URI 읽 기 에 Fileprovider 방식 을 사 용 했 기 때문에 특수 처리 해 야 합 니 다.res 폴 더 에 xml 폴 더 를 만 들 고 xml 폴 더 아래 에 사진 을 찍 는 저장 경 로 를 만 듭 니 다.이름 은 마음대로 지 을 수 있 지만 찾 을 때 일치 해 야 합 니 다.

 /**
  *   
  *
  * @param activity
  */
 private void takePhoto(Activity activity, ChooseImageTask.Builder builder) {
  ChooseImageTask.OnSelectListener mOnSelectListener = builder.mOnSelectListener;
  Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
  //  activity    
  if (takePictureIntent.resolveActivity(activity.getPackageManager()) != null) {
   //               
   Uri fileUri = UriUtils.getUri(activity, new File(builder.mFilePath, builder.mFileName));
   takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
   activity.startActivityForResult(takePictureIntent, builder.mType);
  } else {
   if (mOnSelectListener != null) {
    mOnSelectListener.onError("takePhoto---> Activity is illegal");
   }
  }
 }

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
 <external-path
  name="external"
  path="." />
</paths>
그리고 manifest 에서 현재 경 로 를 참조 해 야 합 니 다.다음 과 같 습 니 다.

<provider
   android:name="android.support.v4.content.FileProvider"
   android:authorities="${applicationId}.fileprovider"
   android:exported="false"
   android:grantUriPermissions="true">
   <meta-data
    android:name="android.support.FILE_PROVIDER_PATHS"
    android:resource="@xml/choose_image" />
  </provider>
사진 찍 는 URI.

 /**
  *       URI
  *
  * @param context
  * @param file
  * @return
  */
 public static Uri getUri(Context context, File file) {
  Uri uri;
  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
   uri = FileProvider.getUriForFile(context,
     FileProvider    , file);
  } else {
   uri = Uri.fromFile(file);
  }
  //         URI    ,        
  return uri;
 }
주의:  android:authorities="${applicationId}.fileprovider"안에 build.gradle 에 있 는 applicationId 값 을 작성 해 야 합 니 다.가방 이름 을 작성 할 수 없습니다.applicationId 에 대해 모 르 는 것 은 스스로 볼 수 있 습 니 다.
그림 을 재단 하 다

/**
  *        
  *
  * @param activity
  * @param uri
  * @param outputUri
  */
 public void handleCropImage(Activity activity, Uri uri, Uri outputUri) {
  //            intent
  Intent intent = new Intent("com.android.camera.action.CROP");
  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
   //                 Uri      
   intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
   intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
  }
  intent.setDataAndType(uri, "image/*");
  intent.putExtra("scale", true);
  //            
  intent.putExtra("aspectX", 1);
  intent.putExtra("aspectY", 1);
  //             
  intent.putExtra("outputX", 350);
  intent.putExtra("outputY", 350);
  //     
  intent.putExtra("noFaceDetection", true);
  //       
  intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
  //   false        
  intent.putExtra("return-data", false);
  //         
  intent.putExtra(MediaStore.EXTRA_OUTPUT, outputUri);
  activity.startActivityForResult(intent, ChooseImageTask.TYPE_CROP);
 }
메모:intent.putExtra("return-data", false);반환 값 이 true 이면 bitmap 로 돌아 갑 니 다.통일 적 으로 압축 한 후에 리 셋 형식 으로 되 돌아 오기 위해 서 반환 값 은 false 이 고 outputUri 로 출력 합 니 다.
그림 회전 각도 처리
어떤 휴대 전 화 는 사진 을 찍 거나 사진 을 선택 할 때 회전 각도 에 문제 가 생 길 수 있 으 므 로 회전 각도 에 따라 새로운 그림 을 다시 만들어 요구 에 부합 해 야 한다.

/**
  *           
  *
  * @param path       
  * @return        
  */
 public static int getBitmapDegree(String path) {
  int degree = 0;
  try {
   //           ,    EXIF  
   ExifInterface exifInterface = new ExifInterface(path);
   //          
   int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION,
     ExifInterface.ORIENTATION_NORMAL);
   switch (orientation) {
    case ExifInterface.ORIENTATION_ROTATE_90:
     degree = 90;
     break;
    case ExifInterface.ORIENTATION_ROTATE_180:
     degree = 180;
     break;
    case ExifInterface.ORIENTATION_ROTATE_270:
     degree = 270;
     break;
   }
  } catch (IOException e) {
   e.printStackTrace();
  }
  return degree;
 }

/**
  *     ,          。
  *
  * @param bitmap     
  * @param degrees        
  * @return Bitmap       
  */
 public static Bitmap rotateBitmap(Bitmap bitmap, int degrees) {
  if (degrees == 0 || null == bitmap) {
   return bitmap;
  }
  Matrix matrix = new Matrix();
  matrix.setRotate(degrees, bitmap.getWidth() / 2, bitmap.getHeight() / 2);
  Bitmap bmp = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
  bitmap.recycle();
  return bmp;
 }
리 셋 처리
activity 의 onActivity Result 에서 그림 선택 결과 에 대한 리 셋 을 처리 한 다음 유형 에 따라 다른 결 과 를 처리 합 니 다.

 /**
  *   Activity        
  *
  * @param requestCode
  * @param resultCode
  * @param data
  */
 public void handleResult(int requestCode, int resultCode, @Nullable Intent data, Builder builder) {
  if (resultCode != Activity.RESULT_OK) {
   return;
  }

  switch (requestCode) {
   case TYPE_PHOTO://   
    handlePhoto(builder);
    break;
   case TYPE_ALBUM://
    //       
    handleGallery(data, builder);
    break;
   case TYPE_GALLERY://       
    //       
    handleGallery(data, builder);
    break;
   case TYPE_CROP:
    handleCropResult(builder);
    break;
  }
 }
그림 압축
선택 한 그림 을 순환 적 으로 압축 합 니 다.

/**
  *       
  *
  * @param image
  * @return
  */
 public static Bitmap compressImage(Bitmap image) {

  ByteArrayOutputStream baos = new ByteArrayOutputStream();
  image.compress(Bitmap.CompressFormat.JPEG, 100, baos);//      ,  100     ,          baos 
  int options = 100;
  while (baos.toByteArray().length / 1024 > 100) { //               100kb,      
   baos.reset();//  baos   baos
   //      :     ,     :     ,100   ,0    ,     :          
   image.compress(Bitmap.CompressFormat.JPEG, options, baos);//    options%,          baos 
   options -= 10;//     10
  }
  ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());//       baos   ByteArrayInputStream 
  Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);// ByteArrayInputStream      
  return bitmap;
 }
총결산
대체적으로 과정 은 위 와 같 지만 반드시 Android 6.0 이후 에 동적 권한 을 신청 해 야 합 니 다.모든 기능 은 demo 라 고 쓰 여 있 고 GitHub 를 올 렸 습 니 다.필요 하 다 면 GitHub 로 이동 하 십시오.문제 가 발생 하면 댓 글 을 달 아 주세요사진 또는 사진 선택  ( 로 컬 다운로드
자,이상 이 이 글 의 모든 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가 치 를 가지 기 를 바 랍 니 다.여러분 의 저희 에 대한 지지 에 감 사 드 립 니 다.

좋은 웹페이지 즐겨찾기