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;

    } 

  • 相关阅读:
    【吐血整理】SVN命令行,Subversion的正确使用姿势,让版本控制更简单~
    【踩坑速记】MIUI系统BUG,调用系统相机拍照可能会带给你的一系列坑,将拍照适配方案进行到底!
    【福利大放送】不止是Android,Github超高影响力开源大放送,学习开发必备教科书
    【开发必备】今天我们来谈谈Android NDK动态链接库(so文件)的一些见解
    【使用教程】论Windows下必备的抓包工具Fiddler2如何安装证书(查看Https)
    【年终总结】我的2016,阅读本文大约需要一整年
    【知识必备】一文让你搞懂design设计的CoordinatorLayout和AppbarLayout联动,让Design设计更简单~
    【踩坑速记】开源日历控件,顺便全面解析开源库打包发布到Bintray/Jcenter全过程(新),让开源更简单~
    【知识必备】ezSQL,最好用的数据库操作类,让php操作sql更简单~
    Hive 8、Hive2 beeline 和 Hive jdbc
  • 原文地址:https://www.cnblogs.com/jacktu/p/2053817.html
Copyright © 2011-2022 走看看