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

最近CSDN无法上传图片,所以效果图无法给大家了。
首先讲述这个小项目的特色
1、调用系统的相册应用获取单张图片
2、对单张图片进行剪切方便做成指定大小的头像图片
3、对获取图片的结果进行解析,使用三种方式进行。
下面具体请看代码:

public class MainActivity extends Activity implements OnClickListener{

    private TextView backTx,sureTx;//一个返回键,一个确定键
    private ImageView imageView;//显示获取的图片的ImageView
    private Button getPic,getPic2Cut;
    //两个按钮,分别实现获取图片、对图片进行剪切
    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);
    }
    //调用系统相册获取图片的方法,非常简单
    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即可。
             * 不过这种方式当图片很大的时候,容易出现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中都有获取用户头像、进行用户头像的设置的操作,所以大家可以参考,如果有什么不对的地方,请大家积极留言交流,共同进步!谢谢~!【握手】

源代码下载

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。