android h5调用百度地图,mui H5+plus 调用第三方地图导航(百度、高德、腾讯),包含Android和iOS端...

var lng = opt.lng; //目标经度

var lat = opt.lat; //目标纬度

//把百度坐标系bd09转国测局坐标系wgs84

var sopt = coordtransform.bd09towgs84(lng, lat);

//经测试腾讯地图必须使用火星坐标系gcj02,顾单独转换

var coordQQ = coordtransform.bd09togcj02(lng, lat);

//如果还知道其他地图的包名,也可以放这个数组里

var mapsPackageNames = ['com.baidu.BaiduMap', 'com.autonavi.minimap', 'com.tencent.map'];

//iOS与Android的判断第三方程序不一样,Android是包名,iOS是action属性(Scheme)

var iosURLTypes = ['baidumap://', 'iosamap://', 'qqmap://'];

if(plus.os.name == "iOS"){mapsPackageNames = iosURLTypes};

app.base.operationAfterCheckInstall(mapsPackageNames, function(res) { //res(object)

// alert(JSON.stringify(res))

var m=0,gotoUrl="";//m:记录本机地图app个数,gotoUrl:记录实际直接跳转地址

var btnArray = []; //实际显示按钮数组

var btnTitle = ["使用百度地图导航","使用高德地图导航","使用腾讯地图导航"];

var urlArray = []; //实际显示跳转地址数组

//百度api文档:http://lbsyun.baidu.com/index.php?title=uri/api/android

//高德api文档:https://lbs.amap.com/api/amap-mobile/guide/ios/route

//腾讯api文档:https://lbs.qq.com/webApi/uriV1/uriGuide/uriMobileRoute

var andrUrl = [

"baidumap://map/direction?origin=&destination="+sopt[1]+","+sopt[0]+"&coord_type=wgs84&mode=driving&src=andr.baidu.openAPIdemo",

"amapuri://route/plan/?slat=&slon=&dlat="+sopt[1]+"&dlon="+sopt[0]+"&dev=1&t=0",

"qqmap://map/routeplan?type=drive&fromcoord=CurrentLocation&tocoord="+coordQQ[1]+","+coordQQ[0]+"&referer=OB4BZ-D4W3U-B7VVO-4PJWW-6TKDJ-WPB77"

]

var iosUrl = [

"baidumap://map/direction?origin=&destination="+sopt[1]+","+sopt[0]+"&coord_type=wgs84&mode=driving&src=ios.baidu.openAPIdemo",

"iosamap://path?sourceApplication=applicationNameslat=&slon=&dlat="+sopt[1]+"&dlon="+sopt[0]+"&dev=1&t=0",

"qqmap://map/routeplan?type=drive&fromcoord=CurrentLocation&tocoord="+coordQQ[1]+","+coordQQ[0]+"&referer=OB4BZ-D4W3U-B7VVO-4PJWW-6TKDJ-WPB77"

]

//根据手机型号确定跳转数组var

if(plus.os.name == "iOS"){

urlArray = iosUrl;

}else{

urlArray = andrUrl;

}

var gotoUrlArr = [];

for(k in res){

if(res[k]){

m++;

gotoUrl = urlArray[k];

btnArray.push({

title: btnTitle[k]

})

gotoUrlArr.push(urlArray[k])

}

}

//当只有一个地图APP时,直接跳转;不止一个时弹出原生选择框

if(m > 1){

plus.nativeUI.actionSheet( {

title:"请选择地图",

cancel:"取消",

buttons:btnArray

}, function(e){

if(e.index > 0){ //=0:取消,1:百度,2:高德,3:腾讯

plus.runtime.openURL(gotoUrlArr[e.index-1]);

}

} );

}else{

plus.runtime.openURL(gotoUrl);

}

// plus.maps.openSysMap(dst, name, src);//直接默认跳转第三方,无回调,已弃用

}, function() {

alert("您未安装百度地图、高德地图、腾讯地图,请前往应用市场下载");

})

//传入包名,检查手机上是否安装了这个应用

function isInstall(packageName){

try {

if(plus.os.name == "iOS"){

var UIApplication = plus.ios.importClass("UIApplication");

var NSURL = plus.ios.importClass("NSURL");

var app = UIApplication.sharedApplication();

var bdScheme = NSURL.URLWithString(packageName);

var install = app.canOpenURL(bdScheme);

plus.ios.deleteObject(bdScheme);

plus.ios.deleteObject(app);

return install

}else{

var main = plus.android.runtimeMainActivity();

var packageManager = main.getPackageManager();

var PackageManager = plus.android.importClass(packageManager);

var packageinfo = packageManager.getPackageInfo(packageName, PackageManager.GET_ACTIVITIES)

if (packageinfo) {

return true;

} else {

return false;

}

}

} catch (e) {

return false;

}

}

//批量传入包名,检查一系列应用是否安装,如果有任意一个安装了,就执行success,否认执行fai

function operationAfterCheckInstall (mapsPackageNames, success, fail){

var res = mapsPackageNames.map(function(item) {

return app.base.isInstall(item);

})

if (eval(res.join("||"))) {

success(res);

} else {

fail();

}

}

最后coordtransform.js插件附在最后

/**

* 作者:阿澡惜 (1401501016@qq.com).

* 提供了百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)、和WGS84坐标系之间的转换

* coordtransform.js

*/

//使用示例

//国测局坐标(火星坐标,比如高德地图在用),百度坐标,wgs84坐标(谷歌国外以及绝大部分国外在线地图使用的坐标)

//百度经纬度坐标转国测局坐标

// var bd09togcj02 = coordtransform.bd09togcj02(116.404, 39.915);

// //国测局坐标转百度经纬度坐标

// var gcj02tobd09 = coordtransform.gcj02tobd09(116.404, 39.915);

// //wgs84转国测局坐标

// var wgs84togcj02 = coordtransform.wgs84togcj02(116.404, 39.915);

// //国测局坐标转wgs84坐标

// var gcj02towgs84 = coordtransform.gcj02towgs84(116.404, 39.915);

// //百度经纬度坐标转wgs84坐标

// var bd09towgs84 = coordtransform.bd09towgs84(lng, lat);

// //wgs84坐标转百度经纬度坐标

// var wgs84tobd09 = coordtransform.wgs84tobd09(lng, lat);

// console.log(bd09togcj02);

// console.log(gcj02tobd09);

// console.log(wgs84togcj02);

// console.log(gcj02towgs84);

//result

//bd09togcj02: [ 116.39762729119315, 39.90865673957631 ]

//gcj02tobd09: [ 116.41036949371029, 39.92133699351021 ]

//wgs84togcj02: [ 116.41024449916938, 39.91640428150164 ]

//gcj02towgs84: [ 116.39775550083061, 39.91359571849836 ]

//UMD魔法代码

// if the module has no dependencies, the above pattern can be simplified to

(function (root, factory) {

if (typeof define === 'function' && define.amd) {

// AMD. Register as an anonymous module.

define([], factory);

} else if (typeof module === 'object' && module.exports) {

// Node. Does not work with strict CommonJS, but

// only CommonJS-like environments that support module.exports,

// like Node.

module.exports = factory();

} else {

// Browser globals (root is window)

root.coordtransform = factory();

}

}(this, function () {

//定义一些常量

var x_PI = 3.14159265358979324 * 3000.0 / 180.0;

var PI = 3.1415926535897932384626;

var a = 6378245.0;

var ee = 0.00669342162296594323;

/**

* 百度坐标系 (BD-09) 与 火星坐标系 (GCJ-02)的转换

* 即 百度 转 谷歌、高德

* @param bd_lon

* @param bd_lat

* @returns {*[]}

*/

var bd09togcj02 = function bd09togcj02(bd_lon, bd_lat) {

var bd_lon = +bd_lon;

var bd_lat = +bd_lat;

var x = bd_lon - 0.0065;

var y = bd_lat - 0.006;

var z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * x_PI);

var theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * x_PI);

var gg_lng = z * Math.cos(theta);

var gg_lat = z * Math.sin(theta);

return [gg_lng, gg_lat]

};

/**

* 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换

* 即谷歌、高德 转 百度

* @param lng

* @param lat

* @returns {*[]}

*/

var gcj02tobd09 = function gcj02tobd09(lng, lat) {

var lat = +lat;

var lng = +lng;

var z = Math.sqrt(lng * lng + lat * lat) + 0.00002 * Math.sin(lat * x_PI);

var theta = Math.atan2(lat, lng) + 0.000003 * Math.cos(lng * x_PI);

var bd_lng = z * Math.cos(theta) + 0.0065;

var bd_lat = z * Math.sin(theta) + 0.006;

return [bd_lng, bd_lat]

};

/**

* WGS84转GCj02

* @param lng

* @param lat

* @returns {*[]}

*/

var wgs84togcj02 = function wgs84togcj02(lng, lat) {

var lat = +lat;

var lng = +lng;

if (out_of_china(lng, lat)) {

return [lng, lat]

} else {

var dlat = transformlat(lng - 105.0, lat - 35.0);

var dlng = transformlng(lng - 105.0, lat - 35.0);

var radlat = lat / 180.0 * PI;

var magic = Math.sin(radlat);

magic = 1 - ee * magic * magic;

var sqrtmagic = Math.sqrt(magic);

dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * PI);

dlng = (dlng * 180.0) / (a / sqrtmagic * Math.cos(radlat) * PI);

var mglat = lat + dlat;

var mglng = lng + dlng;

return [mglng, mglat]

}

};

/**

* GCJ02 转换为 WGS84

* @param lng

* @param lat

* @returns {*[]}

*/

var gcj02towgs84 = function gcj02towgs84(lng, lat) {

var lat = +lat;

var lng = +lng;

if (out_of_china(lng, lat)) {

return [lng, lat]

} else {

var dlat = transformlat(lng - 105.0, lat - 35.0);

var dlng = transformlng(lng - 105.0, lat - 35.0);

var radlat = lat / 180.0 * PI;

var magic = Math.sin(radlat);

magic = 1 - ee * magic * magic;

var sqrtmagic = Math.sqrt(magic);

dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * PI);

dlng = (dlng * 180.0) / (a / sqrtmagic * Math.cos(radlat) * PI);

var mglat = lat + dlat;

var mglng = lng + dlng;

return [lng * 2 - mglng, lat * 2 - mglat]

}

};

/**

* 百度坐标系 (BD-09) 转换为 WGS84

* @param lng

* @param lat

* @returns {*[]}

*/

var bd09towgs84 = function bd09towgs84(bd_lon, bd_lat){

//百度经纬度坐标转国测局坐标

var bd09togcj02_arr = coordtransform.bd09togcj02(bd_lon, bd_lat);

//国测局坐标转wgs84坐标

var gcj02towgs84_arr = coordtransform.gcj02towgs84(bd09togcj02_arr[0], bd09togcj02_arr[1]);

return [gcj02towgs84_arr[0], gcj02towgs84_arr[1]]

};

/**

* WGS84 转换为 百度坐标系 (BD-09)

* @param lng

* @param lat

* @returns {*[]}

*/

var wgs84tobd09 = function wgs84tobd09(lng, lat){

//wgs84转国测局坐标

var wgs84togcj02_arr = coordtransform.wgs84togcj02(lng, lat);

//国测局坐标转百度经纬度坐标

var gcj02tobd09_arr = coordtransform.gcj02tobd09(wgs84togcj02_arr[0], wgs84togcj02_arr[1]);

return [gcj02tobd09_arr[0], gcj02tobd09_arr[1]]

};

var transformlat = function transformlat(lng, lat) {

var lat = +lat;

var lng = +lng;

var ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + 0.1 * lng * lat + 0.2 * Math.sqrt(Math.abs(lng));

ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0;

ret += (20.0 * Math.sin(lat * PI) + 40.0 * Math.sin(lat / 3.0 * PI)) * 2.0 / 3.0;

ret += (160.0 * Math.sin(lat / 12.0 * PI) + 320 * Math.sin(lat * PI / 30.0)) * 2.0 / 3.0;

return ret

};

var transformlng = function transformlng(lng, lat) {

var lat = +lat;

var lng = +lng;

var ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * Math.sqrt(Math.abs(lng));

ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0;

ret += (20.0 * Math.sin(lng * PI) + 40.0 * Math.sin(lng / 3.0 * PI)) * 2.0 / 3.0;

ret += (150.0 * Math.sin(lng / 12.0 * PI) + 300.0 * Math.sin(lng / 30.0 * PI)) * 2.0 / 3.0;

return ret

};

/**

* 判断是否在国内,不在国内则不做偏移

* @param lng

* @param lat

* @returns {boolean}

*/

var out_of_china = function out_of_china(lng, lat) {

var lat = +lat;

var lng = +lng;

// 纬度3.86~53.55,经度73.66~135.05

return !(lng > 73.66 && lng < 135.05 && lat > 3.86 && lat < 53.55);

};

return {

bd09togcj02: bd09togcj02,

gcj02tobd09: gcj02tobd09,

wgs84togcj02: wgs84togcj02,

gcj02towgs84: gcj02towgs84,

bd09towgs84: bd09towgs84,

wgs84tobd09: wgs84tobd09

}

}));

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WebApp mui&H5+ 可以结合使用 Native.js for Android 完成视频录制和处理。以下是大致的实现步骤: 1. 引入 Native.js for Android 插件,该插件可以在 H5+ 中使用 Native 方法。 2. 使用 H5+ API 调用 Android 摄像头,获取视频流,并且使用 Native 方法将视频流传递给 Android Native 代码。 3. 在 Android Native 代码中,使用 Camera2 API 获得视频流,并且使用 MediaRecorder API 将视频流录制为 MP4 格式的视频。 4. 将录制好的视频文件保存到指定的路径,并且使用 Native 方法将视频文件路径传递给 H5+ 代码。 5. 在 H5+ 代码中,使用 HTML5 Video 标签来播放录制好的视频。 示例代码如下: H5+ 代码: ``` // 引入 Native.js for Android 插件 document.addEventListener('plusready', function() { var nativeApi = plus.android.importClass('io.dcloud.NativeApi'); var nativeObj = new nativeApi(); // 使用 H5+ API 调用 Android 摄像头 var cmr = plus.camera.getCamera(); cmr.startVideoCapture(function(path) { // 使用 Native 方法将视频流传递给 Android Native 代码 nativeObj.exec('com.example.camera', 'startRecording', [path], function(result) { console.log(result); // 使用 Native 方法将视频文件路径传递给 H5+ 代码 nativeObj.exec('com.example.camera', 'getVideoPath', [], function(path) { console.log(path); var video = document.getElementById('video'); video.src = path; video.play(); }, function(e) { console.log(e); }); }, function(e) { console.log(e); }); }, function(e) { console.log(e); }, {filename:'_doc/video/', index:1}); }); ``` Android Native 代码: ``` public class CameraPlugin extends CordovaPlugin { private CameraDevice cameraDevice; private MediaRecorder mediaRecorder; private String videoFilePath; @Override public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException { if ("startRecording".equals(action)) { startRecording(args.getString(0), callbackContext); return true; } else if ("getVideoPath".equals(action)) { getVideoPath(callbackContext); return true; } return false; } private void startRecording(String path, CallbackContext callbackContext) { try { mediaRecorder = new MediaRecorder(); mediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE); mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); mediaRecorder.setOutputFile(path); mediaRecorder.setVideoEncodingBitRate(10000000); mediaRecorder.setVideoFrameRate(30); mediaRecorder.setVideoSize(1280, 720); mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); mediaRecorder.prepare(); mediaRecorder.start(); videoFilePath = path; callbackContext.success(); } catch (Exception e) { callbackContext.error(e.getMessage()); } } private void getVideoPath(CallbackContext callbackContext) { callbackContext.success(videoFilePath); } // ... } ``` 需要注意的是,在 Android 6.0 及以上版本的系统中,需要动态请求摄像头和存储权限。同时,在录制视频时,需要使用新版的 Camera2 API 替换旧版的 Camera API。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值