• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Android > 上传图像之裁剪,图像裁剪

上传图像之裁剪,图像裁剪

作者:网友 字体:[增加 减小] 来源:互联网 时间:2017-05-26

网友通过本文主要向大家介绍了点击按钮上传图像,loading 上传图像,上传图像选择文件,html上传图像,图像调整好上传等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

上传图像之裁剪,图像裁剪


  一个但凡涉及到用户信息的应用,总少不了设置用户图像这个小功能。之前做这块的时候只是简单的复制粘贴导致最近再做这个功能的时候,却发现问题很多,拍照及相册选择后启动系统裁剪要不崩溃要不就是没有返回数据,今天好好梳理一下这个功能。
  调用系统拍照界面:

private void startTakePhotoActivity() {
        temp_file_name = String.valueOf(System.currentTimeMillis()) + FILE_SUFFIX;
        temp_photo_uri = Uri.fromFile(new File(DIRECTORY, temp_file_name));
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        // 默认情况下不需要指定拍照生成图片的uri 系统默认返回照片缩略图uri
        // 如果用户指定了生成图片的uri 系统就不会返回
        intent.putExtra(MediaStore.EXTRA_OUTPUT, temp_photo_uri);
        startActivityForResult(intent, FLAG_CAMERA);
}

  调用系统相册界面:

private void startPickPhotoActivity() {
        // temp_file_name未赋值 在这里对其初始化
        temp_file_name = System.currentTimeMillis() + FILE_SUFFIX;
        Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
        startActivityForResult(intent, FLAG_GALLERY);
}

  这里补充一下,很多网友都说android4.4以上怎么怎么了,其实不用想这么多,看看代码是不是还和以前没什么两样?看到有网友专门针对4.4以上版本及以下版本判断,也只是因为4.4以上版本从相册选择图片时提供另外一个意图 Intent.ACTION_OPEN_DOCUMENT ,可以使用最近浏览过的图片,代码量却大了不少。所以个人觉得就一个选择图片没必要做这么复杂,因此我还是使用相册来选图。
  调用系统裁剪界面:

private void startCropPhotoActivity(Uri orgUri) {
        // 保存剪裁生成图片的uri
        String _fileName = "_" + System.currentTimeMillis() + ".jpg";
        temp_photo_uri = Uri.fromFile(new File(DIRECTORY, _fileName));
        // 剪裁图片意图
        Intent intent = new Intent("com.android.camera.action.CROP");
        intent.setDataAndType(orgUri, "image/*");
        intent.putExtra("crop", "true");
        intent.putExtra("aspectX", 1);
        intent.putExtra("aspectY", 1);
        intent.putExtra("outputX", 640);
        intent.putExtra("outputY", 640);
        intent.putExtra("scale", true);
        // 将剪切的图片保存到目标Uri中 注释同拍照
        intent.putExtra(MediaStore.EXTRA_OUTPUT, temp_photo_uri);
        intent.putExtra("return-data", false);
        intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG);
        intent.putExtra("noFaceDetection", true);
        startActivityForResult(intent, FLAG_CROP);
}

 

  虽然代码中已经加了注释,还是要和大伙啰嗦一下上面红色加粗的代码。之前没有好好理解才导致在这里栽个大跟头。
  intent.putExtra(MediaStore.EXTRA_OUTPUT, temp_photo_uri):用来指定拍照或裁剪后生成的图片存储在哪里,如果指定了这个参数,那么拍照后就不会返回生成缩略图的Uri,当然再用 intent.getData 势必会 NullPointException,这时候再要用到Uri就得从文件来或者干脆造个成员变量来保存这个Uri。
  到这里问题基本上已经解决,但是现在是一个云的时代,大多对android系统个性后的ROM,相册这个功能看起来是很强大,但给开发者带来却是无尽的痛苦,接下来说说这个 云相册 引发的问题。
  回到我的代码,拍照已经OK,就是从相册选择图片在 onActivityResult 返回得到 resultCode 始终为 0 (正常 RESULT_OK = -1),经过对比返回的Uri发现问题并不是大家所说的Uri格式不对,而是在测试的手机上 根本找不到选择的照片 。但为什么还显示在这里,并且选择后返回的Uri看起来和本地照片没什么区别,这些三方厂商给开发者挖了这么大个坑坑。好了,问题找到就好办了,既然是图片不存在,那我们就得让用户知道选择的这张图片不在手机上,避免了程序崩溃也提高了用户体验,如果有力气的话,完全可以不用系统的相册来选择这样就不会发生上面提到的这个问题。
  说了这么多,好像废话一箩筐,针对这次出现的问题,参考了好几个网友提供的代码,里面不乏有值得我借鉴的东西,也给大伙分享一下,CameraActivity是我修改过的,在android4.4及4.1上测试通过。有空再封装一个工具类出来。
  
  代码下载:http://pan.baidu.com/s/1miq120g

 

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 上传图像之裁剪,图像裁剪

相关文章

  • 2017-05-26Android7.0 Phone应用源码分析(三) phone拒接流程分析,android7.0拒接
  • 2017-05-26手机游戏渠道SDK接入工具项目分享(二)万事开头难,手机游戏sdk
  • 2017-05-26android注册页面,android页面
  • 2017-05-26ImageLoader,androidimageloader
  • 2017-05-26Linux简介及常用命令使用5--linux shell编程入门,5--linux编程入门
  • 2017-05-26Android—基于微信开放平台v3SDK,开发微信支付填坑。,androidv3sdk
  • 2017-05-26RK3288开发过程中遇到的问题点和解决方法之Framework,rk3288framework
  • 2017-05-26Android 手机卫士--绑定sim卡序列号,androidsim
  • 2017-05-26安卓7.0首批截图公布:惊现汉堡菜单,安卓汉堡
  • 2017-05-26【Android】如何写一个JsBridge

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 7.5.4 WebView文件下载
    • 自定义轮播图片框架的使用,自定义播图片框架
    • Xamarin +vs2015 Android 开发GPS loaction 返回 null 小结,xamarinvs2015
    • 生日星座自动匹配,生日星座匹配
    • Android开发学习——应用安装过程,android开发
    • 2.3.9 RatingBar(星级评分条)
    • android graphic(15)—fence
    • React-Native系列Android——Touch事件原理及状态效果
    • Android Native crash日志分析,androidcrash
    • Android 5.0(包含5.0以下版本) 获取栈顶应用程序包名,android包名

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有