您的位置:首页 > 移动开发 > Android开发

项目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中该方法不存在,使用反射机制找到被屏蔽

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 android-适配
相关文章推荐