flutter与原生Android通信方式之MethodChannel

闲来无事,flutter好久没看了,上次折腾flutter与Android通信没折腾完,有些事情耽搁了,这次继续

演示效果:

flutter与Android原生通信

flutter端

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
class LikePages extends StatefulWidget {const LikePages({super.key});@overrideState<LikePages> createState() => _LikePagesState();
}class _LikePagesState extends State<LikePages> {final MethodChannel _channel = MethodChannel('abc');
// Flutter 调用 Android 方法Future<void> callNativeMethod() async {try {final String result = await _channel.invokeMethod('getPlatformVersion');print('Result from Android: $result');} catch (e) {print('Error calling native method: $e');}}Future<void> callNativeOpenCameraMethod() async {try {final String result = await _channel.invokeMethod('openCamera');print('Result from Android: $result');} catch (e) {print('Error calling native method: $e');}}@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text('like'),),body: Column(children: [Center(child: GestureDetector(child: Text('like'),onTap: (){// 调用 Flutter 调用 Android 方法callNativeMethod();},),),Padding(padding: const EdgeInsets.all(80.0),child: Center(child: GestureDetector(child: Text('openCamare'),onTap: (){// 调用 Flutter 调用 Android 方法callNativeOpenCameraMethod();},),),),],),);}
}
Android端
package com.example.f4import android.content.Context
import android.content.ContextWrapper
import android.content.Intent
import android.graphics.Bitmap
import android.net.Uri
import android.os.Build.VERSION
import android.os.Bundle
import android.provider.MediaStore
import android.util.Log
import android.widget.Toast
import androidx.annotation.NonNull
import androidx.annotation.Nullable
import com.hjq.permissions.OnPermissionCallback
import com.hjq.permissions.Permission
import com.hjq.permissions.XXPermissions
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.MethodChannel
import java.io.File
import java.io.FileOutputStream
import java.io.IOException
import java.util.*class MainActivity: FlutterActivity() {private val CHANNEL = "abc"private val REQUEST_IMAGE_CAPTURE = 1private val PERMISSION_REQUEST_CODE = 200var resultOut:MethodChannel.Result?=nulloverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)XXPermissions.with(this) // 申请单个权限.permission(Permission.CAMERA) // 申请多个权限.permission(Permission.Group.CALENDAR) // 设置权限请求拦截器(局部设置)//.interceptor(new PermissionInterceptor())// 设置不触发错误检测机制(局部设置)//.unchecked().request(object : OnPermissionCallback {override fun onGranted(permissions: List<String>, allGranted: Boolean) {if (!allGranted) {
//                        Toast(this@MainActivity,"获取部分权限成功,但部分权限未正常授予",Toast.LENGTH_SHORT).show()return}
//                    toast("获取录音和日历权限成功")}override fun onDenied(permissions: List<String>, doNotAskAgain: Boolean) {if (doNotAskAgain) {
//                        toast("被永久拒绝授权,请手动授予录音和日历权限")// 如果是被永久拒绝就跳转到应用权限系统设置页面XXPermissions.startPermissionActivity(context, permissions)} else {
//                        toast("获取录音和日历权限失败")}}})}override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {super.configureFlutterEngine(flutterEngine)// 创建 MethodChannelMethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler { call, result ->// 处理 Flutter 调用 Android 方法if (call.method == "getPlatformVersion") {result.success("Android ${VERSION.RELEASE}")}else if (call.method=="openCamera"){Log.e("TAG","call.method:="+call.method);resultOut = resultdispatchTakePictureIntent()} else {result.notImplemented()}}}// 获取真实路径的函数private fun getRealPathFromUri(uri: Uri): String? {val projection = arrayOf(MediaStore.Images.Media.DATA)val cursor = contentResolver.query(uri, projection, null, null, null)return cursor?.use {val columnIndex = it.getColumnIndexOrThrow(MediaStore.Images.Media.DATA)it.moveToFirst()it.getString(columnIndex)}}fun saveBitmapToFile(context: Context, bitmap: Bitmap): String {val cw = ContextWrapper(context)val directory: File = cw.getDir("images", Context.MODE_PRIVATE)// 为文件生成唯一的名称val imageName = "img_${UUID.randomUUID()}.jpg"// 创建文件对象val file = File(directory, imageName)var fos: FileOutputStream? = nulltry {fos = FileOutputStream(file)bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos) // 将 Bitmap 压缩为 JPEG 格式} catch (e: IOException) {e.printStackTrace()} finally {try {fos?.close()} catch (e: IOException) {e.printStackTrace()}}// 返回文件的路径return file.absolutePath}override fun onActivityResult(requestCode: Int, resultCode: Int,data: Intent) {super.onActivityResult(requestCode, resultCode, data)Log.e("TAG","==-->${data.extras}"+"  resultCode:=$resultCode "+" requestCode:$requestCode ")if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {// 图片从相机返回val extras = data.extrasif (extras != null) {// 获取拍摄的照片val imageBitmap = extras.get("data") as Bitmap?// 保存 Bitmap 到文件并获取文件路径val imagePath = imageBitmap?.let { saveBitmapToFile(applicationContext, it) }// 在这里使用文件路径resultOut?.success(imagePath)}} else {Toast.makeText(this, "Failed to capture image", Toast.LENGTH_SHORT).show()}}private fun dispatchTakePictureIntent() {val takePictureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)if (takePictureIntent.resolveActivity(packageManager) != null) {startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE)}}
}

上述代码演示了直接获取Android版本号,以及调用Android原生拍照并发挥图片路径到Flutter的方式,至于为什么会想要搞搞这个,原因还是在与Flutter插件的稳定性问题,假如要实现一个功能,但是受限于Flutter插件自身的问题,就只能自己来实现了,这时候通过原生代码返回需要的数据就不失为一种解决方案,

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/166970.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ThreeJs实现简单的动画

上一节实现可用鼠标控制相机的方式实现动态效果&#xff0c;但很多时候是需要场景自己产恒动态效果&#xff0c;而不是通过鼠标拖动&#xff0c;此时引入一个requestAnimationFrame方法&#xff0c;它实际上是通过定时任务的方式&#xff0c;每隔一点时间改变场景中内容后重新渲…

笔记:如何搭建一套前端监控系统?(持续更新中)

数据敏感处理 数据加密&#xff0c;对涉及用户隐私的数据做到加密防护 独立部署&#xff0c;不和其它应用共享监控系统 不采集具体数据&#xff0c;只采集用户操作数据 错误采集 Runtime Error: JS运行错误&#xff0c;可通过error监听器捕获 load Error: 资源加载错误&#x…

Ant Design Vue 树形表格计算盈收金额

树形表格计算 一、盈收金额计算1、根据需要输入的子级位置&#xff0c;修改数据2、获取兄弟节点数据&#xff0c;并计算兄弟节点的金额合计3、金额合计&#xff0c;遍历给所有的父级 一、盈收金额计算 1、根据需要输入的子级位置&#xff0c;修改数据 2、获取兄弟节点数据&am…

销售管理系统的实用性怎么样?

销售管理系统好用吗&#xff1f;好用&#xff0c;销售管理系统可以管理销售流程、自动化大量重复性工作&#xff0c;让销售人员从琐碎的任务中挣脱出来&#xff0c;投入到客户跟进和维护客户关系之中。那么&#xff0c;CRM系统的好用体现在哪些方面&#xff1f; 1.加速销售流程…

react中的state

没想到hooks中也有state这一说法 看下面的两个案例 1、无state变化不会执行父子函数 2、有state更改执行父子函数

CDN加速在网站搭建中的必要性与优势分析

随着互联网的快速发展&#xff0c;网站已经成为企业展示和用户交互的主要平台。在构建一个高性能、用户体验良好的网站时&#xff0c;CDN&#xff08;内容分发网络&#xff09;的应用变得愈发重要。本文将从网站搭建的角度出发&#xff0c;深入分析CDN加速的必要性以及在提升网…

深度学习之六(自编码器--Autoencoder)

概念 自编码器(Autoencoder)是一种神经网络架构,用于无监督学习和数据的降维表示。它由两部分组成:编码器(Encoder)和解码器(Decoder)。 结构: 编码器(Encoder): 接收输入数据并将其压缩为潜在表示(latent representation),通常比输入数据的维度要低。编码器的…

最详细的软件测试面试题整理与分析

前言 时光荏苒&#xff0c;一转眼到了2023年末尾&#xff0c;2024年也快要来了&#xff0c;人员就业市场以往的寒冬也貌似有了转暖的迹象&#xff0c;身边大批的就业人员也开始了紧张的备战之中。 近几周也和多家合作公司的HR进行了沟通&#xff0c;发现虽然岗位就业情况较去年…

vue3中引入svg矢量图

vue3中引入svg矢量图 1、前言2、安装SVG依赖插件3、在vite.config.ts 中配置插件4、main.ts入口文件导入5、使用svg5.1 在src/assets/icons文件夹下引入svg矢量图5.2 在src/components目录下创建一个SvgIcon组件5.3 封装成全局组件&#xff0c;在src文件夹下创建plugin/index.t…

SQLserver 数据库导入MySQL的方法

原文&#xff1a; https://blog.csdn.net/lht631935612/article/details/132086172#httpspanbaiducoms1TlLiRI9stxqTcwBJ5p6UAE993BEE68EA5EFBC9Ahttpspanbaiducoms1TlLiRI9stxqTcwBJ5p6UA2020E68F90E58F96E7A081EFBC9Av6d5_font_colordd0000v6d5font_8 下载链接&#xff1a;…

使用openfeign调用下载流的文件不完整的替代方案

OpenFeign是一种声明式的Web服务客户端&#xff0c;它使得编写HTTP客户端变得更加简单和直观。它使用了注解方式来描述HTTP API&#xff0c;使得开发者可以使用Java接口来调用远程HTTP服务。 OpenFeign的核心特点包括&#xff1a; 声明式API: 您可以使用注解声明要调用的远程AP…

一键创新 | 拓世法宝AI智能直播一体机激发房产自媒体创造力

在数字化时代&#xff0c;房产销售已然不再是传统的模式。随着社交媒体和自媒体的兴起&#xff0c;短视频直播成为房产自媒体营销的新风口。然而&#xff0c;行业也面临着诸多挑战&#xff0c;如何更好地利用新媒体拓展市场&#xff0c;提升自媒体效果成为摆在业内人士面前的难…

JMeter测试报错422 Unprocessable Entity

添加HTTP信息头&#xff1a; ​ HTTP请求-》添加-〉配置元件-》HTTP信息头管理器 ​ 如果需要送json&#xff0c;需要添加Content-Type:application/json&#xff0c;否则会报【422 Unprocessable Entity】

好用的CRM系统到底有多重要?怎么选?

我们都知道&#xff0c;CRM软件可以让企业效率加倍。但如果选错了CRM&#xff0c;企业损失点钱是小&#xff0c;客户转化率下降才是大。下面我们就来说说&#xff0c;市面上有哪些好用的CRM&#xff1f;以及好用的CRM软件的重要性。 好用的CRM软件的重要性&#xff1a; 客户管…

Qt 软件调试(一) Log日志调试

终于这段时间闲下来了&#xff0c;可以系统的编写Qt软件调试的整个系列。前面零零星星的也有部分输出&#xff0c;但终究没有形成体系。借此机会&#xff0c;做一下系统的总结。慎独、精进~ 日志是有效帮助我们快速定位&#xff0c;找到程序异常点的实用方法。但是好的日志才能…

百度 文心一言 sdk 试用

JMaven Central: com.baidu.aip:java-sdk (sonatype.com) Java sdk地址如上&#xff1a; 文心一言开发者 文心一言 (baidu.com) ERNIE Bot SDK https://yiyan.baidu.com/developer/doc#Fllzznonw ERNIE Bot SDK提供便捷易用的接口&#xff0c;可以调用文心一言的能力&#…

口袋参谋:如何避免宝贝被降权?这招屡试屡爽!

​至少99.99999%的店铺在今年都被降权过&#xff01;各家店铺被降权的原因&#xff0c;无非就一个原因&#xff0c;那就是s单&#xff01; s单的风险也就两种&#xff0c;一是操作问题&#xff0c;二是账号问题。 操作问题被降权&#xff0c;这个大家都心知肚明&#xff0c;s…

5大原因,设备校准为什么是实验室搬迁后的首要任务?

实验室搬迁是一个复杂而紧张的过程。要考虑的事情太多&#xff0c;很容易忽视您最重要的任务之一——检查设备在新环境中的性能。 校准对于确保设备安全运行和遵守监管标准至关重要。 1.保持合规性并遵守法律要求 生物技术和制药等行业有特定的校准要求&#xff0c;实验室必…

Java详解之I/O[BIO、NIO、AIO使用方法和示范代码]

前言&#xff1a; 小弟能力不足&#xff0c;认知有限&#xff0c;难免考虑不全面&#xff0c;希望大佬能给出更好的建议&#xff0c;指出存在的问题和不足&#xff0c;在此跪谢。 IO发展史 Java中对于I/O能力的支持主要分为三个比较关键的阶段&#xff1a; BIO 第一个阶段…

浅谈安科瑞直流电表在印尼某基站的应用

摘要&#xff1a;本文介绍了安科瑞直流电表在印尼的应用。主要用于印尼某基站的电流电压电能的计量&#xff0c;配合霍尔传感器对基站进行计量。 Abstract: This article introduces the application of Acrel DC meters in base station in Indonesia.The device is measuri…