Android APP跳转到另一个APP

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) {
        }
    }
相关推荐
朴拙数科11 分钟前
mysql报错解决 `1525 - Incorrect DATETIME value: ‘0000-00-00 00:00:00‘`
android·数据库·mysql
1登峰造极2 小时前
scroll-view 实现滑动显示,确保超出正常显示,小程序app,h5兼容
android·小程序
刘争Stanley2 小时前
Android 15(V)新功能适配,雕琢移动细节之美
android·kotlin·android 15·android v
小狗爱世界2 小时前
深入解析Binder源码
android·binder
qq_214670352 小时前
android 聊天界面键盘、表情切换丝滑
android·gitee
韩家老大2 小时前
MTK Android12 隐藏顶部状态栏
android
JhonKI4 小时前
【MySQL】复合查询
android·数据库·mysql
Yawesh_best5 小时前
MySQL(9)【内置函数】
android·数据库·mysql
小小unicorn12 小时前
[MySQL基础](三)SQL--图形化界面+DML
android·sql·mysql
魑魅魍魉952714 小时前
android NumberPicker隐藏分割线或修改颜色
android