Как открыть приложение из приложения Flutter?

Я разрабатываю приложение Flutter, в котором мне нужно показать навигацию для пользователя. Итак, как я могу открыть приложение карты из моего приложения Flutter, как мы используем внешние намерения в Android?

Или для них есть какой-то флаттер-плагин?

Ответы

Ответ 1

Я предлагаю вам использовать пакет url_launcher dart.

Таким образом, вы можете использовать все схемы URL для открытия (phone, sms и даже maps, как в вашем случае).

Чтобы открыть Google Карты в Android и iOS, вы можете использовать общую схему URI для Android Maps, как это предложил Хемант Радж.

_openMap() async {
    const url = 'https://www.google.com/maps/search/?api=1&query=52.32,4.917';
    if (await canLaunch(url)) {
      await launch(url);
    } else {
      throw 'Could not launch $url';
    }
  }

Если вы хотите предоставить Android выбор, вы можете использовать общую geo: схему URI.

Если вы хотите специально открыть iOS Maps API, вы можете использовать схему URI Cupertino Maps.

Если вы решите провести различие между Android и iOS (не используя схему Google Maps Api для всех платформ), вы должны сделать это также в вызове открытой карты следующим образом:

_openMap() async {
    // Android
    const url = 'geo:52.32,4.917';
    if (await canLaunch(url)) {
      await launch(url);
    } else {
      // iOS
      const url = 'http://maps.apple.com/?ll=52.32,4.917';
      if (await canLaunch(url)) {
        await launch(url);
      } else {
        throw 'Could not launch $url';
      }
    }
  }

Или вы можете проверить ОС во время выполнения с помощью библиотеки dart.io, библиотеки Platform:

import 'dart:io';

_openMap() async {
    // Android
    var url = 'geo:52.32,4.917';
    if (Platform.isIOS) {
      // iOS
      url = 'http://maps.apple.com/?ll=52.32,4.917';
    }
    if (await canLaunch(url)) {
      await launch(url);
    } else {
      throw 'Could not launch $url';
    }
  }

Теперь, когда я закончил работу со шлангом (реальный... не рефакторинг кода... ^^ '), я могу закончить свой ответ.

Как я уже говорил вам вначале с помощью url_launcher, вы можете использовать все схемы URI для вызова, отправки смс, отправки электронной почты и т.д.

Вот некоторый код для этого:

_sendMail() async {
    // Android and iOS
    const uri = 'mailto:[email protected]?subject=Greetings&body=Hello%20World';
    if (await canLaunch(uri)) {
      await launch(uri);
    } else {
    throw 'Could not launch $uri';
    }
  }

  _callMe() async {
    // Android
    const uri = 'tel:+1 222 060 888';
    if (await canLaunch(uri)) {
      await launch(uri);
    } else {
      // iOS
      const uri = 'tel:001-22-060-888';
      if (await canLaunch(uri)) {
        await launch(uri);
      } else {
        throw 'Could not launch $uri';
      }
    }
  }

  _textMe() async {
    // Android
    const uri = 'sms:+39 349 060 888';
    if (await canLaunch(uri)) {
      await launch(uri);
    } else {
      // iOS
      const uri = 'sms:0039-222-060-888';
      if (await canLaunch(uri)) {
        await launch(uri);
      } else {
        throw 'Could not launch $uri';
      }
    }
  }

Даже если схема URI должна быть стандартом (RFC), иногда их части authority и path могут различаться в разных платформах (Android или iOS).

Так что здесь я управляю различными ОС за исключением, но вы можете сделать это лучше с dart.io библиотекой Platform классом:

import 'dart:io'

а затем в коде:

if (Platform.isAndroid) {

} else if (Platform.isIOS) {

}

Я предлагаю вам всегда тестировать их в обеих средах.

Вы можете проверить документацию схемы Android и iOS здесь:

Если вы хотите что-то похожее на startActivity в Android (но это работает только для платформы Android), вы можете использовать пакет dart android_intent.

Ответ 2

Вы можете просто использовать плагин url_launcher для открытия карт. Он запускает карту, если она установлена или возвращается, чтобы открыть карту в браузере.

Пример:

import 'package:flutter/material.dart';
import 'package:url_launcher/url_launcher.dart';

void main() {
  runApp(new Scaffold(
    body: new Center(
      child: new RaisedButton(
        onPressed: _launchURL,
        child: new Text('Launch Maps'),
      ),
    ),
  ));
}

_launchMaps() async {
  const url = "https://www.google.com/maps/search/?api=1&query=LATITUDE,LONGITUDE,17&query_place_id=PLACE_ID";
  if (await canLaunch(url)) {
    await launch(url);
  } else {
    throw 'Could not launch Maps';
  }
}

Надеюсь, это поможет!

Ответ 3

Для использования iOS без использования браузера, непосредственно для приложений:

//waze 
canLaunch("waze://") 
launch("waze://?ll=${latitude},${longitude}&navigate=yes"); 
//gmaps 
canLaunch("comgooglemaps://") 
launch("comgooglemaps://?saddr=${latitude},${longitude}&directionsmode=driving")

Что вам нужно сделать, это добавить в Info.plist:

<key>LSApplicationQueriesSchemes</key>  
<array>         
  <string>comgooglemaps</string>        
  <string>waze</string>     
</array>