个人界面 < 头像 > 图片选择(相册,拍照)--如何调用系统的相册,裁剪并且上传

##需求:个人界面的,个人头像图片的切换

方式一:点击开始切换头像的pop–相册选择

二:这里有两种方式,从相册选择和直接拍照,假设现在是从相册选择选择头像

*我在pop确定的点击方法中写了一个方法—–实现打开系统的相册并且获取到照片路径,在这里我们一开始就设置了请求码,用来区分onActivityResult,然后在本Activity中通过onActivityResult方法中通过请求码做相对应的处理

第一步:打开系统的相册

 /**
     * 从相册获取
     */
    protected void toAlbum() {
        try {
            Intent intentFromGallery = new Intent();
            intentFromGallery.setType("image/*"); // 设置文件类型
            intentFromGallery.setAction(Intent.ACTION_GET_CONTENT);
            LogUtil.e("第1步","第1步"+"第1步,开始从相册获取");

            startActivityForResult(intentFromGallery, IMAGE_REQUEST_CODE);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

第二步:获取图片(在onActivityResult()中处理)

 @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        // 结果码不等于取消时候
        if (resultCode != RESULT_CANCELED) {
            switch (requestCode) {
                case REQ_RESULT_EDITE_SET:
                    String text=data.getStringExtra(EditSetActivity.KEY_OBJ_CONTENT);
                    et_person_nickname.setText(""+text);
                    break;
                case IMAGE_REQUEST_CODE:  //这个是打开相册的请求码
                    LogUtil.e("第二步","第二步"+"第二步,打开系统裁剪工具");
                    LogUtil.e("第二步","第二步"+data.getData());
                    //content://media/external/images/media/9423

                    resizeImage(data.getData());  //第三步调用这个方法进行裁剪
                    break;
                case CAMERA_REQUEST_CODE:
                    if (FileUtil.isSDCardEnable()) {
                        File file = new File(Environment.getExternalStorageDirectory(), IMAGE_FILE_NAME);
                        resizeImage(Uri.fromFile(file));
                    } else {
//                        showToast("未找到存储卡,无法存储照片!");
                        ToastUtil.showShort(PersonalInfoActivity.this, "未找到存储卡,无法存储照片!");
                    }
                    break;
                case RESIZE_REQUEST_CODE:
                    if (data != null) {
                        showResizeImage(data);
                        LogUtil.e("第4步","第4步"+"第4步,裁剪完成");

                    }
                    break;
            }
        }
        super.onActivityResult(requestCode, resultCode, data);
    }

第三步:获取到图片,再调用系统裁剪,开始裁剪

 /**
     * 裁剪图片
     * @param uri
     */
    public void resizeImage(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);
        LogUtil.e("第三步","第三步"+"第三步,开始裁剪");
        //打开裁剪的activity,并且获取到裁剪图片(在第二步的RESIZE_REQUEST_CODE请求码中处理)
        startActivityForResult(intent, RESIZE_REQUEST_CODE);
    }

效果图

第四步:获取裁剪的图片,并且设置图片 (到此,图片相册设置头像完成)

    /**
     * 获取到裁剪的图片,(并且设置到imageview)
     * @param data
     */
    private void showResizeImage(Intent data) {
        Bundle extras = data.getExtras();
        if (extras != null) {
            Bitmap photo = extras.getParcelable("data");
            file = FileUtil.saveBitmapToFile(photo, Environment.getExternalStorageDirectory().toString(), IMAGE_FILE_NAME);
            Drawable drawable = new BitmapDrawable(photo);
            iv_person.setImageDrawable(drawable);
        }
    }

================华丽的分割线===============================

方式二:点击开始切换头像的pop–拍照

第一步:打开系统的相机

    /**
     * 拍照
     */
    protected void toCamera() {
        try {
            //MediaStore.ACTION_IMAGE_CAPTURE    表示拍照到指定的目录
            Intent intentFromCapture = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            // 判断存储卡是否可以用,可用进行存储
            if (FileUtil.isSDCardEnable()) {
                //参数(MediaStore.EXTRA_OUTPUT,uri)//图片保存为临时文件 == EXTRA_OUTPUT
                intentFromCapture.putExtra(MediaStore.EXTRA_OUTPUT,

                        Uri.fromFile(new File(Environment.getExternalStorageDirectory(), "face.jpg")));
            }
            startActivityForResult(intentFromCapture, CAMERA_REQUEST_CODE);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

第二步:拍完之后再onActivityResult中,通过请求码区分处理

onActivityResult() //方法中

   case CAMERA_REQUEST_CODE:  //拍完照的
                    if (FileUtil.isSDCardEnable()) {
                        File file = new File(Environment.getExternalStorageDirectory(), "face.jpg");

                        resizeImage(Uri.fromFile(file));
                    } else {
//                        showToast("未找到存储卡,无法存储照片!");
                        ToastUtil.showShort(PersonalInfoActivity.this, "未找到存储卡,无法存储照片!");
                    }
                    break;

第三步:获取到图片,再调用系统裁剪,开始裁剪

 /**
     * 裁剪图片
     * @param uri
     */
    public void resizeImage(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);
        LogUtil.e("第三步","第三步"+"第三步,开始裁剪");
        //打开裁剪的activity,并且获取到裁剪图片(在第二步的RESIZE_REQUEST_CODE请求码中处理)
        startActivityForResult(intent, RESIZE_REQUEST_CODE);
    }

第四步:获取裁剪的图片,并且设置图片 (到此,图片拍照设置头像完成)

    /**
     * 获取到裁剪的图片,(并且设置到imageview)
     * @param data
     */
    private void showResizeImage(Intent data) {
        Bundle extras = data.getExtras();
        if (extras != null) {
            Bitmap photo = extras.getParcelable("data");
            file = FileUtil.saveBitmapToFile(photo, Environment.getExternalStorageDirectory().toString(), IMAGE_FILE_NAME);
            Drawable drawable = new BitmapDrawable(photo);
            iv_person.setImageDrawable(drawable);
        }
    }

以上就是两种方式上传图像的方式

使用的utile贴在下面

FileUtil

package com.lzyc.ybtappcal.util;

import android.graphics.Bitmap;
import android.os.Environment;
import android.os.StatFs;

import com.lzyc.ybtappcal.app.App;
import com.lzyc.ybtappcal.exception.ServiceRulesException;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.DecimalFormat;

/*
 * Author: lovelin
 *
 * Created Date:2015-4-7
 * Copyright @ 2015 BU
 * Description: 文件工具类
 *
 * History:
 */
public class FileUtil {

    public static String appFile = App.AppFilePath;// 默认app文件目录
    public static final String baseFile = Environment
            .getExternalStorageDirectory() + File.separator;
    public static final String appBaseFile = baseFile + appFile
            + File.separator;
    boolean sdCardExist = Environment.getExternalStorageState().equals(
            Environment.MEDIA_MOUNTED);// 是否有存储设备

    public FileUtil() throws ServiceRulesException {
        if (!sdCardExist)
            throw new ServiceRulesException("请插入外部SD存储卡");
        File fileBase = new File(appBaseFile);
        if (!fileBase.exists())
            fileBase.mkdir();
    }

    /**
     * 创建一个文件目录
     *
     * @return void
     * @author Lucifer 2015-4-8 下午8:02:31
     */
    public static File creatFileDirectory(String path) {
        File file = new File(appBaseFile + File.separator + path);
        if (!file.exists()) {
            file.mkdirs();
        }
        return file;
    }

    /**
     * 创建一个文件
     *
     * @param path
     * @param fileName
     * @return File
     * @author Lucifer 2015-4-8 下午8:28:54
     */
    public static File creatNewFile(String path, String fileName) {
        File file = null;
        creatFileDirectory(path);
        file = new File(appBaseFile + File.separator + path + File.separator
                + fileName);
        return file;
    }

    /**
     * 将图片写入当前文件中
     *
     * @param photo
     * @param path
     * @param fileName
     * @return File
     * @author Lucifer 2015-4-8 下午8:38:17
     */
    public static File saveBitmapToFile(Bitmap photo, String path, String fileName) {
        File file = null;
        file = creatNewFile(path, fileName);
        FileOutputStream fOut = null;
        try {
            fOut = new FileOutputStream(file);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        photo.compress(Bitmap.CompressFormat.JPEG, 100, fOut);
        try {
            fOut.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            fOut.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return file;
    }

    /**
     * 写到sd卡
     * @param path
     * @param fileName
     * @param inputStream
     * @return File
     * @author luxf 2015-5-26 下午2:37:43
     */
    public static File write2SDFormInput(String path, String fileName,
                                  InputStream inputStream) {
        // 创建文件
        File file = creatNewFile(path, fileName);
        OutputStream outputStream = null;
        try {
            // 创建输出流
            outputStream = new FileOutputStream(file);
            // 创建缓冲区
            byte buffer[] = new byte[4 * 1024];
            // 写入数据
            while ((inputStream.read(buffer)) != -1) {
                outputStream.write(buffer);
            }
            // 清空缓存
            outputStream.flush();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                outputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return file;
    }

    /**
     * 获取文件大小
     *
     * @param file
     * @return long
     * @throws Exception
     * @author Administrator 2015-6-14 下午8:22:02
     */
    public static long getFileSize(File file) throws Exception {
        long size = 0;
        File flist[] = file.listFiles();
        for (int i = 0; i < flist.length; i++) {
            if (flist[i].isDirectory()) {
                size = size + getFileSize(flist[i]);
            } else {
                size = size + flist[i].length();
            }
        }
        return size;
    }

    /**
     * 转换文件 大小
     *
     * @param fileS
     * @return String
     * @author Administrator 2015-6-14 下午8:22:14
     */
    public static String FormetFileSize(long fileS) {// 转换文件大小
        DecimalFormat df = new DecimalFormat("#.00");
        String fileSizeString = "";
        if (fileS == 0) {
            fileSizeString = "0.0B";
        } else if (fileS < 1024) {
            fileSizeString = df.format((double) fileS) + "B";
        } else if (fileS < 1048576) {
            fileSizeString = df.format((double) fileS / 1024) + "K";
        } else if (fileS < 1073741824) {
            fileSizeString = df.format((double) fileS / 1048576) + "M";
        } else {
            fileSizeString = df.format((double) fileS / 1073741824) + "G";
        }
        return fileSizeString;
    }

    /**
     * 递归删除文件和文件夹
     *
     * @param file 要删除的根目录
     */
    public static void RecursionDeleteFile(File file) {
        if (file.isFile()) {
            file.delete();
            return;
        }
        if (file.isDirectory()) {
            File[] childFile = file.listFiles();
            if (childFile == null || childFile.length == 0) {
                file.delete();
                return;
            }
            for (File f : childFile) {
                RecursionDeleteFile(f);
            }
            file.delete();
        }
    }

    /**
     * 判断文件是否存在
     *
     * @param path
     * @param fileName
     * @return boolean
     * @author Administrator 2015-6-16 下午10:32:40
     */
    public static boolean isFileExistes(String path, String fileName) {
        try {
            File f = new File(path + fileName);
            if (!f.exists()) {
                return false;
            }
        } catch (Exception e) {
            return false;
        }
        return true;
    }

    /**
     * 判断SDCard是否可用
     *
     * @return
     */
    public static boolean isSDCardEnable() {
        return Environment.getExternalStorageState().equals(
                Environment.MEDIA_MOUNTED);

    }

    /**
     * 获取SD卡路径
     *
     * @return
     */
    public static String getSDCardPath() {
        return Environment.getExternalStorageDirectory().getAbsolutePath()
                + File.separator;
    }

    /**
     * 获取SD卡的剩余容量 单位byte
     *
     * @return
     */
    public static long getSDCardAllSize() {
        if (isSDCardEnable()) {
            StatFs stat = new StatFs(getSDCardPath());
            // 获取空闲的数据块的数量
            long availableBlocks = (long) stat.getAvailableBlocks() - 4;
            // 获取单个数据块的大小(byte)
            long freeBlocks = stat.getAvailableBlocks();
            return freeBlocks * availableBlocks;
        }
        return 0;
    }

    /**
     * 获取指定路径所在空间的剩余可用容量字节数,单位byte
     *
     * @param filePath
     * @return 容量字节 SDCard可用空间,内部存储可用空间
     */
    public static long getFreeBytes(String filePath) {
        // 如果是sd卡的下的路径,则获取sd卡可用容量
        if (filePath.startsWith(getSDCardPath())) {
            filePath = getSDCardPath();
        } else {// 如果是内部存储的路径,则获取内存存储的可用容量
            filePath = Environment.getDataDirectory().getAbsolutePath();
        }
        StatFs stat = new StatFs(filePath);
        long availableBlocks = (long) stat.getAvailableBlocks() - 4;
        return stat.getBlockSize() * availableBlocks;
    }
}
时间: 2024-08-02 15:11:16

个人界面 < 头像 > 图片选择(相册,拍照)--如何调用系统的相册,裁剪并且上传的相关文章

JavaScript把项目本地的图片或者图片的绝对路径转为base64字符串、blob对象在上传

主题: JavaScript把项目本地的图片或者图片的绝对路径转为base64字符串.blob对象在上传. 用处: 从本地选择图片上传,如项目规定只能选择本项目文件夹下的图像上传为头像等. 主要思想: 使用canvas.toDataURL()方法将图片的绝对路径转换为base64编码. 具体用法: 在这我们引用淘宝服务器上的一张图片举例: var imgSrc = "https://img.alicdn.com/bao/uploaded/TB1qimQIpXXXXXbXFXXSutbFXXX.j

wex5 教程 之 图文讲解 头像裁剪与上传

视频教程地址: http://v.youku.com/v_show/id_XMTgyMDE5NjEyOA==.html 一 效果演示 1.点击头像,弹出图片裁剪框 2,选择图片,裁剪,上传 3.上传成功后,头像图标更改 二 案例解读 案例目录 wex5为我们提供了一个picut图片裁剪案例,如下: 组件部局 加入file标签用来打开文件管理器进行图片选择,div标签进行图片预览,image标签为裁剪图片 后端服务 后端接收请求参数后,对路径进行了拼接,创建文件流,并创建文件,成功后将成功信息传给

android 用户头像,图片裁剪,上传并附带用户数据base64code 方式

图片上传的文件流我上一篇博客写了,这一篇我们说一下base64,base64上传方式就是将图片转换成base64码,然后把base64码以字符串的方式上传,然后服务器接收到以后再解码就可以了,相对于文件流来说比较简单: 用户头像上传我们首先要获得图片的url然后再裁剪图片,然后把裁剪后的图片转换成base64然后在上传: 下边是安卓端代码: 首先我们要获得裁剪后的图片:一,选择图片: 代码如下,通过对话框选择获得图片的方式: activity: /* * 提示对话框 */ private voi

file API+JCrop 选择、裁剪并上传头像

file API,直接读取本地文件,绕过了后台处理再返回前台的过程,使编程更简单.fileAPI和JCrop的结合使用上传头像. 1.html部分 <input id="demo" type="file" onchange="showPic();"/> <img id="avatar" src=""> 2.fileAPI预览图片(jquery) <script type=&qu

Android图片系列(1)-------调用系统相册与相机获取图片

Android开发过程中,我们经常需要获取图片,你可以通过获取手机相册的图片,也可以调用相机拍照获取图片.这里主要讲这两个获取图片的方式,并记录其中遇到的小问题. 调用相册获取图片 这个功能非常简单,这里不多说了,这里贴出关键代码 Intent openAlbumIntent = new Intent(Intent.ACTION_GET_CONTENT); openAlbumIntent.setType("image/*"); startActivityForResult(openAl

mui开发app之cropper裁剪后上传头像的实现

在大多数app项目中,都需要对用户头像的上传,之前做web开发的时候,我主要是通过input type=file的标签实现的,上传后,使用php对图片进行裁剪,这种方式比较传统简单. 此次app开发中我需要做到用户选择本地相册或者进行拍照,对照片进行裁剪,最后更新本地头像和服务器端的图片 我将要结合mui,cropper,jquery开发 实现思路: 1.用户点击头像,打开actionsheet 2.选择图片或者拍照后返回的图片绝对地址传入单独的裁剪页面,跳转到裁剪页面 3.裁剪页面裁剪后选择确

调用系统相机,相册功能

一开始的思路是这一块的功能单独出去;这样处理又会碰见很多问题. 还是集成在Activity中可能效果更好些, 而且三星的手机调用系统相机会导致调用的Activity会重启生命周期,如果是在fragment中调用的,会碰见更多的问题,做外包的伤不起,想深入下这个问题都没时间,暂时记录下在Activity中解决问题的方法,方便后面使用时直接拿来用. 比如在Activity中点击某个按钮,弹出一个对话框,选择拍照还是选择图片 mButton.setOnClickListener(new OnClick

struts2+jsp+jquery+Jcrop实现图片裁剪并上传

<1> 使用html标签上传需要裁剪的大图. <2> 在页面呈现大图,使用Jcrop(Jquery)对大图进行裁剪,并且可以进行预览. <3> 选择好截取部分之后发送数据给Action,在服务器端使用 Java API 对大图进行裁剪. <4> 保存大图裁剪好的头像到指定目录,完成业务. 下面一步一步做: 第一步:使用html标签上传需要裁剪的大图. 这一步说白了也就是使用Struts2自带的FileUpload功能,把图片进行上传具体代码如下: html页

前台Jcrop配合后台Graphics实现图片裁剪并上传

Jcrop:一个功能强大的图片裁剪插件 版本:Jcrop v0.9.12 VS版本:vs2015 下载地址:http://code.ciaoca.com/jquery/jcrop/version/Jcrop-0.9.12.zip 本文主要讲的是,在前台通过file选择图片,然后用Jcrop裁剪好图片后,把偏移量等参数传值到后台,在后台通过Graphics进行图片的截取并上传到服务器,显示一下重点代码 HTML 部分<div class="example"> <img