Android系统兼容性问题(持续更新)
相信开发过一段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系统兼容性问题(持续更新)相关推荐
- Android 学习资料(持续更新)
概述 收集整理这份资料灵感来自于 trip_to_iOS, 征得同意引用了该资料的开头描述 收集整理这份资料主要帮助初学者学习 Android 开发, 希望能快速帮助到他们快速入门, 找到适合自己学习 ...
- android studio小日常(持续更新)
这里会更新一些android studio大家可能找不到的地方,也是比较常用的一些技巧. 大家也可以把使用中的问题留在评论中,大家相互交流 1.我们在使用android studio编辑xml的时候 ...
- Android开发学习持续更新中
Android开发 单个Activity界面内的操作 控件1TextView控件使用 控件2Button控件使用 1首先对于android的按键格式 2对按键监听事件进行绑定 控件3EditText文 ...
- 助力Android开发者(持续更新)
文章目录 网络相关 网络请求 文件下载 图片相关 图片加载 图片编辑 储存相关 数据库 键值对 音视频相关 视频 音频 UI 事件总线 其他 网络相关 网络请求 RxHttp(支持Kotlin协程.内 ...
- android常用轮子(持续更新)
一.快速开发框架 XSnow 基于RxJava2+Retrofit2精心打造的Android基础框架,包含网络.上传.下载.缓存.事件总线.权限管理.数据库.图片加载,基本都是项目中必用功能,每个模块 ...
- Android pm命令(持续更新中...)
# adb shell pm uninstall -k --user 0 包名 //adb 删除系统应用 # adb shell am start -n 包名/包名.活动名 //adb运行apk # ...
- 分享大神的一些博文、视频、资料--持续更新
心理学家 Ericsson 的研究发现:决定伟大水平和一般水平的关键因素,既不是天赋,也不是经验,而是[刻意练习]的程度. 教育最重要的不是灌输,而是引发思考.这样的话就没有必要按时间顺序,介绍很多细 ...
- android proguard 第三方jar,Android Studio代码混淆-第三方jar混淆汇总(持续更新)
前言 Android有非常多的优秀的第三方开源jar包,我们经常在我们的项目中使用了不少jar包,但是往往到了release的时候就忘了混淆第三方jar包了,会给我们开发带来不少麻烦,所有在这里汇总一 ...
- Android常用开发网址(持续更新)
2019独角兽企业重金招聘Python工程师标准>>> Android常用开发网址(持续更新) 环境搭建 android镜像 http://www.androiddevtools.c ...
最新文章
- usaco Big Barn
- ubuntu安装之后的最初几天一路杂记
- HDU-5532(LIS-nlogn)
- Codeforces Round #514 (Div. 2)题解
- MATLAB优化问题
- Docker运行GUI软件的方法
- 软件项目周报模板_一份高质量的职场工作周报,要这样写
- java 的23种设计模式 之单身狗和隔壁老王的故事
- Android 雪花飘落动画效果 自定义View
- RabbitMQ在Windows环境下部署(简单有效)
- 自媒体免费素材,国旗高清无水印素材,PNG格式,直接引用即可
- 财智理财7破解思路与总结
- 仿微信在线聊天源码 DuckChat聊天系统PHP采用 PHP 编写的聊天软件,简直就是一个完整的迷你版微信
- [免费专栏] Android安全之Drozer安全测试详细使用教程
- 路由器配置双宽带,并相互备份使用
- MyScript基础功能
- tp-link与台式计算机连接教程,台式电脑连接到无线路由器上网教程
- AtCoder Beginner Contest 178 C
- java implode函数_PHP警告:implode():传递的参数无效
- 【05月22日】预分红股息率最高排名
热门文章
- export default 打包_贵阳【打包扣】价格
- python打开摄像头cmd_Python调用shell cmd方法代码示例解析
- 测试内存兼容软件,Ryzen内存兼容性测试_内存硬盘行情-中关村在线
- linux内核关闭igmp,Linux kernel IGMP多个安全漏洞
- 商品管理系统c语言功能模板,C语言课程报告图书馆管理系统可做模板套用.doc
- Java中使用BigDecimal进行浮点数精确计算 超大整数 浮点数等计算 没有数位限制
- 大数据学习笔记39:Hive - 内置函数(2)
- 【多题合集】高精度加减乘除
- 20.校准相机——纯粹的方式,简单的方式,多平面校准_4
- 计算机调试员高级理论知识试卷,电子计算机设备调试员(高级)考核复习题—理论试题.doc...