项目android 6.0,7.0 版本适配问题
2017-05-11 17:02
851 查看
记录一下项目中遇到andoid 6.0以上版本的适配问题,懒癌发作好多该总结的拖拖拉拉就忘了。
参考的博文:
http://www.tuicool.com/articles/zYniuyZ
http://blog.163.com/insightinto@126/blog/static/67383690201402455048495/
http://blog.csdn.net/lmj623565791/article/details/50709663
之前项目没有考虑到android 6.0 及以上版本的适配问题,后来再APP中加百度lbs地图时,遇到华为荣耀8定位不了的问题。
1 android 6.0以上的部分危险权限需要通过运行时动态申请。
2 android 6.0对应的api 23,将android编译版本换成23,才可以找到@TargetApi(value = Build.VERSION_CODES.M) Build.VERSION_CODES.M表示android 6.0
3 之前把最低版本设为api 16,发现代码中指定编译版本为android 6.0 也即Build.VERSION_CODES.M时找不到,将编译api改为23后,出现一些兼容错误。例如:
(1) android sdk 23,Google 移出了Apache HttpClient相关的类,推荐使用HttpUrlConnection,如果需要继续使用Apache HttpClient,需要在libs中添加org.apache.http.legacy.jar
和HttpClient一样,HttpResponse类也被移除了,解决方法如上所述,jar文件位置在sdk目录下\platforms\android-23\optional文件夹中
(2) android 6.0 The method sin(float) is undefined for the type FloatMath 报错
Android6.0使用 Math.floor 代替 FloatMath.floor 即可
(3) The method initializeScrollbars(TypedArray) is undefined for the type PLA_AbsListView
initializeScrollbars android 6.0中该方法不存在,使用反射机制找到被屏蔽
4 公司测试机比较少,也就后来才用高版本的手机测试,像华为荣耀8只开启app定位权限不够,还需要检测总开关定位服务有没有开启,如果没有开启总开关,检测定位权限都是无效的。所以首先检测总定位服务有没有开启。
5 android 6.0 引入的是动态权限限制,android 7.0则是“私有目录被限制”
参考的博文:
http://www.tuicool.com/articles/zYniuyZ
http://blog.163.com/insightinto@126/blog/static/67383690201402455048495/
http://blog.csdn.net/lmj623565791/article/details/50709663
之前项目没有考虑到android 6.0 及以上版本的适配问题,后来再APP中加百度lbs地图时,遇到华为荣耀8定位不了的问题。
1 android 6.0以上的部分危险权限需要通过运行时动态申请。
2 android 6.0对应的api 23,将android编译版本换成23,才可以找到@TargetApi(value = Build.VERSION_CODES.M) Build.VERSION_CODES.M表示android 6.0
3 之前把最低版本设为api 16,发现代码中指定编译版本为android 6.0 也即Build.VERSION_CODES.M时找不到,将编译api改为23后,出现一些兼容错误。例如:
(1) android sdk 23,Google 移出了Apache HttpClient相关的类,推荐使用HttpUrlConnection,如果需要继续使用Apache HttpClient,需要在libs中添加org.apache.http.legacy.jar
和HttpClient一样,HttpResponse类也被移除了,解决方法如上所述,jar文件位置在sdk目录下\platforms\android-23\optional文件夹中
(2) android 6.0 The method sin(float) is undefined for the type FloatMath 报错
Android6.0使用 Math.floor 代替 FloatMath.floor 即可
(3) The method initializeScrollbars(TypedArray) is undefined for the type PLA_AbsListView
initializeScrollbars android 6.0中该方法不存在,使用反射机制找到被屏蔽
final TypedArray a = context.getTheme().obtainStyledAttributes(new int[0]); try { // initializeScrollbars(TypedArray) Method initializeScrollbars = Android.view.View.class.getDeclaredMethod("initializeScrollbars", TypedArray.class); initializeScrollbars.invoke(this, a); } catch (Exception e) { e.printStackTrace(); }
4 公司测试机比较少,也就后来才用高版本的手机测试,像华为荣耀8只开启app定位权限不够,还需要检测总开关定位服务有没有开启,如果没有开启总开关,检测定位权限都是无效的。所以首先检测总定位服务有没有开启。
/** * 判断GPS是否开启,GPS或者AGPS开启一个就认为是开启的 * @param context * @return true 表示开启 */ public static final boolean isOPenLocService(final Context context) { LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE); // 通过GPS卫星定位,定位级别可以精确到街(通过24颗卫星定位,在室外和空旷的地方定位准确、速度快) boolean gps = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); // 通过WLAN或移动网络(3G/2G)确定的位置(也称作AGPS,辅助GPS定位。主要用于在室内或遮盖物(建筑群或茂密的深林等)密集的地方定位) boolean network = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER); if (gps || network) { return true; } return false; } if(TyhcApplication.isOPenLocService(this)){ // 先弹出提示框 pumpCallDialog(); }else{ final Dialog pumpDialog = Custom_dialog.pumpDialog(this, "温馨提示", "手机定位服务未开启,不能定位", "取消", "开启位置服务"); Custom_dialog.setConfirmListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub pumpDialog.dismiss(); //打开定位服务总开关界面 Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); startActivity(intent); } }); Custom_dialog.setCancleListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub pumpDialog.dismiss(); } }); } protected void pumpCallDialog() { final Dialog dialog1 = Custom_dialog.pumpDialog(this, "门店定位", "请手持手机,站在门店正中央位置进行精准定位", "取消", "开始定位"); Custom_dialog.setCancleListener(new OnClickListener() { @Override public void onClick(View v) { dialog1.dismiss(); } }); Custom_dialog.setConfirmListener(new OnClickListener() { @Override public void onClick(View v) { PermissionGen.needPermission(ApplyChildShopActivity.this, 100, android.Manifest.permission.ACCESS_FINE_LOCATION); dialog1.dismiss(); } }); } @PermissionSuccess(requestCode = 100) public void startLocation() { locationService.start();// 定位SDK } / @PermissionFail(requestCode = 100) public void failApply() { Toast.makeText(this, "定位权限获取失败", Toast.LENGTH_SHORT).show(); } @Override public< a7f4 /span> void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { PermissionGen.onRequestPermissionsResult(this, requestCode, permissions, grantResults); } 上面只是定位权限开启,后来模仿百度地图一样,在欢迎页就开始检测app中需要的权限是否开启,存储权限必须开启才能进入app if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED ||ContextCompat.checkSelfPermission(this, android.Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED ||ContextCompat.checkSelfPermission(this, android.Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED ||ContextCompat.checkSelfPermission(this, android.Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) { pumpDialog(); } else { 进入首页 } Dialog dialog = null; public void pumpDialog() { View view = View.inflate(this, R.layout.dialog_permission, null); dialog = new Dialog(this, R.style.transparentFrameWindowStyle); dialog.setContentView(view, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); Window window = dialog.getWindow(); window.setGravity(Gravity.CENTER); WindowManager.LayoutParams wl = window.getAttributes(); wl.dimAmount = 0.3f; wl.gravity = Gravity.CENTER; wl.width = ViewGroup.LayoutParams.WRAP_CONTENT; wl.height = ViewGroup.LayoutParams.WRAP_CONTENT; // 设置显示位置 dialog.onWindowAttributesChanged(wl); // 设置点击外围解散 dialog.setCanceledOnTouchOutside(true); dialog.show(); dialog.getWindow().setAttributes(wl); dialog.getWindow().setFlags( WindowManager.LayoutParams.FLAG_BLUR_BEHIND, WindowManager.LayoutParams.FLAG_BLUR_BEHIND); Button btn_next = (Button) view.findViewById(R.id.btn_next); btn_next.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { PermissionGen .with(SplashActivity.this) .addRequestCode(100) .permissions(android.Manifest.permission.READ_EXTERNAL_STORAGE, android.Manifest.permission.ACCESS_FINE_LOCATION, android.Manifest.permission.CAMERA, android.Manifest.permission.READ_CONTACTS, android.Manifest.permission.CALL_PHONE).request(); dialog.cancel(); } }); } @PermissionSuccess(requestCode = 100) public void readPreference() { //进入首页 } @PermissionFail(requestCode = 100) public void failRead() { } private void pumpStorage() { final Dialog pumpDialog = Custom_dialog.pumpDialog(this, "温馨提示", "存储权限是必须的,否则APP无法读取运行所需的存储文件", "取消", "确定"); Custom_dialog.setConfirmListener(new View.OnClickListener() { @Override public void onClick(View v) { pumpDialog.cancel(); PermissionGen.needPermission(SplashActivity.this, 100, android.Manifest.permission.READ_EXTERNAL_STORAGE); } }); Custom_dialog.setCancleListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub pumpDialog.dismiss(); finish(); } }); } @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { for (int i = 0; i < permissions.length; i++) { if ("android.permission.READ_EXTERNAL_STORAGE" .equals(permissions[i]) && grantResults[i] == -1) { //如果存储权限没打开 pumpStorage(); break; } } PermissionGen.onRequestPermissionsResult(this, requestCode, permissions, grantResults); }
5 android 6.0 引入的是动态权限限制,android 7.0则是“私有目录被限制”
相关文章推荐
- android app版本升级(DownloadManager、适配6.0、7.0)
- Android 版本更新(非热更新) 适配7.0更新 以及三星 note系列读取内存相关目录无权限问题
- Android调用系统相机、相册功能,适配6.0权限获取以及7.0以后获取URI(兼容多版本)
- Android 拍照和图库功能(适配Android 6.0和7.0系统和华为机型问题)
- AndroidStudio项目从低版本导入到高版本出现的问题
- 解决cocos2d-X 2.0版本后创建的Android项目提示org.cocos2dx.lib.Cocos2dxActivity找不到问题
- 详解Android权限管理之RxPermission解决Android 6.0 适配问题
- 解决cocos2d-X 2.0版本后创建的Android项目提示org.cocos2dx.lib.Cocos2dxActivity找不到问题
- Android 7.0 介绍和适配问题
- 项目中处理android 6.0权限管理问题
- Android权限管理之RxPermission解决Android 6.0 适配问题
- 解决cocos2d-X 2.0版本后创建的Android项目提示org.cocos2dx.lib.Cocos2dxActivity找不到问题
- 解决cocos2d-X 2.0版本后创建的Android项目提示org.cocos2dx.lib.Cocos2dxActivity找不到问题
- Android 6.0 以上版本提示“检测到屏幕叠加层”的问题,规避方法
- Android 7.0中拍照和图片裁剪适配的问题详解
- Android android 6.0权限校验及版本兼容问题
- 解决cocos2d-X 2.0版本后创建的Android项目提示org.cocos2dx.lib.Cocos2dxActivity找不到问题
- Android项目中屏幕适配问题
- Eclipse导入android项目时版本冲突问题
- android/adt导入已存在的项目_消除因版本问题出现的错误