flutter简单的MethodChannel通道Demo(引入调用小红书sdk)

flutter端创建MethodChannel类

import 'package:flutter/services.dart';//MethodChannel
const methodChannel = const MethodChannel('com.flutter.demo.MethodChannel');class FlutterMethodChannel {/** MethodChannel flutter给原生发信息* 在方法通道上调用方法invokeMethod* methodName 方法名称* params 发送给原生的参数* res 原生发给Flutter的参数*/static Future<Map> invokeNativeMethod(String methodName,[Map params]) async {var res;try {if (params == null) {res = await methodChannel.invokeMethod('$methodName');} else {res = await methodChannel.invokeMethod('$methodName', params);}} catch (e) {res = {'Failed': e.toString()};}return res;}/** MethodChannel* 接收methodHandler 接收原生给flutter发送的信息*/static void methodHandlerListener(Future<dynamic> Function(MethodCall call) handler) {methodChannel.setMethodCallHandler(handler);}
}

android端

import android.annotation.SuppressLint
import android.app.Activity
import android.util.Log
import androidx.annotation.Nullable
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import com.xingin.xhssharesdk.XhsShareSdkTools
import com.xingin.xhssharesdk.callback.XhsShareCallback
import com.xingin.xhssharesdk.callback.XhsShareRegisterCallback
import com.xingin.xhssharesdk.core.XhsShareSdk
import com.xingin.xhssharesdk.model.config.XhsShareGlobalConfig
import com.xingin.xhssharesdk.model.sharedata.*
import io.flutter.plugin.common.BinaryMessenger
import io.flutter.plugin.common.MethodCall
import io.flutter.plugin.common.MethodChannel
import io.flutter.plugin.common.MethodChannel.MethodCallHandler
import java.lang.reflect.Type
import java.util.*
import java.util.ArrayList
import java.util.Objects
import kotlin.concurrent.timerTaskclass MethodChannelDemo(messenger: BinaryMessenger, var activity : Activity) : MethodCallHandler {private var channel: MethodChannelprivate var count = 0init {channel = MethodChannel(messenger,"com.flutter.demo.MethodChannel") //通道标识两端要保持一致channel.setMethodCallHandler(this)/*channel.setMethodCallHandler{call, result ->if (call.method == "sendData"){}}*/}///Flutter端调用invokeMethod方法的回调override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) {if (call.method == "sendData") {var articleTitle = call.argument("title") as String?var articleContent = call.argument("articleContent") as String?val articlePicJsonArray = call.argument("articlePic") as String?val articleType = call.argument("articleType") as Int?// val jsonArray = call.argument("articlePic") as ArrayList<Object>?//   val jsonArray = call.argument("articlePic") as List<Any>?//   val jsonArray = call.argument("articlePic") as List<Map<String, Any>>?Log.i("onMethodCall","title= $articleTitle  ")Log.i("onMethodCall","articleContent= $articleContent  ")Log.i("onMethodCall","articleType= $articleType  ")Log.i("onMethodCall","articlePic= $articlePicJsonArray  ")val gson = Gson()/* val listType: Type = object : TypeToken<List<ArticlePic>>() {}.typeval articlePicList : List<ArticlePic?> = gson.fromJson(articlePicJsonArray, listType)Log.i("onMethodCall","articlePicList type = ${articlePicList[0]?.type}  ")Log.i("onMethodCall","articlePicList url = ${articlePicList[0]?.url}  ")*/val listType: Type = object : TypeToken<List<String>>() {}.typeval articlePicList : List<String?> = gson.fromJson(articlePicJsonArray, listType)Log.i("onMethodCall","articlePicList = ${articlePicList.size}  ")var map = mapOf("title" to "$articleTitle", "articleContent" to "$articleContent", "articlePic" to "$articlePicList")initXhsSDK(articleTitle,articleContent,articlePicList,articleType)result.success(map)}}///Native 端主动发送数据给 Flutter时,Native 端代码需要在主线程中执行fun invokeNativeMethod(methodName : String,params : Map<String,*>){activity.runOnUiThread {channel.invokeMethod(methodName, params)}//销毁}fun startTimer() {var timer = Timer().schedule(timerTask {activity.runOnUiThread {var map = mapOf("count" to count++)channel.invokeMethod("methodToFlutter", map)}}, 0, 1000)}//小红书分享sdkprivate fun initXhsSDK(articleTitle : String?, articleContent: String?, articlePicList : List<String?>, articleType : Int?){Log.i("init","sendData init xhs")XhsShareSdk.registerApp(activity.applicationContext, "小红书appkey",XhsShareGlobalConfig().setEnableLog(true).setClearCacheWhenShareComplete(true),object : XhsShareRegisterCallback {override fun onSuccess() {Log.i("xhs","注册成功")// print( "onSuccess: 注册成功!")}override fun onError(errorCode: Int,errorMessage: String,@Nullable exception: Exception?) {Log.i("xhs","注册失败!errorCode: $errorCode errorMessage: $errorMessage exception: $exception")//print( "onError: 注册失败!errorCode: $errorCode errorMessage: $errorMessage exception: $exception")}})var imageUrlList : MutableList<XhsImageResourceBean?> = ArrayList()if(articleType == 1){articlePicList.forEach{ element ->imageUrlList.add(XhsImageResourceBean.fromUrl(element))}}var isInstalled = XhsShareSdkTools.isXhsInstalled(activity.applicationContext)if(isInstalled){var note : XhsNote? = XhsNote()activity.runOnUiThread {if(articleType == 1){note = XhsNote().apply {title = "$articleTitle"content = "$articleContent"/*   imageInfo = XhsImageInfo(listOf(//    XhsImageResourceBean.fromUrl("https://zmkx.oss-cn-hangzhou.aliyuncs.com/oss/client/user/1684727167914-6443e07877e247e8a360fa293c8bc0e4..png")//   XhsImageResourceBean.fromUrl("/sdcard/Picture/1621565875992.jpg")))*/imageInfo = XhsImageInfo(imageUrlList)}}else if(articleType == 2){note = XhsNote().apply {title = "$articleTitle"content = "$articleContent"videoInfo = XhsVideoInfo(XhsVideoResourceBean.fromUrl(articlePicList[0]),     // 视频XhsImageResourceBean.fromUrl(articlePicList[1])      // 封面)}}else {note = XhsNote().apply {title = "$articleTitle"content = "$articleContent"}}val sessionId = XhsShareSdk.shareNote(activity.applicationContext, note)XhsShareSdk.setShareCallback(object : XhsShareCallback {override fun onSuccess(p0: String?) {TODO("Not yet implemented")Log.i("xhs", "onSuccess: 分享成功!!! $p0")var map = mapOf("shareCallback" to true)channel.invokeMethod("xhsShareCallback", map)XhsShareSdk.setShareCallback(null)}override fun onError(p0: String, p1: Int, p2: String, p3: Throwable?) {TODO("Not yet implemented")Log.i("xhs", "onSuccess: 分享失败!!!")var map = mapOf("shareCallback" to true)channel.invokeMethod("xhsShareCallback", map)XhsShareSdk.setShareCallback(null)}})}}}
}

在MainActivity.kt中配置通道

package cn.adazon.atuiimport android.os.Build
import android.os.Bundle
import androidx.annotation.NonNull
/*import com.huawei.agconnect.common.network.AccessNetworkManager
import com.huawei.hms.analytics.HiAnalytics
import com.huawei.hms.analytics.HiAnalyticsTools*/
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugins.GeneratedPluginRegistrantclass MainActivity : FlutterActivity() {override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {GeneratedPluginRegistrant.registerWith(flutterEngine)MethodChannelDemo(flutterEngine.dartExecutor.binaryMessenger,activity)}/*** 设置状态栏沉浸式透明(修改flutter状态栏黑色半透明为全透明)*/override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.LOLLIPOP){window.statusBarColor=0}}
}

小红书sdk配置

  1. 从小红书分享开放平台下载sdk
  2. 将.arr包复制到libs文件夹下
    在这里插入图片描述
  3. 引入.arr包
    在android>app目录下的build.gradle中配置 implementation fileTree(dir: 'libs', includes: ['*.aar'])
    在这里插入图片描述
    另一种引入方式
    在android目录下的build.gradle中配置flatDir { dir 'libs' }
    在这里插入图片描述
    android>app>build.gradle中配置implementation(name:'xhssharesdk-1.1.6', ext:'aar')
    在这里插入图片描述

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

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

相关文章

用冒泡排序模拟C语言中的内置快排函数qsort!

目录 ​编辑 1.回调函数的介绍 2. 回调函数实现转移表 3. 冒泡排序的实现 4. qsort的介绍和使用 5. qsort的模拟实现 6. 完结散花 悟已往之不谏&#xff0c;知来者犹可追 创作不易&#xff0c;宝子们&#xff01;如果这篇文章对你们有帮助的话&#xff0c;别忘了给个免…

《TCP/IP详解 卷一》第9章 广播和组播

目录 9.1 引言 9.2 广播 9.2.1 使用广播地址 9.2.2 发送广播数据报 9.3 组播 9.3.1 将组播IP地址转换为组播MAC地址 9.3.2 例子 9.3.3 发送组播数据报 9.3.4 接收组播数据报 9.3.5 主机地址过滤 9.4 IGMP协议和MLD协议 9.4.1 组成员的IGMP和MLD处理 9.4.2 组播路由…

继电器测试中需要注意的安全事项有哪些?

继电器广泛应用于电气控制系统中的开关元件&#xff0c;其主要功能是在输入信号的控制下实现输出电路的断开或闭合。在继电器测试过程中&#xff0c;为了确保测试的准确性和安全性&#xff0c;需要遵循一定的安全事项。以下是在进行继电器测试时需要注意的安全事项&#xff1a;…

汽车大灯尾灯划痕裂缝破洞破损掉角崩角等如何修复?根本没必要换车灯换总成,使用无痕修UV树脂胶液即可轻松搞定。

TADHE车灯无痕修复专用UV胶是一种经过处理的UV树脂胶&#xff0c;主要成份是改性丙烯酸UV树脂。应用在车灯的专业无痕修复领域。 车灯修复UV树脂有以下优点&#xff1a; 1. 快速修复&#xff1a;此UV树脂是一种用UV光照射在10秒内固化的材料。 2. 高强度&#xff1a;UV树脂固…

LabVIEW流量控制系统

LabVIEW流量控制系统 为响应水下航行体操纵舵翼环量控制技术的试验研究需求&#xff0c;通过LabVIEW开发了一套小量程流量控制系统。该系统能够满足特定流量控制范围及精度要求&#xff0c;展现了其在实验研究中的经济性、可靠性和实用性&#xff0c;具有良好的推广价值。 项…

抖音视频批量下载软件|视频评论采集工具

抖音视频评论采集软件是一款基于C#开发的高效、便捷的工具&#xff0c;旨在为用户提供全面的数据采集和分析服务。用户可以通过关键词搜索抓取视频数据&#xff0c;也可以通过分享链接进行单个视频的抓取和下载&#xff0c;从而轻松获取抖音视频评论数据。 批量视频提取模块&a…

数学建模函数插值与拟合

1.脑图 2.介绍 我们自己找到的函数&#xff0c;在已知点处的函数值和要求的函数在这些点处的函数值相等&#xff0c;这个函数 就叫做未知函数的插值函数&#xff1b; 多项式函数构成的插值函数的集合叫做函数类&#xff1b; 3.拉格朗日插值法 基函数的求法和插值函数的构造…

Java SPI机制详解

Java SPI机制详解 1. 定义接口2. 实现接口4. 创建配置文件5. 加载实现类6.Java SPI机制在MySQL中的使用 总结 SPI 全称为 (Service Provider Interface) &#xff0c;是JDK内置的一种服务提供发现机制。SPI是一种动态替换发现的机制&#xff0c; 当我们有个接口&#xff0c;想在…

性别和年龄的视频实时监测项目

注意&#xff1a;本文引用自专业人工智能社区Venus AI 更多AI知识请参考原站 &#xff08;[www.aideeplearning.cn]&#xff09; 性别和年龄检测 Python 项目 首先介绍性别和年龄检测的高级Python项目中使用的专业术语 什么是计算机视觉&#xff1f; 计算机视觉是使计算机能…

golang学习5,glang的web的restful接口

1. //返回json r.GET("/getJson", controller.GetUserInfo) package mainimport (/*"net/http"*/"gin/src/main/controller""github.com/gin-gonic/gin" )func main() {r : gin.Default()r.GET("/get", func(ctx *…

【K8S类型系统】一文梳理 K8S 各类型概念之间的关系(GVK/GVR/Object/Schema/RestMapper)

参考 k8s 官方文档 https://kubernetes.io/zh-cn/docs/reference/https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.29/ 重点 Kubernetes源码学习-kubernetes基础数据结构 - 知乎 重点 Kubernetes类型系统 | 李乾坤的博客 重点 k8s源码学习-三大核心数…

Java学习--学生管理系统(残破版)

代码 Main.java import java.util.ArrayList; import java.util.Scanner;public class Main {public static void main(String[] args) {ArrayList<Student> list new ArrayList<>();loop:while (true) {System.out.println("-----欢迎来到阿宝院校学生管理系…

Stable Cascade-ComfyUI中文生图、图生图、多图融合基础工作流分享

最近 ComfyUI对于Stable Cascade的支持越来越好了一些&#xff0c;官方也放出来一些工作流供参考。 这里简单分享几个比较常用的基础工作流。 &#xff08;如果还没有下载模型&#xff0c;可以先阅读上一篇Stable Cascade升级&#xff0c;现在只需要两个模型&#xff09; &a…

2024国际元宇宙博览会:阿里元境以元宇宙数字内容助力文旅数字化发展

2月26日&#xff0c;MES2024国际元宇宙博览会在深圳会展中心正式开幕&#xff0c;大会以“向3D出发&#xff0c;元宇宙来袭&#xff0c;电竞娱乐正当时”为主题&#xff0c;聚焦元宇宙产业链&#xff0c;以“汇聚企业创新&#xff0c;助力产业重构&#xff0c;推动行业发展”为…

常见外设学习以及无线通信频率

常见外设 UART UART&#xff08;Universal Asynchronous Receiver/Transmitter&#xff0c;通用异步收发器&#xff09;是一种异步、串行、全双工的通信总线。 UART 有3根线&#xff0c;分别是&#xff1a;发送线&#xff08;TX&#xff09;、接收线&#xff08;RX&#xff…

【C语言】文件及文件操作详解(fseek,ftell,rwind)

目录 1. 为什么使用文件 2. 什么是文件 2.1 程序文件 2.2 数据文件 2.3 文件名 3. 二进制文件和文本文件 4. 文件的打开和关闭 4.1 流和标准流 4.1.1 流 4.1.2 标准流 4.2 文件指针 4.3 文件的打开和关闭 5. 文件的顺序读写 6.文件的随机读写 6.1 fseek 6.2 ft…

java 基础(核心知识搭配代码)

前言 java的学习分为了上部分以及下部分进行学习&#xff0c;上部分就是对于java的基础知识&#xff0c;面向对象上&#xff0c;面向对象下&#xff0c;异常操作&#xff0c;javaApi&#xff1b;下部主要是集合&#xff0c;泛型&#xff0c;反射&#xff0c;IO流&#xff0c;J…

离线数仓(四)【数仓数据同步策略】

前言 今天来把数仓数据同步解决掉&#xff0c;前面我们已经把日志数据到 Kafka 的通道打通了。 1、实时数仓数据同步 关于实时数仓&#xff0c;我们的 Flink 直接去 Kafka 读取即可&#xff0c;我们在学习 Flink 的时候也知道 Flink 提供了 Kafka Source&#xff0c;所以这里不…

SQLPro Studio:数据库管理的革命性工具 mac版

SQLPro Studio是一款强大的数据库管理和开发工具&#xff0c;它旨在提供高效、便捷和安全的数据库操作体验。无论是数据库管理员、开发人员还是数据分析师&#xff0c;SQLPro Studio都能满足他们在数据库管理、查询、设计和维护方面的需求。 SQLPro Studio mac版软件获取 首先…

Android ANR 日志分析定位

ANR 是 Android 应用程序中的 "Application Not Responding" 的缩写&#xff0c;中文意思是 "应用程序无响应"。这是当应用程序在 Android 系统上运行时&#xff0c;由于某种原因不能及时响应用户输入事件或执行一个操作&#xff0c;导致界面无法更新&…