uni-app 离线打包安卓APP常见问题汇总(手机)
uni-app 离线打包总会有各种各样的坑,以下是我的分享:
支付相关
原因为:requestPayment:fail[payment微信:-1]Genernal errors
新建一个同包名的相似应用名称,微信审核成功后,去商户后台关联appid,然后微信开发平台同意授权,后台返回跟之前一样的参数,完美
四、权限问题
三、应用管理界面,找不到选择离线打包Key管理
因为应用宝隐私保护审核变严了,之前的uniapp自动会获取mac地址等,用于数据分析,所以要换3.1.10+打包了,要appid了,技术更新得太快了,没很入坑的建议,早点下车。。。找个离线打包Key管理
,都疑惑了我大半天。。可能是我太辣鸡了,居然要双击应用名称
才出来,选中是没得用的。
一、播放视频功能
勾选模块
原生的放包至libs
文件:media-release.aar
二、应用设置里都显示,相机授权了,调相机也没反应
调相机功能,基座能正常运行,打包,配了权限了,且基座运行时还询问了相机权限,我还授权了,去设置里面看这个app也显示授权了,可是调相机,没有任何反应,试的都要哭了,后面发现是有个包名没有改过来,以下是处理办法:
AndroidManifest.xml
的application
节点下添加
或修改
provider节点,${apk.applicationId}
请填写自己的包名,代码和图片如下:
<provider
android:name="io.dcloud.common.util.DCloud_FileProvider"
android:authorities="${apk.applicationId}.dc.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/dcloud_file_provider" />
</provider>
赠品
离线打包的权限
需要在AndroidManifest.xml
的application
节点前
添加权限,代码和图片如下:
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<!-- 摄像头权限 -->
<uses-permission android:name="android.permission.CAMERA" />
<!-- 开启闪光灯权限 -->
<uses-permission android:name="android.permission.FLASHLIGHT"/>
调用相机代码
async appCamera() {
let that = this;
var cmr = plus.camera.getCamera(1);
var res = cmr.supportedImageResolutions[0];
var fmt = cmr.supportedImageFormats[0];
let funTips = '相机';
//是不是isAndroidOs,请在APP.vue全局赋值
//判断是否授权,没授权跳转设置
var iscan = await permission_app.req_Permit_any(that.isAndroidOs, permission_app.permisionID_anrd.camera,
permission_app.permisionID_ios.camera, funTips);
if (iscan) {
cmr.captureImage((path) => {
that.chooseSuccessMethod([path])
},
(error) => {
//alert("Capture image failed: " + error.message);
console.log('失败!请重新选择');
}, {
resolution: res,
format: fmt
}
);
}
},
async chooseSuccessMethod(filePath) {
let that = this;
let path = filePath[0] ;
return path;
},
引入权限封装的js
//#ifdef APP-PLUS
import permission_app from "@/permission_app.js";
// #endif
permission_app.js:此js封装了大部分App权限判断函数,适用安卓和iOS
/**
* 本模块封装了Android、iOS的应用权限判断、打开应用权限设置界面、以及位置系统服务是否开启
*/
var isIos
// #ifdef APP-PLUS
isIos = (plus.os.name == "iOS")
// #endif
// 判断推送权限是否开启
function judgeIosPermissionPush() {
var result = false;
var UIApplication = plus.ios.import("UIApplication");
var app = UIApplication.sharedApplication();
var enabledTypes = 0;
if (app.currentUserNotificationSettings) {
var settings = app.currentUserNotificationSettings();
enabledTypes = settings.plusGetAttribute("types");
console.log("enabledTypes1:" + enabledTypes);
if (enabledTypes == 0) {
console.log("推送权限没有开启");
} else {
result = true;
console.log("已经开启推送功能!")
}
plus.ios.deleteObject(settings);
} else {
enabledTypes = app.enabledRemoteNotificationTypes();
if (enabledTypes == 0) {
console.log("推送权限没有开启!");
} else {
result = true;
console.log("已经开启推送功能!")
}
console.log("enabledTypes2:" + enabledTypes);
}
plus.ios.deleteObject(app);
plus.ios.deleteObject(UIApplication);
return result;
}
// 判断定位权限是否开启
function judgeIosPermissionLocation() {
var result = false;
var cllocationManger = plus.ios.import("CLLocationManager");
var status = cllocationManger.authorizationStatus();
result = (status != 2)
console.log("定位权限开启:" + result);
// 以下代码判断了手机设备的定位是否关闭,推荐另行使用方法 checkSystemEnableLocation
/* var enable = cllocationManger.locationServicesEnabled();
var status = cllocationManger.authorizationStatus();
console.log("enable:" + enable);
console.log("status:" + status);
if (enable && status != 2) {
result = true;
console.log("手机定位服务已开启且已授予定位权限");
} else {
console.log("手机系统的定位没有打开或未给予定位权限");
} */
plus.ios.deleteObject(cllocationManger);
return result;
}
// 判断麦克风权限是否开启
function judgeIosPermissionRecord() {
var