Android 이미지 업로드 기능 구현

최근 개발 에서 사용자 의 의견 피드백 기능 과 관련 된 개발 은 사용자 가 입력 한 문자 나 제출 해 야 할 그림 입 니 다.효 과 는 위 챗 모멘트 와 같은 이미지 선택 기 와 비슷 합 니 다.처음에 유 니 버 설-image-loader 프레임 워 크 로 작 성 된 것 을 찾 았 습 니 다.실현 가능 하지만 메모리 가 넘 치고 해결 하기 어 려 웠 습 니 다.어 쩔 수 없 었 습 니 다.스스로 자 료 를 보고 스스로 쓸 준 비 를 했다.여기 서 본인 이 실현 하고 자 하 는 방향 을 말씀 드 리 겠 습 니 다.페이지 에 들 어가 면 바로 그림 을 선택 한 페이지 를 GridView 로 보 여 주 는 것 입 니 다.아이콘 추 가 를 클릭 할 때 Dialog 로 이 루어 지고 Dialog 에 해당 하 는 애니메이션 을 추가 하면 됩 니 다.그림 전시 페이지 에 들 어 갈 때 GridView 로 이 루어 집 니까?모든 그림 을 클릭 할 때 Dialog 와 listview 로 이 루어 집 니 다.다음은 해당 하 는 코드 로 이 루어 집 니 다.

private void showDialog() {
  View view = getLayoutInflater().inflate(R.layout.user_header_dialog, null);
  final Dialog dialog = new Dialog(this, R.style.transparentFrameWindowStyle);
  dialog.setContentView(view, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
  Window window = dialog.getWindow();
  //       
  window.setWindowAnimations(R.style.main_menu_animstyle);
  WindowManager.LayoutParams wl = window.getAttributes();
  wl.x = 0;
  wl.y = getWindowManager().getDefaultDisplay().getHeight();
  //                   
  wl.width = ViewGroup.LayoutParams.MATCH_PARENT;
  wl.height = ViewGroup.LayoutParams.WRAP_CONTENT;

  //       
  dialog.onWindowAttributesChanged(wl);
  //         
  dialog.setCanceledOnTouchOutside(true);
  dialog.show();

  btn_picture = (Button) window.findViewById(R.id.btn_picture);
  btn_photo = (Button) window.findViewById(R.id.btn_photo);
  btn_cancle = (Button) window.findViewById(R.id.btn_cancle);

  btn_picture.setOnClickListener(new View.OnClickListener() {//   
     @SuppressLint("InlinedApi")
     @Override
     public void onClick(View v) {
      Intent intent = new Intent(PhotoSelectActivity.this, AlbumActivity.class);
      startActivity(intent);
      dialog.dismiss();
     }
    });
  btn_photo.setOnClickListener(new View.OnClickListener() {//   
     @SuppressLint("InlinedApi")
     @Override
     public void onClick(View v) {
      photo();
      dialog.dismiss();
     }
    });
  btn_cancle.setOnClickListener(new View.OnClickListener() {//   
     @Override
     public void onClick(View v) {
      dialog.dismiss();
     }
    });
 }

이것 은 탄 상자 부분의 코드 입 니 다.여기 서 주의해 야 할 것 은 안 드 로 이 드 6.0 시스템 이 호출 될 때 특히 카메라 와 sd 권한 에 접근 하 는 문제 입 니 다.안 드 로 이 드 6.0 이하 의 시스템 과 다 릅 니 다.안 드 로 이 드 6.0 이하 의 시스템 은 안 드 로 이 드 Manifest.xml 파일 에 설정 하면 됩 니 다.android 6.0 및 6.0 이상 이면 AndroidManifest.xml 에서 설명 할 뿐만 아니 라 동적 신청 권한 도 필요 합 니 다.만약 에 신청 권한 이 없 으 면 프로그램의 반 짝 임 을 초래 할 수 있 습 니 다.여기 서 android 6.0 및 6.0 이상 에 적합 하지 않 습 니 다.android 6.0 및 6.0 이상 의 시스템 권한 에 대해 서 는 나중에 블 로그 에서 언급 할 것 입 니 다.

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  switch (requestCode) {
  case TAKE_PICTURE:
   if (Bimp.tempSelectBitmap.size() < 9 && resultCode == RESULT_OK) {
    File file = new File(Environment.getExternalStorageDirectory() + "/" + mImageFileName);
    mImagePath = file.getPath();
    Bitmap bitmapFromUrl = FileUtils.getBitmapFromUrl(mImagePath, 320, 480);
    String[] split = mImagePath.split("0/");
    String strUrl = "";
    if (split != null && split.length > 0) {
     strUrl = split[1];
    }
    //       
    FileUtils.setPicToView(PhotoSelectActivity.this,bitmapFromUrl, strUrl);
    //            
    File iconDir = FileUtils.getIconDir(PhotoSelectActivity.this);
    String absolutePath = iconDir.getAbsolutePath();
    String picPath = absolutePath + strUrl;

    ImageItem takePhoto = new ImageItem();
    takePhoto.setBitmap(bitmapFromUrl);
    takePhoto.setImagePath(picPath);
    Bimp.tempSelectBitmap.add(takePhoto);
   }
   break;
  }
 }

여 기 는 카 메 라 를 호출 하여 사진 을 찍 고 돌아 올 때 여 기 를 호출 합 니 다.그림 을 가 져 오 는 동시에 그림 을 압축 처리 하 는 동시에 sd 에 캐 시 하고 해당 하 는 경 로 를 가 져 옵 니 다.

/**
  *       
  */
 private void cleanImageList() {
  Bimp.max = 0;
  Bimp.tempSelectBitmap.clear();
 }

되 돌아 오 거나 물리 물리 적 되 돌아 오 는 키 를 눌 렀 을 때 정 의 된 정적 변 수 를 0 으로 할당 하고 그림 저장 시 정 의 된 정적 list 집합 을 비 워 야 합 니 다.

private void initPow() {
  View view = getLayoutInflater().inflate(R.layout.listview_popupwindows, null);

  final Dialog dialog = new Dialog(this, R.style.Dialog_Fullscreen);
  dialog.setContentView(view, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
  Window window = dialog.getWindow();
  //       
  window.setWindowAnimations(R.style.main_menu_animstyle);
  WindowManager.LayoutParams wl = window.getAttributes();
  wl.x = 0;
  wl.y = getWindowManager().getDefaultDisplay().getHeight();

  int height = 0;
  int h=(int) (mScreenHeight / 1.6);
  int listH=AlbumActivity.contentList.size()*DensityUtil.dip2px(AlbumActivity.this,80);
  if (listH==0) {
   height=h;
  }else{
   if (listH>h) {
    height=h;
   }else{
    height=listH;
   }
  }

  //                   
  wl.width = ViewGroup.LayoutParams.MATCH_PARENT;
  wl.height = height;
  //       
  dialog.onWindowAttributesChanged(wl);
  //         
  dialog.setCanceledOnTouchOutside(true);
  dialog.show();

  ListView listview = (ListView) window.findViewById(R.id.listview);
  ListAdapter listAdapter = new ListAdapter(AlbumActivity.this);
  listview.setAdapter(listAdapter);

  listview.setOnItemClickListener(new OnItemClickListener() {
   @Override
   public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
    dataList = (ArrayList<ImageItem>) AlbumActivity.contentList.get(arg2).imageList;
    String folderName = AlbumActivity.contentList.get(arg2).bucketName;
    tv_all.setText("" + folderName);
    gridImageAdapter = new AlbumGridViewAdapter(AlbumActivity.this, dataList, Bimp.tempSelectBitmap);
    agridView.setAdapter(gridImageAdapter);
    dialog.dismiss();
   }
  });

 }

여 기 는 그림 에서 전시 페이지 를 선택 하고 모든 그림 을 클릭 할 때의 탄 상 자 를 선택 합 니 다.하나의 Dialog 와 listview 로 이 루어 집 니 다.여기 서 주의해 야 할 것 은 listview 가 보 여 주 는 높이 문제 입 니 다.여기 서 모든 listview 항목 의 높이 와 화면의 높이 를 얻 을 수 있 습 니 다.만약 에 listview 항목 의 높이 와 화면 높이/1.6 이상 이면화면 높이/1.6 을 사용 합 니 다.만약 에 listview 항목 의 높이 와 화면 높이/1.6 보다 작 으 면 listview 항목 의 높이 를 사용 합 니 다.이렇게 하면 거의 실현 되 지 않 을 것 이다.다음은 운행 효과 이다.

원본 코드:Androidphoto
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기