1. Android APP跳转到另一个APP
从当前APP去全新启动另外一个目标APP(非覆盖同一个进程)
1.1. 启动另外一个目标APP(非覆盖原来APP的方式)
(1)当前APP加入获取权限声明:(不加入权限检查,没法启动目标app)。
javascript
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"
tools:ignore="QueryAllPackagesPermission" />
<uses-permission android:name="android.permission.LAUNCH_APP" />
(2)执行跳转代码:
javascript
String packageName = "com.target.package"; // 目标应用的包名
PackageManager packageManager = getPackageManager();
Intent intent=new Intent();
intent =packageManager.getLaunchIntentForPackage(packageName);
if(intent==null){
Toast.makeText(MainActivity.this, "未安装", Toast.LENGTH_LONG).show();
}else{
startActivity(intent);
}
1.2. 从当前APP去跳转到另外一个目标APP的某个页面时:
(1)目标APP的对应Activity中加入action
javascript
<activity
android:name="com.xxx.package.TargetXXActivity"
android:exported="true">
<intent-filter>
<action android:name="jp" /> <!--标志-->
<category android:name="android.intent.category.DEFAULT" /> <!--这是一个普通页面-->
</intent-filter>
</activity>
(2)当前应用执行跳转到目标APP
javascript
Intent intent = new Intent("jp"); // 标志(要和目标APP的清单文件中的标志一样)
startActivity(intent);
** 注意: Intent跳转时捕获一下异常(略),防止目标对象不存在引起崩溃。**
1.3. App跳转跳到打开高德地图地图导航
高德:打开高德地图API>开发支持>点击开发文档(居然可以点击...)>高德地图手机版(在"其他"类下)>左侧路径规划
简单举例:
javascript
Uri uri = Uri.parse("amapuri://route/plan/?dlat="+"目的地lat"+"&dlon="+"目的地lng"+"&dname="+"目的地名称"+"&dev=0&t=0");
Activity.startActivity(new Intent(Intent.ACTION_VIEW, uri));
可以额外拼的参数:
1.4. App跳转跳到打开百度地图地图导航
javascript
Uri uri = Uri.parse("baidumap://map/direction?destination=latlng:"+"目的地lat"+","+ "目的地lng"+"|name:"+"目的地名称"+"&mode=driving");
Activity.startActivity(new Intent(Intent.ACTION_VIEW, uri));
可额外拼的参数:
1.5. App跳转跳到打开腾讯地图地图导航
javascript
//反向地址解析URI
private final String QQ_MAP_NAVI_URI = "qqmap://map/geocoder?coord=";
/**
* 跳转百度地图
*/
private void jumpBaiDuMap(Context context,String lat, String lon) {
Intent intent = new Intent();
intent.setData(Uri.parse(QQ_MAP_NAVI_URI + lat+","+lon+"&referer="+ appKey));
context.startActivity(intent);
}
1.6. app唤醒第三方地图App进行导航(高德,百度,腾讯)代码
1.6.1. 获取第三方应用包名
高德地图包名 com.autonavi.minimap
百度地图包名 com.baidu.BaiduMap
腾讯地图包名 com.tencent.map
1.6.2. 坐标系的种类
目前坐标系有三种,分别是WGS84、GCJ02、BD09,国内基本用的是后两种。
WGS84:国际坐标系,为一种大地坐标系,也是目前广泛使用的GPS全球卫星定位系统使用的坐标系。
GCJ02:火星坐标系,是由中国国家测绘局制订的地理信息系统的坐标系统。由WGS84坐标系经加密后的坐标系。高德、腾讯都是用的这种。
BD09:为百度坐标系,在GCJ02坐标系基础上再次加密。其中BD09ll表示百度经纬度坐标,BD09mc表示百度墨卡托米制坐标。百度地图sdk默认输出的是BD09ll,定位sdk默认输出的是GCJ02。
1.6.3. 坐标系转换
javascript
/**
* BD-09 坐标转换成 GCJ-02 坐标
*/
public static LatLng BD2GCJ(LatLng bd) {
double x = bd.longitude - 0.0065, y = bd.latitude - 0.006;
double z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * Math.PI);
double theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * Math.PI);
double lng = z * Math.cos(theta);//lng
double lat = z * Math.sin(theta);//lat
return new LatLng(lat, lng);
}
/**
* GCJ-02 坐标转换成 BD-09 坐标
*/
public static LatLng GCJ2BD(LatLng bd) {
double x = bd.longitude, y = bd.latitude;
double z = Math.sqrt(x * x + y * y) + 0.00002 * Math.sin(y * Math.PI);
double theta = Math.atan2(y, x) + 0.000003 * Math.cos(x * Math.PI);
double tempLon = z * Math.cos(theta) + 0.0065;
double tempLat = z * Math.sin(theta) + 0.006;
return new LatLng(tempLat, tempLon);
}
1.6.4. 检测是否安装第三方地图
在调用跳转第三方地图进行导航前需要检查手机是否安装有要跳转的第三方地图,检测方法如下,有安装返回true,否则返回false。
javascript
/**
* 检测程序是否安装
*
* @param packageName
* @return
*/
private boolean isInstalled(String packageName) {
PackageManager manager = mContext.getPackageManager();
//获取所有已安装程序的包信息
List<PackageInfo> installedPackages = manager.getInstalledPackages(0);
if (installedPackages != null) {
for (PackageInfo info : installedPackages) {
if (info.packageName.equals(packageName))
return true;
}
}
return false;
}
1.6.4 代码
调用第三方地图导航,要先搞清楚自己使用的是那种坐标系,如果坐标系不正确,位置导航会有偏差。百度和腾讯调起使用都比较简单,结合文档和网上示例很容易实现。
javascript
/**
* @param latitude
* @param longitude
* @param title
* @desc 导航
*/
private void goNavigation(double latitude, double longitude, String title) {
try {
final double tLat = latitude;
final double tLng = longitude;
final String tTitle = title;
List<MapBean> mapBeanList = new ArrayList<>();
//高德地图
final boolean isGaodeInstall = OpenAppUtil.checkPackInfo(this, "com.autonavi.minimap");
//百度地图
final boolean isBaiduInstall = OpenAppUtil.checkPackInfo(this, "com.baidu.BaiduMap");
//腾讯地图
final boolean isTencentInstall = OpenAppUtil.checkPackInfo(this, "com.tencent.map");
mapBeanList.add(new MapBean(isGaodeInstall));
mapBeanList.add(new MapBean(isBaiduInstall));
mapBeanList.add(new MapBean(isTencentInstall));
MapDialog mapDialog = new MapDialog(this, mapBeanList);
mapDialog.setOnGaodeClickListener(new MyCallback() {
@Override
public void exec(Object... params) {
if (isGaodeInstall) {
LocateInfo locateInfo = GCJ02_WGS84.gcj02_To_Wgs84(tLat, tLng);
Uri uri = Uri.parse("amapuri://route/plan/?dlat=" + locateInfo.getLatitude()
+ "&dlon=" + locateInfo.getLongitude()
+ "&dname=" + tTitle + "&dev=1&t=1");
// Uri uri = Uri.parse("amapuri://route/plan/?dlat=" + tLat + "&dlon="
// + tLng + "&dname=" + tTitle + "&dev=1&t=1");
startActivity(new Intent(Intent.ACTION_VIEW, uri));
} else {
ToastHelper.showShort(LocActivity.this,
"高德地图未下载,请去应用市场下载高德地图后使用");
}
}
});
mapDialog.setOnBaiduClickListener(new MyCallback() {
@Override
public void exec(Object... params) {
if (isBaiduInstall) {
double[] lngLat = MapUtil.gaoDeToBaidu(tLng, tLat);
Uri uri = Uri.parse("baidumap://map/direction?destination=latlng:"
+ lngLat[1] + "," + lngLat[0] + "|name:"
+ tTitle + "&mode=driving");
startActivity(new Intent(Intent.ACTION_VIEW, uri));
} else {
ToastHelper.showShort(LocActivity.this,
"百度地图未下载,请去应用市场下载百度地图后使用");
}
}
});
mapDialog.setOnTencentClickListener(new MyCallback() {
@Override
public void exec(Object... params) {
if (isTencentInstall) {
Intent intent = new Intent("android.intent.action.VIEW",
android.net.Uri.parse("qqmap://map/routeplan?type=drive&from=&fromcoord=&to="
+ tTitle + "&tocoord="
+ tLat + "," + tLng + "&policy=0&referer=appName"));
startActivity(intent);
} else {
ToastHelper.showShort(LocActivity.this,
"腾讯地图未下载,请去应用市场下载腾讯地图后使用");
}
}
});
mapDialog.show();
} catch (Exception e) {
}
}