web-dev-qa-db-fra.com

Comment ouvrir une application à partir d'une application Flutter?

Je développe une application Flutter, dans laquelle je dois montrer la navigation à l'utilisateur pour un lieu. Alors, comment puis-je ouvrir une application de carte à partir de mon application Flutter comme nous le faisons en utilisant une intention externe dans Android?

Ou leur est-il un plugin flutter pour cela?

11
Ghanshyam Savaliya

Je vous suggère d'utiliser rl_launcher package Dart.

De cette façon, vous pouvez utiliser tous les schémas d'URL pour ouvrir (phone, sms et même maps comme dans votre cas).

Afin d'ouvrir Google Maps soit dans Android et iOS, vous pouvez utiliser le general Android Maps URI schema comme suggéré par Hemanth Raj .

_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';
    }
  }

Si vous voulez donner un choix sur Android vous pouvez utiliser le général geo: Schéma URI .

Si vous voulez ouvrir spécifiquement l'API iOS Maps, vous pouvez utiliser schéma URI de Cupertino Maps .

Si vous choisissez de faire la distinction entre Android et iOS (n'utilisez pas le schéma Google Maps Api pour toutes les plates-formes), vous devez le faire également dans votre appel de carte ouvert de la manière suivante:

_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';
      }
    }
  }

Ou vous pouvez vérifier le système d'exploitation au moment de l'exécution avec Dart.io bibliothèque Platform classe :

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';
    }
  }

Maintenant que j'ai terminé le nettoyage des tuyaux (le vrai ... pas une refonte du code ... ^^ '), je peux terminer ma réponse.

Comme je vous le dis au début avec url_launcher, vous pouvez utiliser tous les schémas URI pour appeler, envoyer des sms, envoyer des e-mails, etc.

Voici du code pour le faire:

_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';
      }
    }
  }

Même si URI le schéma doit être des normes (RFC), les parties authority et path peuvent parfois différer d'un framework à l'autre ( Android ou iOS).

Donc ici, je gère les différents systèmes d'exploitation à l'exception, mais vous pourriez mieux faire avec Dart.io bibliothèque Platform classe :

import 'Dart:io'

puis en code:

if (Platform.isAndroid) {

} else if (Platform.isIOS) {

}

Je vous suggère de toujours les tester dans les deux environnements.

Vous pouvez vérifier la documentation Android et schéma iOS ici:

Si vous voulez quelque chose de similaire à startActivity dans Android (mais cela ne fonctionne que pour Android), vous pouvez utiliser le package Dart Android_intent .

33
shadowsheep

Vous pouvez simplement utiliser le url_launcher plugin pour ouvrir les cartes. Il lance la carte s'il est installé ou retombe pour ouvrir la carte sur un navigateur.

Exemple:

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';
  }
}

J'espère que ça t'as aidé!

2
Hemanth Raj

Pour une utilisation iOS, aucun navigateur impliqué, directement vers les applications:

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

Ce que vous devez faire est d'ajouter à Info.plist:

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