• 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中都有获取用户头像、进行用户头像的设置的操作,所以大家能够參考,假设有什么不正确的地方,请大家积极留言交流,共同进步。谢谢~!【握手】

    源码下载

  • 相关阅读:
    范仁义css3课程---33、背景3( background-attachment )
    范仁义css3课程---34、背景4( 背景简写属性 )
    范仁义css3课程---32、背景2( background-position)
    范仁义css3课程---31、背景1( background-image)
    关于Android Canvas.drawText方法中的坐标参数的正确解释
    android中画文字的换行 办法(对于遇到canvas.drawText(String s )无法实现换行问题的解决)
    Android中自定义属性(attrs.xml,TypedArray的使用)
    推荐
    intent的startActivityForResult()方法
    Android利用Gson解析嵌套多层的Json
  • 原文地址:https://www.cnblogs.com/mthoutai/p/7186288.html
Copyright © 2020-2023  润新知