android 图片上传

以前做项目在选择图片及上传这个功能上总是会有bug,要么是选择图片时内存溢出要么获取不到图片,今天整理了下图片上传的代码,发出来希望能帮到大家,也希望提出意见。




//部分代码如下

package com.example.imageupload;

import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

import android.app.Activity;
import android.content.DialogInterface;
import android.content.DialogInterface.OnCancelListener;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;

import com.example.imageupload.ActionSheet.OnActionSheetSelected;


public class MainActivity extends Activity implements OnActionSheetSelected, OnCancelListener {

  private static int CAMERA_REQUEST_CODE = 1;
  private static int GALLERY_REQUEST_CODE = 2;
  private static int CROP_REQUEST_CODE = 3;
  private Bitmap bm;
  private ImageView iv;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    iv = (ImageView) findViewById(R.id.iv);

    iv.setOnClickListener(new OnClickListener() {

      @Override
      public void onClick(View v) {
        // TODO Auto-generated method stub
        ActionSheet.showSheet(MainActivity.this, MainActivity.this, MainActivity.this, "1");
      }
    });
  }


  @Override
  protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // TODO Auto-generated method stub
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == CAMERA_REQUEST_CODE) {
      if (data == null) {
        return;
      } else {
        Bundle extras = data.getExtras();
        if (extras != null) {
          Bitmap bm = extras.getParcelable("data");
          Uri uri = saveBitmap(bm);
          startImageZoom(uri);
        }
      }
    } else if (requestCode == GALLERY_REQUEST_CODE) {
      if (data == null) {
        return;
      }
      Uri uri;
      uri = data.getData();
      Uri fileUri = convertUri(uri);
      startImageZoom(fileUri);
    } else if (requestCode == CROP_REQUEST_CODE) {
      if (data == null) {
        return;
      }
      Bundle extras = data.getExtras();
      if (extras == null) {
        return;
      }
      bm = extras.getParcelable("data");
      iv.setImageBitmap(bm);
      sendImage(bm);
    }
  }

  private void sendImage(Bitmap bm2) {
    // TODO Auto-generated method stub
    String ifpic = "";
    if (bm == null) {
      ifpic = "N";
    } else {
      ByteArrayOutputStream stream = new ByteArrayOutputStream();
      bm.compress(Bitmap.CompressFormat.PNG, 60, stream);
      byte[] bytes = stream.toByteArray();
      File tmpDir = new File(Environment.getExternalStorageDirectory() + "/com.example.imageupload");
      if (!tmpDir.exists()) {
        tmpDir.mkdir();
      }
      final File tempf = getFileFromBytes(bytes, tmpDir.getAbsolutePath() + "/avatertemp.png");
      ifpic = "Y";
      // 上传文件的网络操作
    }
  }


  private Uri saveBitmap(Bitmap bm) {
    File tmpDir = new File(Environment.getExternalStorageDirectory() + "/com.example.imageupload");
    if (!tmpDir.exists()) {
      tmpDir.mkdir();
    }
    File img = new File(tmpDir.getAbsolutePath() + "/avater.png");
    try {
      FileOutputStream fos = new FileOutputStream(img);
      bm.compress(Bitmap.CompressFormat.PNG, 85, fos);
      fos.flush();
      fos.close();
      return Uri.fromFile(img);
    } catch (FileNotFoundException e) {
      e.printStackTrace();
      return null;
    } catch (IOException e) {
      e.printStackTrace();
      return null;
    }
  }

  private Uri convertUri(Uri uri) {
    InputStream is = null;
    try {
      is = getContentResolver().openInputStream(uri);
      Bitmap bitmap = BitmapFactory.decodeStream(is);
      is.close();
      return saveBitmap(bitmap);
    } catch (FileNotFoundException e) {
      e.printStackTrace();
      return null;
    } catch (IOException e) {
      e.printStackTrace();
      return null;
    }
  }

  private void startImageZoom(Uri uri) {
    Intent intent = new Intent("com.android.camera.action.CROP");
    intent.setDataAndType(uri, "image/*");
    intent.putExtra("crop", "true");
    intent.putExtra("aspectX", 1);
    intent.putExtra("aspectY", 1);
    intent.putExtra("outputX", 150);
    intent.putExtra("outputY", 150);
    intent.putExtra("return-data", true);
    startActivityForResult(intent, CROP_REQUEST_CODE);
  }

  public static File getFileFromBytes(byte[] b, String outputFile) {
    BufferedOutputStream stream = null;
    File file = null;
    try {
      file = new File(outputFile);
      FileOutputStream fstream = new FileOutputStream(file);
      stream = new BufferedOutputStream(fstream);
      stream.write(b);
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      if (stream != null) {
        try {
          stream.close();
        } catch (IOException e1) {
          e1.printStackTrace();
        }
      }
    }
    return file;
  }


  @Override
  public void onCancel(DialogInterface dialog) {
    // TODO Auto-generated method stub

  }


  @Override
  public void onClick(int whichButton) {
    // TODO Auto-generated method stub
    if (whichButton == 1) {
      Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
      startActivityForResult(intent, CAMERA_REQUEST_CODE);
    } else if (whichButton == 2) {
      Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
      intent.setType("image/*");
      startActivityForResult(intent, GALLERY_REQUEST_CODE);
    }
  }

}
</pre><pre name="code" class="java">package com.example.imageupload;


import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface.OnCancelListener;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.view.WindowManager;
import android.widget.LinearLayout;
import android.widget.TextView;


public class ActionSheet {


    public interface OnActionSheetSelected {
        void onClick(int whichButton);
    }


    private ActionSheet() {
    }


    /**
     * 
     * @param context
     * @param actionSheetSelected
     * @param cancelListener
     * @param type
     *            1.上传照片 2.预览下载
     * @return
     */
    public static Dialog showSheet(Context context,
            final OnActionSheetSelected actionSheetSelected,
            OnCancelListener cancelListener, String type) {
        final Dialog dlg = new Dialog(context, R.style.ActionSheet);
        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        LinearLayout layout = (LinearLayout) inflater.inflate(
                R.layout.actionsheet, null);
        final int cFullFillWidth = 10000;
        layout.setMinimumWidth(cFullFillWidth);


        final TextView take_picture = (TextView) layout
                .findViewById(R.id.take_picture);
        final TextView choose_local = (TextView) layout
                .findViewById(R.id.choose_local);
        final TextView tv_download = (TextView) layout
                .findViewById(R.id.tv_download);
        final TextView tv_preview = (TextView) layout
                .findViewById(R.id.tv_preview);
        final TextView delete_pic = (TextView) layout
                .findViewById(R.id.delete_pic);
        final TextView mCancel = (TextView) layout.findViewById(R.id.cancel);
        if (type.equals("1")) {
            take_picture.setVisibility(View.VISIBLE);
            choose_local.setVisibility(View.VISIBLE);
            delete_pic.setVisibility(View.GONE);
            tv_download.setVisibility(View.GONE);
            tv_preview.setVisibility(View.GONE);
        } else if (type.equals("2")) {
            take_picture.setVisibility(View.GONE);
            choose_local.setVisibility(View.GONE);
            delete_pic.setVisibility(View.GONE);
            tv_download.setVisibility(View.VISIBLE);
            tv_preview.setVisibility(View.VISIBLE);
        }
        take_picture.setOnClickListener(new OnClickListener() {


            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                // 拍照
                actionSheetSelected.onClick(1);
                dlg.dismiss();
            }
        });


        choose_local.setOnClickListener(new OnClickListener() {


            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                // 选择本地照片
                actionSheetSelected.onClick(2);
                dlg.dismiss();
            }
        });


        tv_download.setOnClickListener(new OnClickListener() {


            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                // 预览
                actionSheetSelected.onClick(4);
                dlg.dismiss();
            }
        });


        tv_preview.setOnClickListener(new OnClickListener() {


            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                // 下载
                actionSheetSelected.onClick(3);
                dlg.dismiss();
            }
        });


        mCancel.setOnClickListener(new OnClickListener() {


            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                actionSheetSelected.onClick(6);
                dlg.dismiss();
            }
        });


        delete_pic.setOnClickListener(new OnClickListener() {


            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                actionSheetSelected.onClick(5);
                dlg.dismiss();
            }
        });


        Window w = dlg.getWindow();
        WindowManager.LayoutParams lp = w.getAttributes();
        lp.x = 0;
        final int cMakeBottom = -1000;
        lp.y = cMakeBottom;
        lp.gravity = Gravity.BOTTOM;
        dlg.onWindowAttributesChanged(lp);
        dlg.setCanceledOnTouchOutside(true);
        if (cancelListener != null)
            dlg.setOnCancelListener(cancelListener);


        dlg.setContentView(layout);
        dlg.show();


        return dlg;
    }


}
 

demo 下载地址:

http://download.csdn.net/detail/maweisky531/8983697


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值