记录Android10+后做的一些事情
Android10文件操作
AndroidManifest中 Application增加 android:requestLegacyExternalStorage="true"
仅在Android10解决了问题,诶~系统版本升级带来的问题真麻烦
Android11+文件操作会报错
ERROR:android.system.ErrnoException: open failed: EACCES (Permission
denied)
解决:
使用外部私有路径如:getExternalFilesDir(null)
Android11 文件读写权限精细化 - 分为内部私有区域,外部私有区域,外部公开区域。访问外部公开区域的时候会报上述错误。
建议使用外部私有区域(如果将文件存储在外部私有区域中Cache相关目录下,内容容易被第三方如鲁大师这种应用给清理掉)。
如果不介意弹出系统设置页面,解决:
增加权限:
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
文件操作位置增加代码:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
if(!Environment.isExternalStorageManager()){
startActivityForResult(new Intent(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION),0x99);
}
}
// onActivityResult 添加:
if (requestCode == 0x99){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
if(!Environment.isExternalStorageManager()){
showToast("请勾选文件访问权限后再试");
} else {
//TODO
}
}
}
注:小米手机测试的时候发现调用系统的裁剪功能出现图片保存失败问题。
(不允许访问私有路径,但是访问公共区域又面临需要申请全部文件操作权限,就是上述权限申请会打开系统的设置i页面,然后选择自己的应用,在打开全部文件操作权限。感觉非常不友好!!!)。
目前没发现解决办法,如果有人知道如果解决,感谢告知~~~~
Android10+:无页面Service调用startActivity(如调用系统拨打拨打电话)
Android10+:引入了后台启动权限
可以看看这个链接找找解决办法
https://blog.csdn.net/xiaoyantan/article/details/128401740
Android 11加强了应用可见性
前提:我是升级 targetSdkVersion 到33的时候遇到的问题
原来的调用方式没有变,但系统内部是做了更苛刻的条件进行判断。什么是可见性?,在这里可见性指其他应用是否能被当前应用检测到(是否已经安装了某个app,一般这种需求不多或特定应用才会检测是否已经安装某个app )。
解决:
AndroidManifest中增加:微信支付无法调起,检测不到已安装微信
<queries>
<package android:name="com.tencent.mm" />
</queries>
具体位置:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="...">
<queries>
<package android:name="com.tencent.mm" />
</queries>
.....
</manifest>
备注:
由于是新的标签,因此需要升级开发工具,否则会出现编译错误:
1)Android Studio 需要升级至 3.3 及以上,建议升级至 4.0 及以上版本;
2)Android SDK Build-Tools 需要升级至 30 及以上版本;
3)com.android.tools.build:gradle 需要升级至 3.6.0 版本,建议升级至最新的 3.6.4 版本。
方法2:增加权限 - 查询所有应用及与之交互的权限。
我没这么做,感觉还是用上边方法合适一些
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"/>
方法3:
app的targetSdkVersion 改为29 很明显不能这么做,华为应用商店上架要求SdkVersion增加到30+
Android10 TelephonyManager 使用报错 java.lang.SecurityException
注:很奇怪,这个问题我在实际开发测试中没有遇到,是上架OPPO应用商店的时候人家给我反馈的。
我是用来监听拨打电话的时候遇到的
应该是要具有 Manifest.permission.READ_PHONE_STATE 权限后才能使用
代码如下:
phoneManager = (TelephonyManager)getContext().getSystemService(Context.TELEPHONY_SERVICE);
phoneListen = new PhoneListen(getContext()); // 一个自定义继承PhoneStateListener的类
if (phoneManager != null) {
phoneManager.listen(phoneListen, PhoneStateListener.LISTEN_CALL_STATE);
phoneListen.setOnCallResultListener(new PhoneListen.OnCallResultListener() {
@Override
public void onResult(String time) {
// 这里是读取本地通讯录拿到通话时长,做后续业务处理
}
});
}
OPPO提供的错误信息:
12-06 12:01:31.711 E/DEBUG (13211): java.lang.SecurityException: listen
12-06 12:01:31.711 E/DEBUG (13211): at android.os.Parcel.createExceptionOrNull(Parcel.java:3040)
12-06 12:01:31.711 E/DEBUG (13211): at android.os.Parcel.createException(Parcel.java:3024)
12-06 12:01:31.711 E/DEBUG (13211): at android.os.Parcel.readException(Parcel.java:3007)
12-06 12:01:31.711 E/DEBUG (13211): at android.os.Parcel.readException(Parcel.java:2949)
12-06 12:01:31.711 E/DEBUG (13211): at com.android.internal.telephony.ITelephonyRegistry S t u b Stub StubProxy.listenWithEventList(ITelephonyRegistry.java:1058)
…
12-06 12:01:31.712 E/DEBUG (13211): Caused by: android.os.RemoteException: Remote stack trace:
12-06 12:01:31.712 E/DEBUG (13211): at com.android.internal.telephony.TelephonyPermissions.enforceCarrierPrivilege(TelephonyPermissions.java:676)
…
12-06 12:01:31.712 E/DEBUG (13211): at com.android.server.TelephonyRegistry.listen(TelephonyRegistry.java:1099)
我看了个文章解决试试 https://blog.csdn.net/weixin_42504805/article/details/134038121
然后在初始化这个phoneManager的地方加了个权限判断,后续实际使用申请了权限再调用 initPhoneTelManagerListener() 初始化。
方法:
private boolean lacksPermission() {
return ContextCompat.checkSelfPermission(getContext(), Manifest.permission.READ_PHONE_STATE) ==
PackageManager.PERMISSION_GRANTED && ContextCompat.checkSelfPermission(getContext(), Manifest.permission.PROCESS_OUTGOING_CALLS) ==
PackageManager.PERMISSION_GRANTED && ContextCompat.checkSelfPermission(getContext(), Manifest.permission.READ_CALL_LOG) ==
PackageManager.PERMISSION_GRANTED;
}
private void init(){
boolean flag = lacksPermission();
if(phoneManager == null && flag){
initPhoneTelManagerListener(); // 上边的初始化方法
}
}
Android文件读取权限修改
Android到权限变细致了,增加了三个权限:
我目前只用到读取本地图片,所以在动态申请权限的时候我只申请了 IMAGES
<!-- android 11 + sdk升级至33,文件读写权限 -->
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO"/>
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES"/>
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO"/>
代码:
String[] pers;
//版本判断,如果比android 13 就走正常的权限获取
if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {
pers = new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE};
} else {
pers = new String[]{Manifest.permission.READ_MEDIA_IMAGES};
}
Android13,targetSdkVersion升级到33后通知权限处理
需要动态申请权限:
<uses-permissionandroid:name="android.permission.POST_NOTIFICATIONS"/>
代码:
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
// checkAndPost Manifest.permission.POST_NOTIFICATIONS
} else {
// 该咋通知咋通知
}