uni-app android 12 自定义基座同步文件时报错
uni-app android 12 自定义基座同步文件时报错
# 产品分类
uni小程序SDK
# 手机系统
Android
# 手机系统版本号
Android 12
# 手机厂商
三星
# 手机机型
s20
# 页面类型
vue
# SDK版本号
3.3.11
## 操作步骤
- 用hbuilder 3.4.3运行到手机
## 预期结果
- 成功同步文件
## 实际结果
- copyFile error Message=Attempt to invoke virtual method 'android.content.pm.ApplicationInfo android.content.Context.getApplicationInfo()' on a null object reference
## bug描述
自定义基座真机运行,
上传资源文件会报copyFile error Message=Attempt to invoke virtual method 'android.content.Context.getApplicationInfo()' on a null object reference
用官网sdk中的demo来当做基座也一样不能同步文件

1 回复
在 uni-app 开发过程中,使用 Android 12 自定义基座同步文件时可能会遇到一些错误。以下是一些常见的问题及其解决方案:
1. 权限问题
Android 12 对文件访问权限进行了更严格的限制。确保你的应用已经获得了必要的文件读写权限。
解决方案:
在 AndroidManifest.xml
文件中添加以下权限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
并且在运行时请求权限:
uni.authorize({
scope: 'scope.writePhotosAlbum',
success() {
console.log('授权成功');
},
fail() {
console.log('授权失败');
}
});
2. Scoped Storage
Android 10 及以上版本引入了 Scoped Storage,限制了应用对文件系统的访问。
解决方案:
在 AndroidManifest.xml
中添加以下配置以请求 MANAGE_EXTERNAL_STORAGE
权限:
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
并且在运行时请求权限:
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.R) {
if (!Environment.isExternalStorageManager()) {
const intent = new android.content.Intent(android.provider.Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
intent.setData(android.net.Uri.parse("package:" + plus.android.runtimeMainActivity().getPackageName()));
plus.android.runtimeMainActivity().startActivity(intent);
}
}
3. 自定义基座配置问题
自定义基座可能没有正确配置,导致文件同步失败。
解决方案:
确保在 manifest.json
中正确配置了自定义基座:
{
"app-plus": {
"distribute": {
"android": {
"packagename": "com.example.app",
"keystore": "your.keystore",
"password": "yourpassword",
"aliasname": "youralias",
"aliaspassword": "youraliaspassword"
}
}
}
}
4. 文件路径问题
文件路径可能不正确,导致同步失败。
解决方案:
确保文件路径正确,并且文件存在。可以使用 plus.io
API 来检查文件路径:
plus.io.resolveLocalFileSystemURL(filePath, function(entry) {
console.log('文件存在:', entry.toURL());
}, function(error) {
console.log('文件不存在:', error);
});