zoukankan      html  css  js  c++  java
  • 图片上传,包括从相册选取与拍照上传

    转自论坛,还没试

    类似开心001的照片上传功能,刚做的时候搜了些例子,有的好用有的不好用,最后东拼西凑,乱七八糟的写了一个。有不对的或更好的方法希望大家指点。下面开始贴代码:两个监听事件:

    // 拍照上传

    private OnClickListener mUploadClickListener = new OnClickListener() {


    public void onClick(View v) {

    // 调用相机

    Intent mIntent = new Intent("android.media.action.IMAGE_CAPTURE");


    // 图片存储路径,可自定义

    File tmpFile = new File(Environment.getExternalStorageDirectory(),

    System.currentTimeMillis() + ".jpg");


    // 获取这个图片的URI

    originalUri = Uri.fromFile(tmpFile);//这是个实例变量,方便下面获取图片的时候用

    mIntent.putExtra(MediaStore.EXTRA_OUTPUT, originalUri);


    startActivityForResult(mIntent, ACTIVITY_IMAGE_CAPTURE);

    }

    };


    // 打开相册

    private OnClickListener mPicListClickListener = new OnClickListener() {


    public void onClick(View v) {

    // 调用相册

    Intent mIntent= new Intent(Intent.ACTION_GET_CONTENT);

    mIntent.addCategory(Intent.CATEGORY_OPENABLE);

    mIntent.setType(MIME_TYPE_IMAGE_JPEG);


    startActivityForResult(mIntent, ACTIVITY_GET_IMAGE);

    }

    };


    监听事件写好了,怎么调用不用我说了吧。这是个startActivityForResult事件,对应的我们肯定得有个onActivityResult,贴之

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {


    if (resultCode != RESULT_OK) {

    return;

    }


    Bitmap bm = null;


    ContentResolver resolver = getContentResolver();

    String filePath = "/sdcard/bengxin/bx_upload_tmp.jpg";//这个是暂存图片的路径

    FileOutputStream output = null;

    try {

    // 创建暂存图片

    if (Utils.CreateFile(filePath)) {

    output = new FileOutputStream(filePath);

    } else {

    throw new Exception("内部错误");

    }

    if (requestCode == ACTIVITY_GET_IMAGE) {

    // 获得图片的uri

    originalUri = data.getData();

    PS:拍照的那个URI我们在上面已经获取了

    }


    /**** 获取图片开始 ****/

    //mContent是上传的图片byte[]数组,得到这个后随便怎么处理,当然你也可以直接用fileInput流

    fileInput = (FileInputStream) resolver.openInputStream(Uri

    .parse(originalUri.toString()));


    // 将图片内容解析成字节数组

    mContent = getBytesFromInputStream(fileInput, 3500000);


    fileInput.close();


    // 将字节数组转换为ImageView可调用的Bitmap对象

    bm = getPicFromBytes(mContent, null);


    /********* 获取图片完了 ************/


    // 将图片缩小到指定比例并且保存到缓存文件

    float scale = ((float) 210) / ((float) bm.getWidth());

    bm = Utils.smallBmp(bm, scale);//这个缩小功能是自己写的方法

    //将Bitmap读到文件中去,注意这个是压缩,那个100是压缩比,0-100,越大质量越好

    bm.compress(CompressFormat.JPEG, 100, output);

    output.flush();

    output.close();


    /*********为了更快速的将图片上传,将缩小后的图片保存到暂存文件***************/

    fileInput = new FileInputStream(filePath);


    // 将图片内容解析成字节数组

    mContent = getBytesFromInputStream(fileInput, 3500000);

    fileInput.close();

    /*********************/


    // 预览一下你的图片吧

    bm = bm.createScaledBitmap(bm, mButtomUpload.getWidth() - 10,

    mButtomUpload.getHeight() - 10, true);

    mButtomUpload.setImageBitmap(bm);

    mButtomUpload.setPadding(2, 2, 2, 2);


    } catch (Exception e) {

    Utils.exceptionShow(CheckIn.this, e.getMessage());

    }

    }



    附赠两个方法,一个将字节转换成bitmap,一个获取byte[]数组

    private static Bitmap getPicFromBytes(byte[] bytes,

    BitmapFactory.Options opts) {


    if (bytes != null)

    if (opts != null)

    return BitmapFactory.decodeByteArray(bytes, 0, bytes.length,

    opts);

    else

    return BitmapFactory.decodeByteArray(bytes, 0, bytes.length);

    return null;

    }


    private static byte[] getBytesFromInputStream(InputStream is, int bufsiz)

    throws IOException {

    int total = 0;

    byte[] bytes = new byte[4096];

    ByteBuffer bb = ByteBuffer.allocate(bufsiz);


    while (true) {

    int read = is.read(bytes);

    if (read == -1)

    break;

    bb.put(bytes, 0, read);

    total += read;

    }


    byte[] content = new byte[total];

    bb.flip();

    bb.get(content, 0, total);


    return content;

    } 

  • 相关阅读:
    Stage划分原理
    Spark转换和动作算子
    Spark运行原理
    Scrapy数据持久化
    在实际工作中Eclipse常用的快捷键
    关于Linux(CentOS6.5)中文输入法、中文桌面可视化等问题
    Eclipse无法启动报An internal error occurred during: "reload maven project". java.lang.NullPointerExceptio错原因及解析
    在Eclipse中复制导入项目并且修改原来的项目名字,项目后面的括号显示原来项目的名字!
    response.sendRedirect()与request.getRequestDispatcher("/index.jsp").forward(request, response)两者辨析
    MyEclipse/Eclipse导出jar方法
  • 原文地址:https://www.cnblogs.com/jacktu/p/2053817.html
Copyright © 2011-2022 走看看