flutter如何调用安卓原生方法或系统能力

其实官网上很清楚,只要跟着操作几遍,其意自现:

https://flutter.cn/docs/platform-integration/platform-channels?tab=type-mappings-kotlin-tab#separate

以安卓示例总结步骤

  1. 在flutter页面中创建获取方法管道(管道名命名规则:域名倒序/管道名称)
  2. 创建方法结果的初始状态
  3. 封装异步方法用于获取不同类型的信息
  4. 创建具体执行的异步方法
  5. 这一步开始在安卓操作,实现原生方法或系统能力,先同样定义一个与步骤1方法名相同管道
  6. 配置Flutter引擎->创建一个方法通道并设置方法调用处理程序
  7. 功能实现(处理程序)

flutter页面示例代码

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

class Classify extends StatefulWidget {
  const Classify({super.key});

  
  State<Classify> createState() => _ClassifyState();
}

class _ClassifyState extends State<Classify> {

  // 创建获取通讯录方法管道
  static const platform = MethodChannel('samples.flutter.dev/contacts');

  // 创建通讯录初始状态
  String _contacts = '未获取通讯录.';
  // 创建网络状态初始状态
  String _networkStatus = '未获取网络状态.';
  // 创建短信初始状态
  String _sms = '未获取短信.';

  // 异步方法用于获取不同类型的信息
  Future<String> _fetchInformation(String method, String errorMessage) async {
    try {
      final result = await platform.invokeMethod(method);
      return '$errorMessage: $result .';
    } on PlatformException catch (e) {
      return "Failed to get $errorMessage: '${e.message}'.";
    }
  }

// 创建通讯录异步方法
  Future<void> _getContacts() async {
    String contacts = await _fetchInformation('getContacts', '通讯录');
    setState(() {
      _contacts = contacts;
    });
  }

// 创建网络状态异步方法
  Future<void> _getNetworkStatus() async {
    String networkStatus = await _fetchInformation('getNetworkStatus', '网络状态');
    setState(() {
      _networkStatus = networkStatus;
    });
  }

// 创建短信异步方法
  Future<void> _getSms() async {
    String sms = await _fetchInformation('getSms', '短信');
    setState(() {
      _sms = sms;
    });
  }
  
  
  Widget build(BuildContext context) {
     // listview展现通讯录,姓名+电话
    return Material(
      child: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.spaceEvenly,
          children: [
            ElevatedButton(
              onPressed: _getContacts,
              child: const Text('获取通讯录'),
            ),
            ElevatedButton(
              onPressed: _getNetworkStatus,
              child: const Text('获取网络状态'),
            ),
            ElevatedButton(
              onPressed: _getSms,
              child: const Text('获取短信'),
            ),
            Text(_contacts),
            Text(_networkStatus),
            Text(_sms),
          ],
        ),
      ),
    );
  }
}

安卓实现示例代码

package com.example.flutter02

import android.annotation.SuppressLint
import android.content.ContentResolver
import android.database.Cursor
import android.net.ConnectivityManager
import android.net.NetworkCapabilities
import android.os.Build
import android.provider.ContactsContract.CommonDataKinds.Phone
import android.provider.ContactsContract.Contacts
import androidx.annotation.NonNull
import androidx.annotation.RequiresApi
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.MethodChannel
import java.lang.Boolean


class Contacts: FlutterActivity() {
    // 定义一个方法通道名称
    private val CHANNEL = "samples.flutter.dev/contacts"

    //配置Flutter引擎
    @RequiresApi(Build.VERSION_CODES.M)
    override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)

        // 创建一个方法通道并设置方法调用处理程序
        MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler { call, result ->
            try {
                when (call.method) {
                    "getContacts" -> {
                        // 处理"getContacts"方法调用
                        val contacts = getContacts()
                        if (contacts != null) {
                            result.success(contacts)
                        } else {
                            result.error("ERROR", "Unable to get contacts.", null)
                        }
                    }
                    "getNetworkStatus" -> {
                        // 处理"getNetworkStatus"方法调用
                        val networkStatus = getNetworkStatus()
                        if (networkStatus != null) {
                            result.success(networkStatus)
                        } else {
                            result.error("ERROR", "Unable to get network status.", null)
                        }
                    }
                    "getSms" -> {
                        // 处理"getSms"方法调用
                        val sms = getSms()
                        if (sms != null) {
                            result.success(sms)
                        } else {
                            result.error("ERROR", "Unable to get sms.", null)
                        }
                    }
                    else -> {
                        // 如果调用的方法不是已实现的方法,返回未实现错误
                        result.notImplemented()
                    }
                }
            } catch (e: Exception) {
                // 处理异常情况,返回错误信息给Flutter
                result.error("ERROR", e.message, null)
            }
        }
    }


    // 获取手机通讯录联系人的示例方法
    @SuppressLint("Range")
    private fun getContacts(): List<Map<String, String>>? {
        val contactsList = mutableListOf<Map<String, String>>()

        // 获取ContentResolver以访问手机数据
        val contentResolver: ContentResolver = applicationContext.contentResolver

        // 查询手机通讯录的联系人
        val cursor: Cursor? = contentResolver.query(
            Contacts.CONTENT_URI, null, null, null, null
        )

        cursor?.use {
            while (it.moveToNext()) {
                val contactId = it.getString(it.getColumnIndex(Contacts._ID))
                val name = it.getString(it.getColumnIndex(Contacts.DISPLAY_NAME))

                // 查询联系人的电话号码
                val phoneCursor: Cursor? = contentResolver.query(
                    Phone.CONTENT_URI, null,
                    Phone.CONTACT_ID + " = ?", arrayOf(contactId), null
                )

                phoneCursor?.use { phone ->
                    while (phone.moveToNext()) {
                        val phoneNumber = phone.getString(phone.getColumnIndex(Phone.NUMBER))

                        // 将联系人信息存储在Map中
                        val contactInfo = mutableMapOf<String, String>()
                        contactInfo["name"] = name
                        contactInfo["phone"] = phoneNumber

                        // 将联系人信息添加到列表中
                        contactsList.add(contactInfo)
                    }
                }
                phoneCursor?.close()
            }
        }

        cursor?.close()

        // 返回包含联系人信息的列表
        return contactsList
    }

    @RequiresApi(Build.VERSION_CODES.M)
    private fun getNetworkStatus(): Map<String, String>? {
        // 获取ConnectivityManager以获取网络状态
        val connectivityManager = getSystemService(CONNECTIVITY_SERVICE) as ConnectivityManager

        // 获取当前活动的网络信息
        val activeNetwork = connectivityManager.activeNetwork

        // 如果网络信息不为空,返回网络状态
        if (activeNetwork != null) {
            val networkCapabilities = connectivityManager.getNetworkCapabilities(activeNetwork)
            val networkStatus: MutableMap<String, String> = HashMap()
            networkStatus["type"] =
                if (networkCapabilities!!.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) "WIFI" else "CELLULAR"
            networkStatus["isConnected"] =
                Boolean.toString(networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED))
            return networkStatus
        }

        // 如果网络信息为空,返回null
        return null
    }


    // 获取所有手机短信内容
    @SuppressLint("Range")
    private fun getSms(): List<Map<String, String>>? {
        val smsList = mutableListOf<Map<String, String>>()

        // 获取ContentResolver以访问手机数据
        val contentResolver: ContentResolver = applicationContext.contentResolver

        // 查询手机短信
        val cursor: Cursor? = contentResolver.query(
            android.provider.Telephony.Sms.CONTENT_URI, null, null, null, null
        )

        cursor?.use {
            while (it.moveToNext()) {
                val smsId = it.getString(it.getColumnIndex(android.provider.Telephony.Sms._ID))
                val smsAddress = it.getString(it.getColumnIndex(android.provider.Telephony.Sms.ADDRESS))
                val smsBody = it.getString(it.getColumnIndex(android.provider.Telephony.Sms.BODY))
                val smsDate = it.getString(it.getColumnIndex(android.provider.Telephony.Sms.DATE))

                // 将短信信息存储在Map中
                val smsInfo = mutableMapOf<String, String>()
                smsInfo["smsId"] = smsId
                smsInfo["smsAddress"] = smsAddress
                smsInfo["smsBody"] = smsBody
                smsInfo["smsDate"] = smsDate

                // 将短信信息添加到列表中
                smsList.add(smsInfo)
            }
        }

        cursor?.close()

        // 返回包含短信信息的列表
        return smsList
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要在 Flutter调用 Android 原生代码,可以通过使用 Flutter 的平台通道(Platform Channel)来进行交互。下面是一个简单的示例,演示了如何调用 Android 原生代码: 1. 在 Flutter 项目的 `lib` 目录下创建一个新的 Dart 文件(例如 `native.dart`),用于定义与原生代码交互的接口。 ```dart import 'package:flutter/services.dart'; class NativeCode { static const platform = MethodChannel('com.example.app/native'); static Future<void> callNativeMethod() async { try { await platform.invokeMethod('nativeMethod'); } catch (e) { print(e); } } } ``` 2. 在 Android 项目的 `android/app/src/main/java/com/example/app` 目录下创建一个新的 Java 类(例如 `NativeChannel.java`),用于处理 Flutter原生代码之间的通信。 ```java package com.example.app; import io.flutter.embedding.engine.FlutterEngine; import io.flutter.embedding.engine.plugins.FlutterPlugin; import io.flutter.plugin.common.MethodCall; import io.flutter.plugin.common.MethodChannel; import io.flutter.plugin.common.MethodChannel.MethodCallHandler; import io.flutter.plugin.common.MethodChannel.Result; public class NativeChannel implements FlutterPlugin, MethodCallHandler { private MethodChannel channel; @Override public void onAttachedToEngine(FlutterPluginBinding flutterPluginBinding) { channel = new MethodChannel(flutterPluginBinding.getBinaryMessenger(), "com.example.app/native"); channel.setMethodCallHandler(this); } @Override public void onMethodCall(MethodCall call, Result result) { if (call.method.equals("nativeMethod")) { // 在这里编写你的原生代码逻辑 // ... result.success(null); // 返回结果给 Flutter } else { result.notImplemented(); } } @Override public void onDetachedFromEngine(FlutterPluginBinding binding) { channel.setMethodCallHandler(null); channel = null; } } ``` 3. 在 `MainActivity.java` 中注册 NativeChannel 插件: ```java import io.flutter.embedding.android.FlutterActivity; import io.flutter.embedding.engine.FlutterEngine; public class MainActivity extends FlutterActivity { @Override public void configureFlutterEngine(FlutterEngine flutterEngine) { super.configureFlutterEngine(flutterEngine); flutterEngine.getPlugins().add(new NativeChannel()); } } ``` 4. 在 Flutter调用原生方法,例如在一个按钮的点击事件中: ```dart ElevatedButton( onPressed: () { NativeCode.callNativeMethod(); }, child: Text('调用原生方法'), ) ``` 通过以上步骤,你就可以在 Flutter调用 Android 原生代码了。你可以根据需要扩展这个示例,添加更多的方法和参数来实现更复杂的交互。记得在调用原生方法时,遵循正确的线程调度和错误处理方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WiFiMing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值