升级SDK至32后遇权限错误:getParams()重写时权限弱化问题
解决SDK升级到32后getParams()方法冲突问题
问题根源
Android 12(SDK 31)及以上版本的ContextWrapper类新增了一个public的getParams()方法,返回类型为Bundle。你的自定义类(如Activity/Fragment)间接继承了ContextWrapper,导致你自己的getParams()方法(返回HashMap<String,String>)和系统方法重名且返回类型不兼容。即使改成public并添加@Override也无法解决,因为Java重写要求返回类型必须是父类方法返回类型的子类或相同类型,而HashMap与Bundle无继承关系,属于方法冲突。
解决方案:重命名自定义方法
最直接的解决方式是给你的getParams()方法换个名字,避免和系统方法冲突,同时同步修改所有调用该方法的地方。
以下是三个文件的修改示例:
1. ManageProfile.java 修改
// 重命名方法为getApiParams,同时补上params的初始化(原代码存在空指针隐患) public HashMap<String, String> getApiParams() { HashMap<String, String> params = new HashMap<>(); if (!ProjectUtils.isEditTextFilled(binding.cetName)) { params.put(Consts.NAME, ProjectUtils.getEditTextValue(binding.cetName)); } else { Toast.makeText(mContext, R.string.addname, Toast.LENGTH_SHORT).show(); } params.put(Consts.NAME, ProjectUtils.getEditTextValue(binding.cetName)); params.put(Consts.MOBILE, ProjectUtils.getEditTextValue(binding.cetNumber)); params.put(Consts.COUNTRY_CODE, "91"); params.put(Consts.DEVICE_TYPE, "Android"); params.put(Consts.DEVICE_TOKEN, Settings.Secure.getString(getApplicationContext().getContentResolver(), Settings.Secure.ANDROID_ID)); return params; }
2. SchedulepickDate.java 修改
// 重命名方法为getApiParams,补上hashMap的初始化 public HashMap<String, String> getApiParams() { HashMap<String, String> hashMap = new HashMap<>(); hashMap.put(Consts.PICKUP_DATE, ProjectUtils.getEditTextValue(binding.ctvPickupDate)); hashMap.put(Consts.PICKUP_TIME, ProjectUtils.getEditTextValue(binding.ctvPickupTime)); hashMap.put(Consts.DELIVERY_DATE, ProjectUtils.getEditTextValue(binding.ctvDeliveryDate)); hashMap.put(Consts.DELIVERY_TIME, ProjectUtils.getEditTextValue(binding.ctvDeliveryTime)); return hashMap; }
3. SchedulePickup.java 修改
// 重命名方法为getApiParams public HashMap<String, String> getApiParams() { HashMap<String, String> params = new HashMap<>(); params.put(Consts.SHIPPING_ADDRESS, address); params.put(Consts.LATITUDE, String.valueOf(lats)); if (landmark.equalsIgnoreCase("")) { params.put(Consts.LANDMARK, ""); } else { params.put(Consts.LANDMARK, landmark); } params.put(Consts.LONGITUDE, String.valueOf(longs)); return params; }
最后一步:同步修改调用处
找到所有调用getParams()的代码,替换为新的方法名getApiParams(),例如:
// 原代码 HashMap<String,String> params = getParams(); // 修改后 HashMap<String,String> params = getApiParams();
内容的提问来源于stack exchange,提问作者Sandeep Kumar
相关产品推荐
相关产品推荐

