启动系统相册intent

Intent intentFromGallery = new Intent();
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {//4.4及以上intentFromGallery.setAction(Intent.ACTION_PICK);
} else {//4.4以下intentFromGallery.setAction(Intent.ACTION_GET_CONTENT);
}
intentFromGallery.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
startActivityForResult(intentFromGallery, IMAGE_REQUEST_CODE);

从系统相册中任意选择一张图片以后回调onActivityResult()

protected void onActivityResult(int requestCode, int resultCode, Intent data) {if (resultCode != RESULT_CANCELED) {switch (requestCode) {case IMAGE_REQUEST_CODE://从相册返回的Uri originalUri = data.getData();try {//为防止原始图片过大导致内存溢出,这里先缩小原图显示,然后释放原始Bitmap占用的内存Bitmap photo = BitmapUtils.getAngleBitmap(this, originalUri);setImageAndCameraResult(photo);} catch (Exception e) {e.printStackTrace();}break;}

正常的手机拿到的uri类似于:

content://media/external/images/media/2246

但是三星盖乐世拿到的uri类似于:

contentprovider/-1/1/content%3A%2F%2Fmedia%2Fexternal%2Fimages%2Fmedia%2F1201/ACTUAL/1023354366

正因为如此会导致

Cursor cursor = cr.query(newUri, null, null, null, null);// 根据Uri从数据库中找

以上方法拿不到正确的cursor,导致

int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);

拿不到正确的值,以至于无法获取到正确的图片

解决方法如下所示:重新组装一次uri的值,使得其转换成正确的可以使用的uri,具体方法就是下面代码中//从stackoverflow上抄来的方案,测试通过

/*** 拍照或选择相册照片之后调整照片的角度**@param mImageCaptureUri*@return 调整之后的照片*/public static Bitmap getAngleBitmap(Context appContext, Uri mImageCaptureUri) {//从stackoverflow上抄来的Uri newUri;if(mImageCaptureUri.toString().contains("%")){String unusablePath = mImageCaptureUri.getPath();int startIndex = unusablePath.indexOf("external/");int endIndex = unusablePath.indexOf("/ACTUAL");String embeddedPath = unusablePath.substring(startIndex, endIndex);Uri.Builder builder = mImageCaptureUri.buildUpon();builder.path(embeddedPath);builder.authority("media");newUri = builder.build();}else {newUri = mImageCaptureUri;}// 不管是拍照还是选择图片每张图片都有在数据中存储也存储有对应旋转角度orientation值// 所以我们在取出图片是把角度值取出以便能正确的显示图片,没有旋转时的效果观看ContentResolver cr = appContext.getApplicationContext().getContentResolver();Cursor cursor = cr.query(newUri, null, null, null, null);// 根据Uri从数据库中找if (cursor != null) {int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);cursor.moveToFirst();// 把游标移动到首位,因为这里的Uri是包含ID的所以是唯一的不需要循环找指向第一个就是了String filePath = cursor.getString(column_index);// 获取图片路String orientation = cursor.getString(cursor.getColumnIndex("orientation"));// 获取旋转的角度cursor.close();if (filePath != null) {Bitmap bitmap = getResizedImage(filePath, 500);// 根据Path读取资源图片int angle = 0;if (orientation != null && !"".equals(orientation)) {angle = Integer.parseInt(orientation);}if (angle != 0) {// 下面的方法主要作用是把图片转一个角度,也可以放大缩小等Matrix m = new Matrix();int width = bitmap.getWidth();int height = bitmap.getHeight();m.setRotate(angle); // 旋转angle度bitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height,m, true);// 从新生成图片}return bitmap;}}return null;}

补充部分代码片段:

public static Bitmap getResizedImage(String imagePath, int maxHeight) {Options options = new Options();options.inJustDecodeBounds = true;Bitmap bitmap = BitmapFactory.decodeFile(imagePath, options);int be = computeSampleSize(options, -1, maxHeight * maxHeight);if(be < 1) {be = 1;}options.inSampleSize = be;options.inJustDecodeBounds = false;try {bitmap = BitmapFactory.decodeFile(imagePath, options);} catch (Exception var6) {LogUtils.e(var6.getMessage(), var6);}return bitmap;}
private static int computeSampleSize(Options options, int minSideLength, int maxNumOfPixels) {int initialSize = computeInitialSampleSize(options, minSideLength, maxNumOfPixels);int roundedSize;if(initialSize <= 8) {for(roundedSize = 1; roundedSize < initialSize; roundedSize <<= 1) {;}} else {roundedSize = (initialSize + 7) / 8 * 8;}return roundedSize;}
private static int computeInitialSampleSize(Options options, int minSideLength, int maxNumOfPixels) {double w = (double)options.outWidth;double h = (double)options.outHeight;int lowerBound = maxNumOfPixels == -1?1:(int)Math.ceil(Math.sqrt(w * h / (double)maxNumOfPixels));int upperBound = minSideLength == -1?128:(int)Math.min(Math.floor(w / (double)minSideLength), Math.floor(h / (double)minSideLength));return upperBound < lowerBound?lowerBound:(maxNumOfPixels == -1 && minSideLength == -1?1:(minSideLength == -1?lowerBound:upperBound));}

android从本地相册获取图片uri三星手机适配问题相关推荐

  1. android从本地相册选择图片uri三星手机适配问题

    转载地址:http://blog.csdn.net/CathyChen0910/article/details/62456438 启动系统相册intent Intent intentFromGalle ...

  2. Android相机、相册获取图片显示并保存到SD卡

    如题,这个需求本不是一个很复杂的过程,但是却存在一些隐患,我也是最近在项目中碰到这个问题,将Android通过相机或相册获取图片并最终显示在界面上做了一个小研究,现将一些结果和附上的一个Demo叙述如 ...

  3. android相册路径地址,Android拍照和相册获取图片路径

    /** *调用系统相机 */ public voidstartCamera() { Intent intent =newIntent(MediaStore.ACTION_IMAGE_CAPTURE); ...

  4. android访问图库,android通过访问相册获取图片并展示在ImageView中

    第一步:添加相应的权限以及属性: ①在manifest中设置权限 ②在中设置相应属性,这一步很关键,解决了我在这一方面最后的一个有关deny的权限问题 android:requestLegacyExt ...

  5. Android 相机 或者 相册 获取图片裁剪 适用6.0/7.0

    随着Android 的版本更新迭代.本来以前代码很简单的打开相册或者相机  获取图片裁剪 给Unity3D 使用的过程 挺简单的.但是随着 Android 版本的 更新 和 安全 的加强 .有几点 和 ...

  6. android通过访问相册获取图片并展示在ImageView中

    第一步:添加相应的权限以及属性: ①在manifest中设置权限 <uses-feature android:name="android.hardware.camera" / ...

  7. iOS 根据图片URL从本地相册获取图片

    最近做一个聊天的项目,需要发送图片后读取本地图片显示到列表里.刚开始的时候,天真的认为可以用SDWebImage直接加载,然后并不能行. 于是在网上搜了搜,如何根据从相册获取的UIImagePicke ...

  8. 调去系统照相机或者从本地相册获取图片.

    1.首先要遵守三个协议 UIActionSheetDelegate,UINavigationControllerDelegate,UIImagePickerControllerDelegate 2.主 ...

  9. Android 调用系统打开相机,打开相册获取图片路径

    我们在开发中经常遇到一些功能需要调取系统相机拍照获取图片,或者有的时候直接打开图库获取图片,那我们怎么获取呢,今天分享下, 第一步,打开相机 public static final int CAMER ...

最新文章

  1. python基础-垃圾回收机制
  2. freebsd 运维人员
  3. html5基础知识点制作图片
  4. java接口中方法声明_java – 使用实现中声明的接口中未定义的方法
  5. php 不允许外部访问,[日常] 解决mysql不允许外部访问
  6. 讲讲 MySQL 中的 WAL 策略和 CheckPoint 技术
  7. python的类里的属性是否可以为列表_Python中如何获取类属性的列表
  8. Struts2学习日记(二)简单的Struts2登陆实现(Action继承ActionSupport类)
  9. Windows与Linux下查看占用端口的进程
  10. 说说Thread的interrupt()
  11. 药品缺陷检测中的机器视觉技术
  12. W10笔记本电脑弄成WIFI
  13. 程炳皓:关于技术领导力,十个耸人听闻的观点
  14. matlab回文数,用Matlab求水花数-完美数-回文数和亲合数.doc
  15. Java打印年月日历
  16. 三星搁置OLED面板工厂计划可能投资microLED
  17. MATLAB遗传算法工具箱安装包及安装方法(图解)
  18. 第44章 MPU6050传感器—姿态检测—零死角玩转STM32-F429系列
  19. Java WebSocket 基础 建立端点
  20. 如何言语上更好的激励别人?

热门文章

  1. Yahoo天气插件Api
  2. 数字ic笔试2022小米提前批
  3. 第5章 SQL SELECT DISTINCT 语句教程
  4. 当当网获得dangdang商品详情 API
  5. Java 异步调用实践
  6. 这回轮到阿里云了。。
  7. Java从头开始--封装、继承和多态
  8. 面试笔记 | 数组与指针的区别
  9. oracle以查询多括号报错,oracle点滴积累
  10. 微信小程序(触控事件)