android-调用系统的ContentPrivder获取单张图片实现剪切做头像及源代码下载

首先讲述这个小项目的特色

1、调用系统的相冊应用获取单张图片

2、对单张图片进行剪切方便做成指定大小的头像图片

3、对获取图片的结果进行解析,使用三种方式进行。

首先看看效果图:

打开app,进入注界面。点击获取图片button

调用系统的图片选择器,选择图库,

点击图片。返回获取到图片

点击剪切图片button,调用系统的图片剪切工具

获取到剪切之后的图片

以下详细请看代码:

public class MainActivity extends Activity implements OnClickListener{

    private TextView backTx,sureTx;//一个返回键,一个确定键
    private ImageView imageView;//显示获取的图片的ImageView
    private Button getPic,getPic2Cut;
    //两个button,分别实现获取图片、对图片进行剪切
    private final int REQUEST = 11;//获取图片的请求值
    private final int HEAD_IMAGE_ZOOM = 12;//图片剪切的请求值
    private Uri uri;
    private String TAG = MainActivity.class.getSimpleName();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.main);
        init();
        setclickListener();
    }
    private void init(){
        backTx = (TextView) findViewById(R.id.cancle);
        sureTx = (TextView) findViewById(R.id.ok);
        imageView = (ImageView) findViewById(R.id.image);
        getPic = (Button) findViewById(R.id.get_pic);
        getPic2Cut = (Button) findViewById(R.id.get_pic_to_cut);
    }
    private void setclickListener(){
        backTx.setOnClickListener(this);
        sureTx.setOnClickListener(this);
        getPic.setOnClickListener(this);
        getPic2Cut.setOnClickListener(this);
    }
    //调用系统相冊获取图片的方法,很easy
    private void loadData(){
        Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
        intent.setType("image/*");
        startActivityForResult(intent, REQUEST);
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
    }
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.cancle:
            finish();
            break;
        case R.id.ok:
            Toast.makeText(MainActivity.this, "图片已经获取到", Toast.LENGTH_SHORT).show();
            break;
        case R.id.get_pic:
            loadData();
            break;
        case R.id.get_pic_to_cut:
            startPhotoZoom(uri);
            break;
        }
    }
    @SuppressWarnings("deprecation")
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == REQUEST && resultCode == RESULT_OK) {
            uri = data.getData();

            /**
             * 方法一:
             * 直接使用ImageView的方法设置图片地址URI就可以。
             * 只是这样的方式当图片很大的时候,easy出现OOM异常。慎用!

*/
            imageView.setImageURI(uri);

            /**
             * 方法二:
             * 依据获取的URI进行查询,获取到图片后进行缩放,不会出现OOM异常
             */
            Cursor cursor = managedQuery(uri, null, null, null, null);
            if (cursor != null) {
                Log.i(TAG, "记录数="+cursor.getCount());
                if (cursor.moveToFirst()) {
                    int index = cursor.getColumnIndexOrThrow(Media.DATA);
                    String path = cursor.getString(index);
                    BitmapFactory.Options options = new BitmapFactory.Options();
                    options.inSampleSize = 2;
                    Bitmap bitmap = BitmapFactory.decodeFile(path, options);
                    imageView.setImageBitmap(bitmap);
                }
            }else {
                Toast.makeText(MainActivity.this, "无法获取图片数据", Toast.LENGTH_SHORT).show();
            }

            /**
             * 方法三:
             * 因为managedQuery这种方法已经不再推荐使用
             * 故使用CursorLoader类完毕查询操作
             */
            CursorLoader cursorLoader = new CursorLoader(MainActivity.this,
                    uri, null, null, null, null);
            Cursor cursor2 = cursorLoader.loadInBackground();
            if (cursor2 != null) {
                Log.i(TAG, "记录数="+cursor2.getCount());
                if (cursor2.moveToFirst()) {
                    int index = cursor2.getColumnIndexOrThrow(Media.DATA);
                    String path = cursor2.getString(index);
                    BitmapFactory.Options options = new BitmapFactory.Options();
                    options.inSampleSize = 2;
                    Bitmap bitmap = BitmapFactory.decodeFile(path, options);
                    imageView.setImageBitmap(bitmap);
                }
            }else {
                Toast.makeText(MainActivity.this, "无法获取图片数据", Toast.LENGTH_SHORT).show();
            }
        }else if (requestCode == HEAD_IMAGE_ZOOM && resultCode == RESULT_OK) {
            Bundle bundle = data.getExtras();
            if (bundle != null) {
                Bitmap bitmap = bundle.getParcelable("data");
                imageView.setImageBitmap(bitmap);
            }else {
                Toast.makeText(MainActivity.this, "图片剪切失败", Toast.LENGTH_SHORT).show();
            }
        }else if (requestCode == HEAD_IMAGE_ZOOM) {
            Toast.makeText(MainActivity.this, "图片取消剪切", Toast.LENGTH_SHORT).show();
        }
    }

    /**
     * 调用系统的程序进行图片的剪切操作
     * 获取指定大小的剪切图片,方便做成头像
     * @param uri
     */
    private void startPhotoZoom(Uri uri) {
          Intent intent = new Intent("com.android.camera.action.CROP");
          intent.setDataAndType(uri, "image/*");
          // 以下这个crop=true是设置在开启的Intent中设置显示的VIEW可裁剪
          intent.putExtra("crop", "true");
          // aspectX aspectY 是宽高的比例
          intent.putExtra("aspectX", 1);
          intent.putExtra("aspectY", 1);
          // outputX outputY 是裁剪图片宽高
          intent.putExtra("outputX", 80);
          intent.putExtra("outputY", 80);
          intent.putExtra("return-data", true);
          startActivityForResult(intent, HEAD_IMAGE_ZOOM);
         }
}

上面代码获取返回值的过程中,使用了三种方法,详细实现的时候仅仅是用一种方法就可以。推荐使用第三种方式。

值得一提的是。该小项目须要在配置文件里增加一下权限值:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

没有此权限则报错!

该小项目很有用。大部分app中都有获取用户头像、进行用户头像的设置的操作,所以大家能够參考,假设有什么不正确的地方,请大家积极留言交流,共同进步。谢谢~!【握手】

源码下载

时间: 2024-10-12 20:10:32

android-调用系统的ContentPrivder获取单张图片实现剪切做头像及源代码下载的相关文章

Android调用系统相册和相机选择图片并显示在imageview中

Android调用系统相册和相机选择图片并显示在imageview中,在系统调用相机拍摄中,直接返回的是经过压缩处理后的图像,当你直接把返还后的图片放在imageview中时 图片就会非常的模糊,所以要经过先存放在sd中,然后在处理并显示.当调用系统相册时,因为Android系统从4.4版本以后系统不再返回真实的uri路径,而是封装过后的uri路径,所以当你写代码时必须注意,4.4是一个分水岭,4.4以上的版本必须就通过解析和相应的处理才能获取到真实的uri路径. 先上程序运行的结果. 这个是调

android 调用系统相机拍照 获取原图

好吧,为了这个问题又折腾了一整天.之前在网上找来的方法,如果在onActivityResult中直接用data.getData()的方式来生成bitmap,其实获取的是拍照生成的缩略图!看看尺寸就知道了.如果要获取原图,还需要一番折腾(特别是对于手里这个Samsung i9000)——之前朋友在不同的机型上使用的方法在我这里一直报错,且属于那种uncaught的错误-.- 话说回来,具体的折腾方法如下(如果不幸你看到了,希望不要“折疼了”): 在拍照的出发按钮的点击事件中写入如下代码: toCa

android 调用系统相机获取图片、调用系统相册获取图片,并对图片进行截取

打开系统相册获取图片并截取,代码相对简单 1 Intent intent = new Intent(Intent.ACTION_GET_CONTENT,null); 2 intent.setType("image/*"); 3 intent.putExtra("crop", "true"); 4 5 //WIDTH 和 HEIGHT指的是截取框的宽高比例,如设WIDTH = 1,HEIGHT = 1,截取框就为正方形 6 intent.putEx

Android调用系统相机、自定义相机、处理大图片

Android调用系统相机和自定义相机实例 本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显示出来,该例子也会涉及到Android加载大图片时候的处理(避免OOM),还有简要提一下有些人SurfaceView出现黑屏的原因. Android应用拍照的两种方式,下面为两种形式的Demo展示出来的效果.    知识点: 一.调用系统自带的相机应用 二.自定义我们自己的拍照界面 三.关于计算机解析图片原理(如何正确加载图片到Android应用中) 所需

Android 调用系统分享文字、图片、文件,可直达微信、朋友圈、QQ、QQ空间、微博

原文:Android 调用系统分享文字.图片.文件,可直达微信.朋友圈.QQ.QQ空间.微博 兼容SDK 18以上的系统,直接调用系统分享功能,分享文本.图片.文件到第三方APP,如:微信.QQ.微博等 因为偷懒,可直达微信.朋友圈.QQ.QQ空间.微博的分享仅写了图片分享的,其他的文本.文件分享不常用到,就不写了. 具体图片分享区分单张图片分享和多张图片分享,详情请看代码: import android.content.ComponentName; import android.content

android调用系统相机拍照并保存在本地

import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.util.Calendar; import java.util.Locale; import android.annotation.SuppressLint; import android.app.Activity; import an

Android 调用系统相机以及相册源码

Android 调用系统相机拍照.以及相册.完成之后图片是上传到app上.前面的功能已经测试过了.没有上传到服务器,因为我没服务器测试.但项目里面有个类可以参考上传图片到服务器,我就没测试了.接下来看代码,虽然注释写得少,但其作用看英文单词意思,又在或是查看调用. 项目源码下载地址:http://download.csdn.net/detail/qq_16064871/8585169 转载请注明出处: http://blog.csdn.net/qq_16064871 package com.ex

WebView Android 调用js且需要获取返回结果

原来有一两个人说我不帅的时候,我不以为意,逗我玩而已,后来几乎所有 人都说我不帅,我才真正意识到事态的严重,这社会骗子真是越来越多了... 好吧我承认,这个笑话不好笑,其实我想说的是,做人一定要坚持自己的原则, 哪怕有一天所有人都和你背道而驰,都不要放弃自己当初的梦想,如果有一天, 我们淹没在人海之中,庸碌一生,那是因为我们不够努力,不够勇敢的去面对生活. 每天积累一点点,嗯,满足简单的快乐. ---------------------------------------------------

Android调用系统自带的文件管理器进行文件选择

http://blog.csdn.net/zqchn/article/details/8770913的补充 FileUtils文件 public class FileUtils {     public static String getPath(Context context, Uri uri) {         if ("content".equalsIgnoreCase(uri.getScheme())) {             String[] projection =