• 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 > Android上传图片之调用系统拍照和从相册选择图片

Android上传图片之调用系统拍照和从相册选择图片

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

网友通过本文主要向大家介绍了android 调用系统相册,android调用相册,android调用手机相册,android 调用相册多选,android调用本地相册等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

Android上传图片之调用系统拍照和从相册选择图片


Android上传图片之调用系统拍照和从相册选择图片

前言:
万丈高楼平底起,万事起于微末。不知不觉距离上篇博文已近四个月,2015年12月17日下午发了第一篇博文,现在是2016年4月6日。时间间隔长的过分啊,我自己都看不下去了。原因呢?当然是自己的原因,其实是有很多时间来些博客的,但是这些时间都花在DOTA上了(还是太年轻啊)。请原谅我的过错…….
一、概述:
现在几乎应用都会用到上传图片的功能,而要上传图片,首先得选择图片,本文不针对如何上传图片到服务器(每个项目与服务器交互的方式不同,因此不写上传图片到服务器相关代码),只是对选择图片做简单的介绍,没有涉及到对图片的圆角处理与剪裁。本文主要涉及以下几个简单的知识点:

简单的调用系统拍照和系统相册选择图片 通过GridView实现动态添加图片的效果 Adapter使用的小技巧 Fragment中调用系统拍照该怎么获取数据(接口回调)

二、实现:
我们先来看项目目录:
工程目录
一个Adapter、两个Activity,一个Fragment、一个工具类,一目了然。有人在这里有疑问了,为什么是两个Activity?不是三个吗?没错,理论上ChooseActivity、ChooseFragmentActivity、BaseActivity加起来是三个,不过在这里BaseActivity是模拟实际项目抽离Activity中公共的代码,不做为视图,所以我不把BaseActivity算进去。
ChooseActivity是模拟Activity中调用系统拍照和系统相册选择图片,ChooseFragmentActivity中放入ChooseFragment模拟Fragment中调用系统拍照和系统相册选择图片(在这里我定死了一个Fragment模拟项目实际情况,实际情况一个Activity中会有多个Fragment),ImageUtils做一些简单的图片处理。SelectPicPopupWindow一个简单的PopupWindow,UploadImageAdapter动态选择图片上传的适配器。
先来点效果图吧:


图中展示的效果:点击默认图片弹出PopupWindow让用户选择拍照还是从相册选择图片(模拟器中不便使用拍照功能,本人在几台手机上试过没有问题,请到真机上测试),选择好图片后已选择好的图片可长按删除,这里控制了最多选择6张图片。

简单的调用系统拍照和系统相册选择图片
我们先来看是怎么调用系统拍照和从相册选择图片的:
申明组件与变量:

/**
     * 选择图片的返回码
     */
    public final static int SELECT_IMAGE_RESULT_CODE = 200; 
    /**
     * 当前选择的图片的路径
     */
    public String mImagePath;
    /**
     * 自定义的PopupWindow
     */
    private SelectPicPopupWindow menuWindow;

弹出PopupWindow:

    /**
     * 拍照或从图库选择图片(PopupWindow形式)
     */
    public void showPicturePopupWindow(){
        menuWindow = new SelectPicPopupWindow(this, new OnClickListener() {

            @Override
            public void onClick(View v) {
                // 隐藏弹出窗口
                menuWindow.dismiss();
                switch (v.getId()) {
                case R.id.takePhotoBtn:// 拍照
                    takePhoto();
                    break;
                case R.id.pickPhotoBtn:// 相册选择图片
                    pickPhoto();
                    break;
                case R.id.cancelBtn:// 取消
                    break;
                default:
                    break;
                }
            }
        });  
        menuWindow.showAtLocation(findViewById(R.id.choose_layout), Gravity.BOTTOM|Gravity.CENTER_HORIZONTAL, 0, 0);
    }   

其中最重要的就是拍照相关的takephoto方法了了,部分机型拍完照后没有数据返回,只能通过指定拍完照获得图片的存储路径来解决这个问题了。注释写的很详细,这里不再多解释了。但是注意一点指定路径的时候可能会出现拍完照后无法点确定返回,有的手机甚至会点击后挂掉,这个时候会报不是有效路径的错误。我遇到错误是在获取到的与应用相关联的路径后面再创建一个文件/xxxx,至于为什么不行,我也不知道原理。

private void takePhoto() {
        // 执行拍照前,应该先判断SD卡是否存在
        String SDState = Environment.getExternalStorageState();
        if (SDState.equals(Environment.MEDIA_MOUNTED)) {
            /**
             * 通过指定图片存储路径,解决部分机型onActivityResult回调 data返回为null的情况
             */
            //获取与应用相关联的路径
            String imageFilePath = getExternalFilesDir(Environment.DIRECTORY_PICTURES).getAbsolutePath();
            SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss", Locale.CHINA); 
            //根据当前时间生成图片的名称
            String timestamp = "/"+formatter.format(new Date())+".jpg"; 
            File imageFile = new File(imageFilePath,timestamp);// 通过路径创建保存文件
            mImagePath = imageFile.getAbsolutePath();
            Uri imageFileUri = Uri.fromFile(imageFile);// 获取文件的Uri
            Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            intent.putExtra(MediaStore.EXTRA_OUTPUT,imageFileUri);// 告诉相机拍摄完毕输出图片到指定的Uri
            startActivityForResult(intent, SELECT_IMAGE_RESULT_CODE);
        } else {
            Toast.makeText(this, "内存卡不存在!", Toast.LENGTH_LONG).show();
        }
    }

通过GridView实现动态添加图片的效果
其实你们更关心GridView动态增加item,item删除等效果:

申明组件和变量:

/**
     * 需要上传的图片路径  控制默认图片在最后面需要用LinkedList
     */
    private LinkedList dataList = new LinkedList();
    /**
     * 图片上传GridView
     */
    private GridView uploadGridView;
    /**
     * 图片上传Adapter
     */
    private UploadImageAdapter adapter;

初始化GridView和Adapter:

    uploadGridView = (GridView) findViewById(R.id.grid_upload_pictures);
        dataList.addLast(null);// 初始化第一个添加按钮数据
        adapter = new UploadImageAdapter(this, dataList);
        uploadGridView.setAdapter(adapter);
        uploadGridView.setOnItemClickListener(mItemClick);
        uploadGridView.setOnItemLongClickListener(mItemLongClick);

GridView的item点击监听和长按监听:

/**
     * 上传图片GridView Item单击监听
     */
    private OnItemClickListener mItemClick = new OnItemClickListener(){

        @Override
        public void onItemClick(AdapterView parent, View view, int position,
                long id) {
            if(parent.getItemAtPosition(position) == null){ // 添加图片
                //showPictureDailog();//Dialog形式
                showPicturePopupWindow();//PopupWindow形式
            }
        }
    };

    /**
     * 上传图片GridView Item长按监听
     */
    private OnItemLongClickListener mItemLongClick = new OnItemLongClickListener(){

        @Override
        public boolean onItemLongClick(AdapterView parent, View view,
                int position, long id) {
            if(parent.getItemAtPosition(position) != null){ // 长按删除
                dataList.remove(parent.getItemAtPosition(position));
                adapter.update(dataList); // 刷新图片
            }
            return true;
        }
    };

对于onActivityResult的回调如下:

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(requestCode == SELECT_IMAGE_RESULT_CODE && resultCode == RESULT_OK){
            String imagePath = "";
            if(data != null && data.getData() != null){//有数据返回直接使用返回的图片地址
                imagePath = ImageUtils.getFilePathByFileUri(this, data.getData());
   



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

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

  • Android中通过访问本地相册或者相机设置用户头像,android用户头像
  • Android上传图片之调用系统拍照和从相册选择图片
  • Android:支持多选的本地相册

相关文章

  • 2017-05-26Android开发常用小功能
  • 2017-05-26Volley的基本使用,Volley使用
  • 2017-05-26总结一下Android中主题(Theme)的正确玩法,androidtheme
  • 2017-05-26安卓6.0(棉花糖)新特性汇总,安卓6.0
  • 2017-05-26开源图表库MPAndroidChart使用介绍之饼状图&折线图&柱状图,图表mpandroidchart
  • 2017-05-26Android程序版本更新--通知栏更新下载安装,android程序版本
  • 2017-08-23Android 跳转到系统设置界面汇总
  • 2017-05-26匿名社交1--登陆,匿名社交1--
  • 2017-05-26A DB2 Performance Tuning Roadmap--Q-BASED A/A IMPLEMENATION
  • 2017-05-26天兔监控服务器和mysql,redis等监控

文章分类

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

最近更新的内容

    • JAVA Web day01--- Android小白的第一天学习笔记,day01---android
    • Android4.4访问外部存储,android4.4访问存储
    • 我的android学习经历4,android学习经历4
    • 安卓工程师笔试--2015--波导公司,安卓--2015--
    • Android之侧滑导航栏,android滑导航栏
    • 小明学习Linux运维实战演练
    • android工程师这么面试就能拿高薪,android高薪
    • debian8下apache2.4.x部署mysql认证的subversion
    • 项目优化之热更新,项目优化
    • 一个现代化的JSON库Moshi针对Android和Java,jsonandroid

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

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