`
用牛奶把自己灌醉
  • 浏览: 12849 次
社区版块
存档分类
最新评论

Android开发实现调用相册图片并裁剪上传功能

 
阅读更多
该功能用到了Apache的开源项目simplecropimage.
下面代码中CropImage类为SimpleCropImage中的类,该类需要在Manifest中进行注册。simplecropimage用到的依赖类在附件中。
直接上代码:
    /** 打开相册(第一步)*/
    private static final String IMAGE_UNSPECIFIED = "image/*";

    private void openPhotos() {
        Intent intent = new Intent(Intent.ACTION_PICK);
//        intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
        intent.setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);
        intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, IMAGE_UNSPECIFIED);
        startActivityForResult(intent, REQUEST_PHOTOS);
    }

   @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {

        switch (requestCode) {
            case REQUEST_CUTRESULT:
                dealCutResult(resultCode, data);
                break;
            case REQUEST_PHOTOS:
                dealPhotosResult(resultCode, data);
                break;
        }

    private void dealPhotosResult(int resultCode, Intent data) {
        if (Activity.RESULT_OK == resultCode) {
            if (data != null) {
                // 从相册获取照片uri
                startPhotoCut(data.getData());
            }
        } else {
            if(GlobleParams.isEnglish){
               shortToast("Upload canceled");
            }else{
               shortToast("您已经取消了上传操作");
            }
        }
    }

    /**开始裁剪(第二步)*/
    public void startPhotoCut(Uri uri) {
        String realPathFromURI = getRealPathFromURI(uri);
        if(realPathFromURI == null){
            return;
        }
        File file = new File(realPathFromURI);
        Intent intent = new Intent(App.getInstance(), CropImage.class);

        // tell CropImage activity to look for image to crop
        intent.putExtra(CropImage.IMAGE_PATH, file.getAbsolutePath());

        // allow CropImage activity to rescale image
        intent.putExtra(CropImage.SCALE, true);

        // if the aspect ratio is fixed to ratio 3/2
        intent.putExtra(CropImage.ASPECT_X, 0);
        intent.putExtra(CropImage.ASPECT_Y, 0);

        // start activity CropImage with certain request code and listen
        // for result
        startActivityForResult(intent, REQUEST_CUTRESULT);
    }
  private void dealCutResult(int resultCode, Intent data) {
        if (resultCode == Activity.RESULT_OK) {
            String path = data.getStringExtra(CropImage.IMAGE_PATH);
            // if nothing received
            if (path == null) {return;}
            uploadPhoto(path);

        } else {
            if(GlobleParams.isEnglish){
                shortToast("Upload canceled");
            }else{
                shortToast("您已经取消了上传操作");
            }
        }
    }
    /**开始上传(第三步)*/
    public void uploadPhoto(String path) {
        File file = new File(path);
        MyLog.i("wmm", "file path" + file.getAbsolutePath()    + "size   " + file.getName() + "   " + file.length());
        final UserInfo user = App.getInstance().getUser();
        MyLog.i("wmm", user.toString());

        Bitmap photo = BitmapFactory.decodeFile(file.getPath());
        iv_head_icon.setImageBitmap  (BitmapUtil.getRoundedCornerBitmap(photo));
        if (user != null) {
            Api.uploadavatar(App.getInstance(), user.username, user.password, path, new DefaultResponsehandler() {
                @Override
                public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
                    super.onSuccess(statusCode, headers, response);
                    MyLog.i("wmm", "uploadPhoto   onSuccess   " + response.toString());
                    Api.loadDrawable(user.head_icon + "?time=" + System.currentTimeMillis(), iv_head_icon, R.drawable.default_head_icon);
//                    Picasso.with(App.getInstance()).load(user.head_icon).skipMemoryCache().placeholder(R.drawable.default_head_icon).into(iv_head_icon);
                }

                @Override
                public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) {
                    super.onFailure(statusCode, headers, responseString, throwable);
                    MyLog.i("wmm", "uploadPhoto   onFailure   " + responseString.toString());

                }

                @Override
                public void onSuccess(int statusCode, Header[] headers, JSONArray response) {
                    super.onSuccess(statusCode, headers, response);
                    MyLog.i("wmm", "uploadPhoto   onSuccess   1" + response.toString());
                }

                @Override
                public void onSuccess(int statusCode, Header[] headers, String responseString) {
                    super.onSuccess(statusCode, headers, responseString);
                    MyLog.i("wmm", "uploadPhoto   onSuccess   2" + responseString.toString());
                }

                @Override
                public void onFailure(int statusCode, Header[] headers, Throwable throwable, JSONObject errorResponse) {
                    super.onFailure(statusCode, headers, throwable, errorResponse);
                    MyLog.i("wmm", "uploadPhoto   onFailure  1   " + statusCode + "     " + throwable.getMessage());
                }

                @Override
                public void onFailure(int statusCode, Header[] headers, Throwable throwable, JSONArray errorResponse) {
                    super.onFailure(statusCode, headers, throwable, errorResponse);
                    MyLog.i("wmm", "uploadPhoto   onFailure  2   " + errorResponse.toString());
                }

                @Override
                public void onFinish() {
                    super.onFinish();
                    MyLog.i("wmm", "upload onFinish");
                }

                @Override
                public void onStart() {
                    super.onStart();
                    MyLog.i("wmm", "upload onStart");
                }
            });
        }
    }
   public String getRealPathFromURI(Uri contentUri) {
        String res = null;
        String[] proj = {MediaStore.Images.Media.DATA};
        Cursor cursor = getActivity().getContentResolver().query(contentUri, proj, null, null, null);
        if (cursor != null && cursor.moveToFirst()) {
            int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
            res = cursor.getString(column_index);
        }
        if(cursor != null){
            cursor.close();
        }
        return res;
    }

分享到:
评论

相关推荐

    creator实现调用android相机相册,并实现裁剪后图片的上传和下载

    总之,实现“creator调用android相机相册并裁剪后上传下载”的功能,涉及到Android的权限管理、Intent交互、图片处理、文件操作以及网络请求等多个技术点,通过合理的代码组织和设计,可以构建出稳定可靠的图片处理...

    Android调用系统相机和相册并裁剪图片

    以上就是Android中调用系统相机拍照、从相册选择图片以及裁剪图片的基本实现。在实际开发中,还需要考虑权限管理(如请求存储权限)、图片压缩、异步处理等细节问题,以确保功能的完整性和用户体验。同时,由于...

    Android调用系统相机/相册并裁剪源码

    这就是在Android中调用系统相机和相册并裁剪图片的基本流程。实际开发中,还需要考虑权限管理、图片质量、裁剪比例自定义、兼容不同Android版本等问题。`testDemo02`项目应该包含了这些功能的具体实现,你可以通过...

    使用Android系统调用裁剪图片并保存demo

    在Android开发中,有时我们需要实现一个功能,让用户能够选择图片并进行裁剪,然后将裁剪后的图片保存到设备上。这个过程涉及到Android系统的图片选择API、图片裁剪API以及文件操作。以下是对这个功能的详细讲解。 ...

    Android7.0调用系统相册、拍照裁剪及压缩

    在Android应用开发中,与用户交互获取图片是常见的需求,比如使用系统相册选择图片、拍照后裁剪以及对图片进行压缩。在Android 7.0(API Level 24)及以上版本,由于权限管理的加强,这些操作变得更加复杂,需要处理...

    拍照和相册选取图片并裁剪得到路径

    "拍照和相册选取图片并裁剪得到路径"这个功能是移动应用中常见的一个模块,涉及到Android和iOS系统的多媒体处理、权限管理以及网络上传等多个知识点。 1. **多媒体权限管理**: 在Android 6.0(API级别23)及以上...

    Android编程实现调用系统图库与裁剪图片功能

    本文实例讲述了Android编程实现调用系统图库与裁剪图片功能。分享给大家供大家参考,具体如下: 在Android开发中,调用系统图库和裁剪照片是很常见的需求。相对于自己实现这种功能,直接调用系统具有诸多优点,如...

    android相机拍照,存储 调用相册, 图片旋转,裁剪

    在Android开发中,涉及到相机拍照、图片存储、调用相册、图片旋转和裁剪等是常见的功能需求。这些功能的实现涉及到多个Android系统API的使用,包括相机API、文件I/O、媒体库以及图像处理库。下面我们将详细探讨这些...

    Android Studio的项目,实现拍照及相册自定义裁剪

    这个名为"Android Studio的项目,实现拍照及相册自定义裁剪"的实践,是Android应用开发中的一个重要环节,它涵盖了Android设备上的相机使用、图片选择以及自定义图片裁剪等功能。下面将详细阐述这些关键知识点。 1....

    Android, 拍照,选择相册,裁剪,上传照片

    在Android平台上,开发一款应用涉及到拍照、选择相册、裁剪和上传照片的功能,需要对Android系统的多媒体处理、权限管理、Intent机制以及网络上传等有深入的理解。以下将详细阐述这些知识点。 一、Android相机API ...

    Android + <调用相机拍照 & 选择相册> + 数码相机

    【TakePicture】项目分为两大部分,分别从不同开发场景出发。 随着市场上不同版本、机型手机的出现,老项目迭代维护成本高。...2. 上传多张照片并做压缩处理,图片可实现在线预览,伸缩放大等功能。

    调用相机或相册裁剪设置图片源码

    在移动应用开发中,用户经常需要上传或者选择头像、照片等图像,这时就需要调用设备的相机或相册功能,并且可能还需要进行图片的裁剪操作以满足特定尺寸的需求。本文将详细介绍如何在Android平台上实现这个功能,...

    Android实现拍照、选择相册图片并裁剪功能

    在Android应用开发中,用户经常需要能够选择图片...通过以上步骤,你可以在Android应用中实现完整的拍照、选择相册图片并裁剪的功能。记得在实际开发中,要处理可能出现的各种异常和用户反馈,以提供良好的用户体验。

    基于Android studio实现的拍照及图片裁剪、调用系统相册项目源码

    在Android应用开发中,涉及到用户交互的图像处理功能是非常常见的,比如拍照、图片裁剪以及调用系统相册。这个项目源码是基于Android Studio的一个示例,它演示了如何实现这些功能。以下是对这些知识点的详细解释: ...

    android调用相机拍照或从相册取照片(加裁剪功能)

    至此,我们就实现了在Android应用中调用相机拍照、从相册选取照片以及对图片进行裁剪的功能。`readme.txt`文件可能是对这个过程的简单说明或使用步骤,帮助开发者更好地理解代码实现。 在实际项目中,可以根据需求...

    Android 通过拍照或相册选择图片并裁剪(精简版)

    在Android开发中,用户可能需要从手机的相机或者相册中选择图片,并进行裁剪以适应特定的需求。本文将详细讲解如何实现这一功能,提供一个精简且完整的解决方案。 首先,我们需要添加必要的权限到AndroidManifest....

    android studio写的图片选择上传

    总的来说,Android Studio中的图片选择上传功能涉及到了Android的Intent机制、第三方库的使用、网络请求、文件操作以及权限管理等多个方面。理解并掌握这些知识点,对于开发出用户体验良好的Android应用至关重要。

    Android从照相机和相册中获取图片并且裁剪

    在Android开发中,获取用户设备上的图片以及进行裁剪是一项常见的功能,这通常涉及到相机应用接口的调用和系统相册的访问。本教程将详细讲解如何实现这一过程。 首先,我们要了解Android中的Intent机制,它是应用...

Global site tag (gtag.js) - Google Analytics