媒体库选择图片显示可提供上传(非sdcard)

来源:互联网 发布:笨女孩知乎 编辑:程序博客网 时间:2024/05/22 14:19

(written at 2013-03-19 09:23:51)


最近要在项目中要实现这种功能,在网上也没有找到很好的例子,参考了各种例子终于做出来一个比较像样的,但是还有一个小问题,就是当选用非系统媒体库方式打开时候不能进行裁剪,之前有试过可以裁剪的,但是方法被我不知道弄到哪里去了,现在分享个给大家参考。

在没有sd卡的情况下怎么去调用媒体库的图片文件,或者是直接选用其他图片浏览器,文件管理器进行选图片。
1.先创建一个图片在项目的安装目录下,也就是/data/data/com.公司名.项目名称/目录下,我这里所选的是files目录。

String fileName = "temp.jpg";File temp = this.getFilesDir(); // 即/data/data/com.公司名.项目名称/filestempFile = new File(temp.getAbsolutePath(),fileName);try {output = openFileOutput(fileName, Context.MODE_WORLD_WRITEABLE);output.write(getBytes(tempFile));} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}tempFile = FileUtils.createFile(temp.getAbsolutePath(), fileName);



tempFile 是一个File类型的全局变量,因为这个文件是临时创建的,当不需要再上传图片的时候,可以把这个文件删除,直接调用tempFile.delete(),可以为手机内存存储节省空间。

2.调用媒体库的裁剪器

Intent intent = new Intent();// 开启Pictures画面Type设定imageintent.setType("image/*");intent.putExtra("crop", "true");// 裁剪框比例intent.putExtra("aspectX", 1);intent.putExtra("aspectY", 1);intent.putExtra("outputX", Dp2Px(this,88));intent.putExtra("outputY", Dp2Px(this,88));intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(tempFile));intent.putExtra("outputFormat", "JPEG");intent.putExtra("noFaceDetection", true);//使用媒体库intent.setAction(Intent.ACTION_GET_CONTENT); //取得相片后返回本画面startActivityForResult(intent, CHOOSE_PICTURE_REQUEST_CODE);



Dp2Px函数的作用是,将dp转换为像素,我这里的要求是88X88dp,outputX,outputY这里填的都是像素值,如果你不需要做这种类型转换就不需做无用功。CHOOSE_PICTURE_REQUEST_CODE是一个自定义的int类型常量,大于等于0即可。Intent.ACTION_GET_CONTENT的意思是使用媒体库,有些软件也注册了具有媒体功能,所以设置了此选项的时候可能会出现其他软件,比如一些图片浏览器,文件浏览器。要同时处理对其他软件对图片进行操作,我在下面是这样处理的。

3.重写onActivityResult方法
protected void onActivityResult(int requestCode, int resultCode, Intent data) {if (resultCode == RESULT_OK) {if(resultCode == CHOOSE_PICTURE_REQUEST_CODE){//定位uri为非系统媒体库浏览器所打开的文件uri地址Uri uri = data.getData();  //如果uri不为空,则取到了图片文件地址if(uri!=null && !uri.equals("")){//通过文件流的方式获取图片ContentResolver cr = this.getContentResolver();  try {            Bitmap bitmap = BitmapFactory.decodeStream(cr.openInputStream(uri));     //获取到的是图片          if(bitmap !=null){   //当获取图片可能比需求大或者小,进行一次固定大小的裁剪,转化为88X88dp(根据实际需要)  int dp =Dp2Px(this,88);   Bitmap mBitmap = Bitmap.createScaledBitmap(bitmap, dp, dp, true);    //将Bitmap设定到ImageView    mPhotoImageView.setImageBitmap(mBitmap);    FileOutputStream  fOut = new FileOutputStream(tempFile);    mBitmap.compress(Bitmap.CompressFormat.PNG, 100, fOut);    fOut.flush();    fOut.close();   }else{       //获取到的不是图片的处理   }} catch (FileNotFoundException e) {          Log.e("Exception", e.getMessage(),e);  }  //这里是针对选择系统媒体库的操作}else if(tempFile!=null && !tempFile.equals("")){byte[] myIcon = getBytes(tempFile);//设置contact新的头像if(myIcon !=null && !myIcon.equals("")){Bitmap map = BitmapFactory.decodeByteArray(myIcon, 0, myIcon.length);mPhotoImageView.setImageBitmap(map);}}            }}super.onActivityResult(requestCode, resultCode, data);}


getBytes是一个自定义方法,将file转化为byte[]。
4.在最后不使用此功能,可以把tempFile删除:tempFile.delete()。

如果大家还有什么更好的实现方法欢迎跟我一起讨论。Email:arjinmc@hotmail.com


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 刚打的耳洞化脓怎么办 耳朵进水了一直嗡嗡响怎么办 婴儿游泳呛水了怎么办 孩子游泳呛水了怎么办 婴儿洗澡呛水了怎么办 小孩脸上长湿疹老是不好怎么办 油耳堵住了耳朵怎么办 耳屎突然变湿该怎么办 小孩有耳屎好硬怎么办 小孩的耳屎深硬怎么办 1岁宝宝喉咙发炎怎么办 牙旁边的肉疼怎么办 鼻头软骨捏的痛怎么办 耳洞发炎肿了怎么办 一上火耳朵就疼怎么办 耳朵像隔了层膜怎么办 感冒引起的耳闷怎么办 5岁儿童视力0.6怎么办 柯基耳朵不立怎么办 宝宝一惊一乍睡觉不踏实怎么办 新婴儿睡觉不踏实怎么办 耳朵里面疼肿了怎么办 生出来的孩子是畸形怎么办 二胎生了缺陷儿怎么办 扣完肚脐眼后疼怎么办 刚出生的婴儿屁股红怎么办 狗狗耳朵流血了怎么办 狗狗不让掏耳朵怎么办 下巴总是反复长脓包怎么办 不胖但有双下巴怎么办 早上起床眼肿了怎么办 小孩鼻梁很塌的怎么办 17岁鼻子是塌的,怎么办 鼻子又塌又翘怎么办 戴眼镜鼻子塌了怎么办 耳朵里长了粉刺怎么办 耳洞太大了怎么办变小 天生嘴唇厚又大怎么办 上嘴唇太厚怎么办还翘 20岁欠债5万怎么办 脑袋撞了个包怎么办