相信开发过一段Android的都被Android中的兼容性问题给折腾过,有时这确实很无奈,Android被不同的厂商改的七零八落的。本文主要总结下本人在实际的项目开发过程中所遇到的兼容性问题,以及最后的解决办法。本文将持续更新。

1. 选择系统相册时HTC 7出现的系统崩溃(空指针异常) 系统版本 2.3.7

最近在做一发表的功能时,需要从系统相册中选择图片,最后有将此图片上传服务端。通常从系统相册中选择图片写法如下:

albumButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);startActivityForResult(intent, AppContext.GETIMAGE_BYSDCARD);}
});

然后在onActivityResult中获取刚刚选取的照片:

 1 @Override
 2 protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
 3     if (resultCode == RESULT_OK) {
 4         if (requestCode == AppContext.GETIMAGE_BYSDCARD || requestCode == AppContext.GETIMAGE_BYCAMERA) {
 5             if (requestCode == AppContext.GETIMAGE_BYSDCARD && null != data) {
 6                 Uri selectedImage = data.getData();
 7                 String[] filePathColumn = { MediaStore.Images.Media.DATA };
 8                 Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null);
 9                 if (cursor != null) {
10                     if (cursor.moveToFirst()) {
11                         //int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
12                         int columnIndex = cursor.getColumnIndexOrThrow(filePathColumn[0]);
13                         photoPath = cursor.getString(columnIndex);
14                     }
15                     cursor.close();
16                 }
17             }
18         }
19     }
20 }

可以在HTC7  2.3.7 上发现无法获取图片,如果上述代码中没有做cursor != null 则系统崩溃,最后定为出原因在于Uri selectedImage = data.getData();这行代码上,在其他手机上,此处返回格式为content://media/external/images/media/244709,因此自然是通过接下来的Content Privider方式获取到图片实际地址。而在HTC此手机上,返回的结果却为:/storage/sdcard0/DCIM/Camera/IMG_20140608_162447.jpg,即直接返回了所选取图片的地址,因此,需要针对性的做出如下处理:

 1 @Override
 2 protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
 3     if (resultCode == RESULT_OK) {
 4         if (requestCode == AppContext.GETIMAGE_BYSDCARD || requestCode == AppContext.GETIMAGE_BYCAMERA) {
 5             if (requestCode == AppContext.GETIMAGE_BYSDCARD && null != data) {
 6                 Uri selectedImage = data.getData();
 7                 String[] filePathColumn = { MediaStore.Images.Media.DATA };
 8                 Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null);
 9                 if (cursor != null) {
10                     if (cursor.moveToFirst()) {
11                         //int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
12                         int columnIndex = cursor.getColumnIndexOrThrow(filePathColumn[0]);
13                         photoPath = cursor.getString(columnIndex);
14                     }
15                     cursor.close();
16                 } else {
17                     if (selectedImage != null) {
18                         String tmpPath = selectedImage.getPath();
19                         if (tmpPath != null && (tmpPath.endsWith(".jpg") || tmpPath.endsWith(".png") || tmpPath.endsWith(".gif"))) {
20                             photoPath = tmpPath;
21                         }
22                     }
23                 }
24             }
25         }
26     }
27 }

其实对于选择系统相册的此类功能,个人感觉最完整的做法应该类似于微信中的选择图片,由于Android兼容性问题的存在,导致目前没有完全有效的统一方法完成照片的选择。

----------------------------

2.三星手机调用手机拍照后出现横竖屏切换的问题

其实这也是一个典型的问题了,当初也是在网上直接查到的解决方案,貌似是三星手机的通病。解决方案如下:

 1 public static int getPictureDegree(String path) {
 2     int degree = 0;
 3     try {
 4         ExifInterface exifInterface = new ExifInterface(path);
 5         int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
 6         switch (orientation) {
 7         case ExifInterface.ORIENTATION_ROTATE_90:
 8             degree = 90;
 9             break;
10         case ExifInterface.ORIENTATION_ROTATE_180:
11             degree = 180;
12             break;
13         case ExifInterface.ORIENTATION_ROTATE_270:
14             degree = 270;
15             break;
16         }
17     } catch (IOException e) {
18         e.printStackTrace();
19     }
20     return degree;
21 }

 1 int degree = getPictureDegree(filePath);
 2 return roateBitmap(thumbBitmap, degree);
 3
 4 public static Bitmap roateBitmap(Bitmap bitmap, int degree) {
 5     if (degree == 0) {
 6         return bitmap;
 7     }
 8     Matrix matrix = new Matrix();
 9     matrix.postRotate(degree);
10     Bitmap bmp = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
11     return bmp;
12 }

主要思路其实就是通过图片Exif获取到其旋转角度,然后再相应旋转过来。

3.Android 2.3及以下系统Notification出现IllegalArgumentException: contentIntent required

对于2.3及以下系统时,在创建Notification时需要设置其对应的contentIntent,可以直接通过mNotification.contentIntent = xxx直接设置或mNotification.setLatestEventInfo(...)间接设置。有时候,contentIntent对应于用户点击此通知时所触发的响应,有时候,这种响应是不必要的,如当通知栏中显示下载进度条时,在进度条尚未达到100%之前,用户点击通知实际上是不希望有什么操作的。但2.3及以下系统不设置contentIntent又会如此报错。解决方式如下:

1 if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.HONEYCOMB) {
2     Intent intent = new Intent();
3     PendingIntent contentIntent = PendingIntent.getActivity(context, 0, intent, 0);
4     mNotification.contentIntent = contentIntent;
5 }

此时,当用户点击通知时,会发现此通知消失,虽然不能进行后续动作上的特定跳转。显然,这也是不符合实际需要的。可以通过如下方式解决。

1 downloadNotification.flags |= Notification.FLAG_ONGOING_EVENT;

Android系统兼容性问题(持续更新)相关推荐

  1. Android 学习资料(持续更新)

    概述 收集整理这份资料灵感来自于 trip_to_iOS, 征得同意引用了该资料的开头描述 收集整理这份资料主要帮助初学者学习 Android 开发, 希望能快速帮助到他们快速入门, 找到适合自己学习 ...

  2. android studio小日常(持续更新)

    这里会更新一些android  studio大家可能找不到的地方,也是比较常用的一些技巧. 大家也可以把使用中的问题留在评论中,大家相互交流 1.我们在使用android studio编辑xml的时候 ...

  3. Android开发学习持续更新中

    Android开发 单个Activity界面内的操作 控件1TextView控件使用 控件2Button控件使用 1首先对于android的按键格式 2对按键监听事件进行绑定 控件3EditText文 ...

  4. 助力Android开发者(持续更新)

    文章目录 网络相关 网络请求 文件下载 图片相关 图片加载 图片编辑 储存相关 数据库 键值对 音视频相关 视频 音频 UI 事件总线 其他 网络相关 网络请求 RxHttp(支持Kotlin协程.内 ...

  5. android常用轮子(持续更新)

    一.快速开发框架 XSnow 基于RxJava2+Retrofit2精心打造的Android基础框架,包含网络.上传.下载.缓存.事件总线.权限管理.数据库.图片加载,基本都是项目中必用功能,每个模块 ...

  6. Android pm命令(持续更新中...)

    # adb shell pm uninstall -k --user 0 包名 //adb 删除系统应用 # adb shell am start -n 包名/包名.活动名 //adb运行apk # ...

  7. 分享大神的一些博文、视频、资料--持续更新

    心理学家 Ericsson 的研究发现:决定伟大水平和一般水平的关键因素,既不是天赋,也不是经验,而是[刻意练习]的程度. 教育最重要的不是灌输,而是引发思考.这样的话就没有必要按时间顺序,介绍很多细 ...

  8. android proguard 第三方jar,Android Studio代码混淆-第三方jar混淆汇总(持续更新)

    前言 Android有非常多的优秀的第三方开源jar包,我们经常在我们的项目中使用了不少jar包,但是往往到了release的时候就忘了混淆第三方jar包了,会给我们开发带来不少麻烦,所有在这里汇总一 ...

  9. Android常用开发网址(持续更新)

    2019独角兽企业重金招聘Python工程师标准>>> Android常用开发网址(持续更新) 环境搭建 android镜像 http://www.androiddevtools.c ...

最新文章

  1. usaco Big Barn
  2. ubuntu安装之后的最初几天一路杂记
  3. HDU-5532(LIS-nlogn)
  4. Codeforces Round #514 (Div. 2)题解
  5. MATLAB优化问题
  6. Docker运行GUI软件的方法
  7. 软件项目周报模板_一份高质量的职场工作周报,要这样写
  8. java 的23种设计模式 之单身狗和隔壁老王的故事
  9. Android 雪花飘落动画效果 自定义View
  10. RabbitMQ在Windows环境下部署(简单有效)
  11. 自媒体免费素材,国旗高清无水印素材,PNG格式,直接引用即可
  12. 财智理财7破解思路与总结
  13. 仿微信在线聊天源码 DuckChat聊天系统PHP采用 PHP 编写的聊天软件,简直就是一个完整的迷你版微信
  14. [免费专栏] Android安全之Drozer安全测试详细使用教程
  15. 路由器配置双宽带,并相互备份使用
  16. MyScript基础功能
  17. tp-link与台式计算机连接教程,台式电脑连接到无线路由器上网教程
  18. AtCoder Beginner Contest 178 C
  19. java implode函数_PHP警告:implode():传递的参数无效
  20. 【05月22日】预分红股息率最高排名

热门文章

  1. export default 打包_贵阳【打包扣】价格
  2. python打开摄像头cmd_Python调用shell cmd方法代码示例解析
  3. 测试内存兼容软件,Ryzen内存兼容性测试_内存硬盘行情-中关村在线
  4. linux内核关闭igmp,Linux kernel IGMP多个安全漏洞
  5. 商品管理系统c语言功能模板,C语言课程报告图书馆管理系统可做模板套用.doc
  6. Java中使用BigDecimal进行浮点数精确计算 超大整数 浮点数等计算 没有数位限制
  7. 大数据学习笔记39:Hive - 内置函数(2)
  8. 【多题合集】高精度加减乘除
  9. 20.校准相机——纯粹的方式,简单的方式,多平面校准_4
  10. 计算机调试员高级理论知识试卷,电子计算机设备调试员(高级)考核复习题—理论试题.doc...