Android 프로젝트 실전 프로필 사진 선택 기능

그림 선택
1.1 목표
1.그림 과 같은 기능 구현:앨범 과 카메라 옵션 이 나타 날 수 있 음
2.선택 한 그림 을 재단 할 수 있 습 니 다.
 
1.2 기능 실현
1.2.1 Intent 도구 클래스 패키지
패키지 그림 선택 과 그림 재단 도구 클래스

/**
  *     (      )
  * @param uri     uri
  * @return
  */
 public static Intent getPhotoSelectIntent(Uri uri){
  Intent take = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
  take.addCategory(Intent.CATEGORY_DEFAULT);
  take.putExtra(MediaStore.EXTRA_OUTPUT, uri);
  Intent pics = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
  Intent chose= Intent.createChooser(pics,"    ");
  chose.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Parcelable[]{take});
  return chose;
 }
 /**
  *     
  * @param inputUri        
  * @param outputUri        
  * @param width     
  * @param height     
  * @return
  */
 public static Intent getImageCropIntent(Uri inputUri, Uri outputUri, int width, int height) {
  Intent intent = new Intent("com.android.camera.action.CROP");
  intent.setDataAndType(inputUri, "image/*");
  //     crop=true       Intent      VIEW   
  intent.putExtra("crop", "true");
  intent.putExtra("scale", true); //    
  intent.putExtra("scaleUpIfNeeded", true); //    
  // aspectX aspectY        
  intent.putExtra("aspectX", width); //    X     
  intent.putExtra("aspectY", height);
  // outputX outputY       ,           ,   
  intent.putExtra("outputX", width); //   X     
  intent.putExtra("outputY", height);
  intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
  intent.putExtra("noFaceDetection", true);
  intent.putExtra(MediaStore.EXTRA_OUTPUT, outputUri);
  intent.putExtra("return-data", false); //         
  return intent;
 }
1.2.2 클릭 사진 선택 이벤트 추가

b.ivAvatar.setOnClickListener {
   mTakePhotoFile = File(getPicPath() + File.separator + System.currentTimeMillis() + ".jpeg")
   val uri = Uri.fromFile(mTakePhotoFile)
   startActivityForResult(IntentUtils.getPhotoSelectIntent( uri), TAKE_PHOTO_REQ)
  }
1.2.3 이미지 선택 과 재단 피드백 처리
그림 재단 에 필요 한 Uri 는 content:/형식 과 유사 하기 때문에 content Uri 를 가 져 오 는 도구 클래스 를 패키지 해 야 합 니 다.

public static Uri getContentUri(Context context, File file) {
  String filePath = file.getAbsolutePath();
  Cursor cursor = context.getContentResolver().query(
    MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
    new String[] { MediaStore.Images.Media._ID },
    MediaStore.Images.Media.DATA + "=? ",
    new String[] { filePath }, null);
  if (cursor != null && cursor.moveToFirst()) {
   int id = cursor.getInt(cursor
     .getColumnIndex(MediaStore.MediaColumns._ID));
   Uri baseUri = Uri.parse("content://media/external/images/media");
   return Uri.withAppendedPath(baseUri, "" + id);
  } else {
   if (file.exists()) {
    ContentValues values = new ContentValues();
    values.put(MediaStore.Images.Media.DATA, filePath);
    return context.getContentResolver().insert(
      MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
   } else {
    return null;
   }
  }
 }
처리 피드백 결과

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
  super.onActivityResult(requestCode, resultCode, data)
  if(resultCode != -1) {
   return
  }
  when (requestCode) {
   TAKE_PHOTO_REQ -> {
    //         
    mCutPhotoFile = File(getPicPath() + File.separator + "avatar_" + System.currentTimeMillis() + "jpeg")
    val cutUri = Uri.fromFile(mCutPhotoFile)
    if (data != null){
     startActivityForResult(IntentUtils.getImageCropIntent(data.data, cutUri, 200, 200), CUT_PHOTO_REQ)
    } else {
     val uri = UriUtils.getContentUri(applicationContext, mTakePhotoFile)
     startActivityForResult(IntentUtils.getImageCropIntent(uri, cutUri, 200, 200), CUT_PHOTO_REQ)
    }
   }
   CUT_PHOTO_REQ -> {
    //         
   }
  }
 }
1.2.4 Android 7.0 적합
1. res/xml/provider_paths.xml 경로 자체 변경

<paths xmlns:android="http://schemas.android.com/apk/res/android">
 <external-path path="Android/data/com/example/sunmoon/images" name="sdcard_files" />
 <external-files-path path="Android/data/com/example/sunmoon/images" name="camera_has_sdcard"/>
 <files-path path="Android/data/com/example/sunmoon/other"  name="camera_no_sdcard"/>
 <external-path path="Android/data/com/example/sunmoon" name="files_root" />
 <external-path path="." name="external_storage_root" />
</paths>
2.manifests 설정 패키지 이름 변경

...
<application>
  <provider
   android:name="android.support.v4.content.FileProvider"
   android:authorities="com.example.sunmoon.provider"
   android:exported="false"
   android:grantUriPermissions="true">
   <meta-data
    android:name="android.support.FILE_PROVIDER_PATHS"
    android:resource="@xml/provider_paths"/>
  </provider>
 ...
</application>
...
총결산
위 에서 말 한 것 은 편집장 님 께 서 소개 해 주신 안 드 로 이 드 프로젝트 실전 프로필 사진 선택 기능 입 니 다.여러분 께 도움 이 되 셨 으 면 좋 겠 습 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남 겨 주세요.편집장 님 께 서 바로 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기