由于今年AndroidQ的发布以及应用市场对sdk版本的要求,需要对目前公司维护的老旧的Android项目进行AndroidQ适配。
遇到的问题:
1、提升Gradle和SDK版本号
2、AndroidManifest.xml增加权限
3、动态获取权限
4、项目升级时AndroidQ解决方案
5、琐碎问题
解决方案:
1、提升Gradle和SDK版本号
project build.gradle:
提升classpath依赖的版本号

app build.gradle
compileSdkVersion 和 buildToolsVersion 提升到相应版本号
并增加:minSdkVersion
targetSdkVersion
versionCode
versionName 如图

2、AndroidManifest.xml增加权限
原有权限不需要进行修改,增加新的权限
<!--升级包安装权限-->
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<!--定位权限8.0以后兼容10-->
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
3、动态获取权限
再首页进行动态申请权限(涉及到版本检测和升级功能)
private static final String[]PERMISSIONS_STORAGE = {
Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.READ_PHONE_STATE
};//所需权限数组
private static final int authRequestCode =1;
//申请权限
private void initpermission() {
if (Build.VERSION.SDK_INT >=23) {
if (!hasBasePhoneAuth()) {
this.requestPermissions(PERMISSIONS_STORAGE, authRequestCode);
}else {
if (isUpdate.equals("true")) {//确定更新
updateClick =false;
checkUpdate();
}
}
}else {
if (isUpdate.equals("true")) {//确定更新
updateClick =false;
checkUpdate();
}
}
}
//检查有权限
private boolean hasBasePhoneAuth() {
PackageManager pm =this.getPackageManager();
for (String auth :PERMISSIONS_STORAGE) {
if (pm.checkPermission(auth, this.getPackageName()) != PackageManager
.PERMISSION_GRANTED) {
return false;
}
}
return true;
}
//申请权限回调
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case authRequestCode:
System.out.println("获取权限是否成功的数量:" + grantResults.length);
for (int ret : grantResults) {
if (ret ==0) {
continue;
}else {
return;
}
}
initpermission();
break;
}
}
4、项目升级时AndroidQ解决方案
AndroidManifest.xml的修改
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="包名(applicationId).fileProvider"
android:exported="false"
android:grantUriPermissions="true">
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
file_paths内容
<?xml version="1.0" encoding="utf-8"?>
<resources>
<paths>
<!-- Context.getFilesDir() + "/path/" -->
<files-path
name="my_files"
path="mazaiting/"/>
<!-- Context.getCacheDir() + "/path/" -->
<cache-path
name="my_cache"
path="mazaiting/"/>
<!-- Context.getExternalFilesDir(null) + "/path/" -->
<external-files-path
name="external-files-path"
path="mazaiting/"/>
<!-- Context.getExternalCacheDir() + "/path/" -->
<external-cache-path
name="name"
path="mazaiting/" />
<!-- Environment.getExternalStorageDirectory() + "/path/" -->
<external-path
name="my_external_path"
path="mazaiting/"/>
<!-- Environment.getExternalStorageDirectory() + "/path/" -->
<external-path
name="files_root"
path="Android/data/包名(applicationId)/"/>
<!-- path设置为'.'时代表整个存储卡 Environment.getExternalStorageDirectory() + "/path/" -->
<external-path
name="external_storage_root"
path="."/>
</paths>
</resources>
UpdateDataManager.java 中apk安装方法
/**
* 安装APK文件
*/
private void installApk() {
File apkfile =new File(UtilTool.APK_DOWNLOAD_PATH, apkName);
if (!apkfile.exists()) {
return;
}
//获取下载文件的Uri
Intent intent =new Intent(Intent.ACTION_VIEW);
//7.0 以上需要FileProvider进行设置
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
Uri apkUri = FileProvider.getUriForFile(mContext, BuildConfig.APPLICATION_ID +".fileProvider", apkfile);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
intent.setDataAndType(apkUri, mContext.getContentResolver().getType(apkUri));
}else {
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setDataAndType(Uri.fromFile(apkfile), "application/vnd.android.package-archive");
}
mContext.startActivity(intent);
}
5、琐碎问题
升级到Android Q之后项目中获取imei的方法会进行报错
UtilTool.java
/**
* 获取imei号
*
* @param context
* @return
*/
public static StringgetIMEI(Context context) {
TelephonyManager telephonyManager = (TelephonyManager) context
.getSystemService(Context.TELEPHONY_SERVICE);
if (ActivityCompat.checkSelfPermission(context, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
// TODO: Consider calling
// ActivityCompat#requestPermissions
// here to request the missing permissions, and then overriding
// public void onRequestPermissionsResult(int requestCode, String[] permissions,
// int[] grantResults)
// to handle the case where the user grants the permission. See the documentation
// for ActivityCompat#requestPermissions for more details.
return null;
}
String imei = telephonyManager.getDeviceId();
return imei;
}
BaiduMap
百度地图
引用baidumapapi_v3_5_0.jar包中的方法时原有方法不能使用了
要引用另外一个
SDKInitializer.initialize(this);
网友评论