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) {
        }
    }
相关推荐
阿巴斯甜8 小时前
Android 报错:Zip file '/Users/lyy/develop/repoAndroidLapp/l-app-android-ble/app/bu
android
Kapaseker8 小时前
实战 Compose 中的 IntrinsicSize
android·kotlin
xq95279 小时前
Andorid Google 登录接入文档
android
黄林晴11 小时前
告别 Modifier 地狱,Compose 样式系统要变天了
android·android jetpack
冬奇Lab1 天前
Android触摸事件分发、手势识别与输入优化实战
android·源码阅读
城东米粉儿1 天前
Android MediaPlayer 笔记
android
Jony_1 天前
Android 启动优化方案
android
阿巴斯甜1 天前
Android studio 报错:Cause: error=86, Bad CPU type in executable
android
张小潇1 天前
AOSP15 Input专题InputReader源码分析
android
_小马快跑_1 天前
Kotlin | 协程调度器选择:何时用CoroutineScope配置,何时用launch指定?
android