Android 에 서 는 로 컬 앨범 이나 카 메 라 를 통 해 사용자 프로필 사진 인 스 턴 스 를 설정 합 니 다.

현재 거의 모든 앱 은 사용자 가 가입 할 때 프로필 사진 을 설정 하 는 수요 가 있 는데 크게 세 가지 상황 으로 나 뉜 다.
(1)로 컬 앨범 의 그림 을 가 져 와 재단 한 후 프로필 사진 으로 한다.
(2)핸드폰 카 메 라 를 작 동시 키 고 사진 을 찍 은 다음 에 재단한다.
(3)앱 에 자신 이 가지 고 있 는 이미지 자원 을 추가 하여 사용자 가 선택 할 수 있 도록 한다(인성 화 되 지 않 아 현재 잘 사용 되 지 않 는 다).
이번에 우 리 는 로 컬 앨범 과 카 메 라 를 촬영 하 는 방법 으로 프로필 사진 을 설정 하고 다음 과 같은 방향 을 실현 하 는 것 을 간단하게 소개 합 니 다.
(1)startActivity ForResult 방법 을 통 해 시스템 앨범 을 호출 하 는 Intent 와 카메라 로 사진 을 찍 는 Intent 를 각각 전달 하여 선택 합 니 다.
(2)안 드 로 이 드 시스템 에서 자체 적 으로 가 져 온 그림 편집 을 호출 하여 그림 의 편집 을 실현 하고 onActivity Result 방법 에서 데 이 터 를 가 져 옵 니 다.
이번 프 리 젠 테 이 션 효 과 는 다음 과 같 습 니 다.
     
간단 한 레이아웃 파일 은 더 이상 군말 하지 않 습 니 다.이번 시험 은 암시 적 인 intent 호출 카메라 와 로 컬 앨범 을 사용 합 니 다.설정 목록 에 권한 을 추가 하지 않 아 도 호출 할 수 있 습 니 다.
자바 구현 코드 는 다음 과 같 습 니 다:

import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;
import java.io.File;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
  private Button buttonLocal, buttonCamera;
  private ImageView imageView;
  //         (       SD     )
  private static final File USER_ICON = new File(Environment.getExternalStorageDirectory(), "user_icon.jpg");
  //     (       、  、    )
  private static final int CODE_PHOTO_REQUEST = 1;
  private static final int CODE_CAMERA_REQUEST = 2;
  private static final int CODE_PHOTO_CLIP = 3;
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    buttonLocal = (Button) findViewById(R.id.buttonLocal);
    buttonCamera = (Button) findViewById(R.id.buttonCamera);
    imageView = (ImageView) findViewById(R.id.imageView);
    buttonLocal.setOnClickListener(this);
    buttonCamera.setOnClickListener(this);
  }
  //      
  @Override
  public void onClick(View view) {
    switch (view.getId()) {
      case R.id.buttonLocal:
        //           
        getPicFromLocal();
        break;
      case R.id.buttonCamera:
        //         
        getPicFromCamera();
        break;
      default:
        break;
    }
  }
  /**
   *          
   */
  private void getPicFromLocal() {
    Intent intent = new Intent();
    //          
    intent.setAction(Intent.ACTION_GET_CONTENT);
    intent.setType("image/*");
    //         
//    intent.setAction(Intent.ACTION_PICK);
//    intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
//        "image/*");
    startActivityForResult(intent, CODE_PHOTO_REQUEST);
  }
  /**
   *           ,
   *          
   */
  private void getPicFromCamera() {
    Intent intent = new Intent();
    intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
    //                      
    intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(USER_ICON));
    startActivityForResult(intent, CODE_CAMERA_REQUEST);
  }
  /**
   *     
   *
   * @param uri
   */
  private void photoClip(Uri uri) {
    //             
    Intent intent = new Intent();
    intent.setAction("com.android.camera.action.CROP");
    intent.setDataAndType(uri, "image/*");
    //     crop=true       Intent      VIEW   
    intent.putExtra("crop", "true");
    // aspectX aspectY       
    intent.putExtra("aspectX", 1);
    intent.putExtra("aspectY", 1);
    /*outputX outputY        
     *         ,         
     *     binder        1M  
     *  TransactionTooLargeException
     */
    intent.putExtra("outputX", 150);
    intent.putExtra("outputY", 150);
    intent.putExtra("return-data", true);
    startActivityForResult(intent, CODE_PHOTO_CLIP);
  }
  /**
   *              ,        View
   */
  private void setImageToHeadView(Intent intent) {
    Bundle extras = intent.getExtras();
    if (extras != null) {
      Bitmap photo = extras.getParcelable("data");
      imageView.setImageBitmap(photo);
    }
  }
  @Override
  protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    //              ,  
    if (resultCode == RESULT_CANCELED) {
      Toast.makeText(MainActivity.this, "  ", Toast.LENGTH_LONG).show();
      return;
    }
    switch (requestCode) {
      case CODE_CAMERA_REQUEST:
        if (USER_ICON.exists()) {
          photoClip(Uri.fromFile(USER_ICON));
        }
        break;
      case CODE_PHOTO_REQUEST:
        if (data != null) {
          photoClip(data.getData());
        }
        break;
      case CODE_PHOTO_CLIP:
        if (data != null) {
          setImageToHeadView(data);
        }
        break;
    }
    super.onActivityResult(requestCode, resultCode, data);
  }
}

여기 서 주의해 야 할 것 은 그림 을 재단 할 때 길이 와 폭 을 너무 크게 설정 하지 마 세 요.그렇지 않 으 면 binder 체제 의 캐 시 크기 제한(핸드폰 설정 의 영향 을 받 음)을 초과 하지 않 습 니 다.TransactionToo Large Exception 에 보고 하고 코드 에 상세 한 표 시 를 했 습 니 다.이 를 실현 할 때 주의 하 시기 바 랍 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기