android 学习中遇到的知识点(杂)
1. 用xml 合成图片
ic_launcher.xml 作用:将两个图片组合成一个图片,一个背景图,一个icon
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@mipmap/ic_launcher_background"/>
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
</adaptive-icon>


------生成了

2. Android中的app忽略电池优化
当使用环信SDK进行集成时,在访问该页面后,默认状态会显示一条提示对话框。如果您希望取消此默认提示,请前往项目配置界面并删除相应的配置项设置即可。
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
String packageName = getPackageName();
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
if (!pm.isIgnoringBatteryOptimizations(packageName)) {
try {
//some device doesn't has activity to handle this intent
//so add try catch
Intent intent = new Intent();
intent.setAction(android.provider.Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
intent.setData(Uri.parse("package:" + packageName));
startActivity(intent);
} catch (Exception e) {
}
}
}

这个功能在manifest文件中配置了权限:
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/>
3. android9.0新特性:
(1)启动前台服务
在Android 8.x版本中对后台进程进行了严格管理,在开启后必须激活通知权限才能实现这些功能;而从版本9.x开始就无法绕过权限检查问题。具体来说,在9.x系统中会报错'Permission Denial: startForeground requires android.permission.FOREGROUND_SERVICE'。
解决办法是在AndroidManifest中添加
<!--android 9.0上使用前台服务,需要添加权限-->
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
在随后启动服务的过程中同样需要进行相应的处理步骤。如果不进行这些处理操作,则会导致程序在启动服务时遇到不允许的情况并抛出一个异常:java.lang.IllegalStateException: Not allowed to start service Intent。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
context.startForegroundService(intent);
} else {
context.startService(intent);
}
(2)Android 9.0强制使用https
Android 9.0强制要求应用采用HTTPS,并可能导致所有HTTP请求暂时无法处理。当应用依赖的第三方SDK包含HTTP功能时,请确保提前处理这些请求以避免阻塞现象发生。遇到UnknownServiceException: CLEARTEXT通信至本地host被网络安全策略禁止或IOException java.io.IOException: Cleartext HTTP流量至*未获允许时,请立即检查并采取相应措施以解除相关安全限制。
解决方法:
在AndroidManifest文件中的application属性采用 Cleartext Traffic 传输模式
参考文献:Android App兼容8.0和9.0
4. 拨打电话:
跳转到拨号界面:
public void callPhone(String phoneNum) {
Intent intent = new Intent(Intent.ACTION_DIAL);
Uri data = Uri.parse("tel:" + phoneNum);
intent.setData(data);
getContext().startActivity(intent);
}
直接拨打电话:
public void callAction(String telPhone) {
Intent intent = new Intent(Intent.ACTION_CALL);
Uri data = Uri.parse("tel:" + telPhone);
intent.setData(data);
getContext().startActivity(intent);
}
