Flutter安卓意图调用插件android_intent_plus的使用

发布于 1周前 作者 yuanlaile 来自 Flutter

Flutter安卓意图调用插件android_intent_plus的使用

插件简介

android_intent_plus 是一个Flutter插件,它允许Flutter应用程序在Android平台上启动任意的意图(Intent)。该插件支持指定动作、类别、数据和额外参数来构建和启动意图。需要注意的是,这个插件只适用于Android平台,如果在iOS上调用将会导致应用崩溃。

平台支持

平台
Android ✅

要求

  • Flutter >=3.12.0
  • Dart >=3.1.0 <4.0.0
  • Android compileSDK 34
  • Java 17
  • Android Gradle Plugin >=8.3.0
  • Gradle wrapper >=8.4

使用方法

以下是android_intent_plus的基本使用方法:

import 'package:android_intent_plus/android_intent.dart';
import 'package:platform/platform.dart';

if (Platform.isAndroid) {
  final intent = AndroidIntent(
    action: 'action_view', // 意图的动作类型
    data: Uri.encodeFull('https://flutter.dev'), // 意图的数据部分
    arguments: {'authAccount': 'user@example.com'}, // 额外参数
  );
  await intent.launch(); // 启动意图
}

对于某些特定的动作,例如打开应用设置或位置服务设置,可以使用预定义的动作字符串:

if (Platform.isAndroid) {
  final intent = AndroidIntent(
    action: 'action_application_details_settings',
    data: 'package:com.example.app', // 替换为你的应用包名
  );
  await intent.launch();
}

查询活动

你可以使用canResolveActivity()getResolvedActivity()来检查是否有活动能够处理特定的意图,或者获取能够处理该意图的活动详情:

final intent = AndroidIntent(
  action: 'action_view',
  data: Uri.encodeFull('http://'),
);

// 检查是否有活动能处理此意图
final canHandleIntent = await intent.canResolveActivity();

// 获取将要处理此意图的活动详情
final details = await intent.getResolvedActivity();
print(details.packageName); // 打印出处理该意图的应用程序包名,如com.google.chrome

Android 11 包可见性

从Android 11开始引入了新的权限机制以控制包的可见性。如果你打算使用canResolveActivity()方法,你需要在AndroidManifest.xml中声明需要查询的具体包名:

<queries>
  <package android:name="com.example.specificapp" />
</queries>

更多关于包可见性的信息,请参阅官方文档

完整示例Demo

下面是一个完整的Flutter项目示例,展示了如何使用android_intent_plus来创建各种类型的意图并启动它们:

import 'package:android_intent_plus/android_intent.dart';
import 'package:flutter/material.dart';
import 'package:platform/platform.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        useMaterial3: true,
        colorSchemeSeed: Color(0x9f4376f8),
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  void _createAlarm() {
    const intent = AndroidIntent(
      action: 'android.intent.action.SET_ALARM',
      arguments: <String, dynamic>{
        'android.intent.extra.alarm.DAYS': [2, 3, 4, 5, 6],
        'android.intent.extra.alarm.HOUR': 21,
        'android.intent.extra.alarm.MINUTES': 30,
        'android.intent.extra.alarm.SKIP_UI': true,
        'android.intent.extra.alarm.MESSAGE': 'Create a Flutter app',
      },
    );
    intent.launch();
  }

  @override
  Widget build(BuildContext context) {
    Widget body;
    if (const LocalPlatform().isAndroid) {
      body = Padding(
        padding: EdgeInsets.symmetric(vertical: 15.0),
        child: Column(
          mainAxisAlignment: MainAxisAlignment.spaceEvenly,
          children: [
            ElevatedButton(
              onPressed: _createAlarm,
              child: Text('Tap here to set an alarm\non weekdays at 9:30pm.'),
            ),
            // ... 其他按钮 ...
          ],
        ),
      );
    } else {
      body = Text('This plugin only works with Android');
    }
    return Scaffold(
      appBar: AppBar(
        title: Text('Android intent plus example app'),
        elevation: 4,
      ),
      body: Center(child: body),
    );
  }
}

以上代码片段提供了一个简单的界面,其中包含一个按钮用于设置闹钟。你可以根据需求扩展这个例子,添加更多的按钮来测试其他类型的意图。


更多关于Flutter安卓意图调用插件android_intent_plus的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter安卓意图调用插件android_intent_plus的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter中使用android_intent_plus插件来调用安卓意图(Intent)的代码示例。这个插件允许你从Flutter应用中启动安卓原生的活动(Activity)或服务(Service)。

首先,你需要在你的Flutter项目中添加android_intent_plus依赖。打开你的pubspec.yaml文件,并添加以下依赖:

dependencies:
  flutter:
    sdk: flutter
  android_intent_plus: ^3.0.0  # 请检查最新版本号

然后运行flutter pub get来安装依赖。

接下来,你可以在你的Flutter代码中使用AndroidIntent来创建和启动意图。以下是一个简单的示例,演示如何打开一个网页和一个拨号界面:

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

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Android Intent Plus Example'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              ElevatedButton(
                onPressed: () => _openWebpage(),
                child: Text('Open Webpage'),
              ),
              SizedBox(height: 20),
              ElevatedButton(
                onPressed: () => _makePhoneCall(),
                child: Text('Make Phone Call'),
              ),
            ],
          ),
        ),
      ),
    );
  }

  void _openWebpage() async {
    try {
      final AndroidIntent intent = AndroidIntent(
        action: Action.VIEW,
        data: Uri.parse('https://www.example.com'),
      );
      await intent.launch();
    } catch (e) {
      print("Failed to open webpage: $e");
    }
  }

  void _makePhoneCall() async {
    try {
      final AndroidIntent intent = AndroidIntent(
        action: Action.CALL,
        data: Uri.parse('tel:+1234567890'),
      );
      await intent.launch();
    } catch (e) {
      print("Failed to make phone call: $e");
    }
  }
}

在这个示例中,我们创建了两个按钮,一个用于打开网页,另一个用于拨打电话。

  1. 打开网页

    • 使用Action.VIEW意图。
    • 将数据设置为要打开的URL(https://www.example.com)。
  2. 拨打电话

    • 使用Action.CALL意图。
    • 将数据设置为要拨打的电话号码(tel:+1234567890)。

请注意,拨打电话功能可能需要用户在设备上授予相应的权限,并且在实际应用中可能需要处理权限请求的逻辑。

确保在你的AndroidManifest.xml文件中添加必要的权限(例如拨打电话的权限):

<uses-permission android:name="android.permission.CALL_PHONE"/>

此外,由于Android 6.0(API级别23)及以上版本引入了运行时权限模型,你可能需要在运行时请求这些权限。Flutter有第三方插件如permission_handler可以帮助你处理运行时权限请求。

这个示例应该能帮助你入门如何在Flutter中使用android_intent_plus插件来调用安卓意图。如果你有更具体的需求或问题,可以进一步扩展这个基础示例。

回到顶部