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

news2025/1/12 23:40:10

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.timerTask

class MethodChannelDemo(messenger: BinaryMessenger, var activity : Activity) : MethodCallHandler {
    private var channel: MethodChannel
    private var count = 0

    init {
        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>>() {}.type
            val 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>>() {}.type
            val 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)

    }


    //小红书分享sdk
    private 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.atui

import 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.GeneratedPluginRegistrant

class 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.coloradmin.cn/o/1471139.html

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

相关文章

基于YOLOv8深度学习+Pyqt5的电动车头盔佩戴检测系统

wx供重浩&#xff1a;创享日记 对话框发送&#xff1a;225头盔 获取完整源码源文件已标注的数据集&#xff08;1463张&#xff09;源码各文件说明配置跑通说明文档 若需要一对一远程操作在你电脑跑通&#xff0c;有偿89yuan 效果展示 基于YOLOv8深度学习PyQT5的电动车头盔佩戴检…

第十三章 Linux——备份与恢复

第十三章 Linux——备份与恢复 基本介绍安装dump和restore使用dump完成备份dump语法说明dump应用案例1dump应用案例2dump-w查看备份时间文件备份文件或者目录备注 使用restore基本语法基本介绍restore基本语法应用案例1应用案例2应用案例3应用案例4 基本介绍 实体机无法做快照…

vue2 之 Vue-Quill-Editor富文本编辑器

一、安装 1. 下载 npm i vue-quill-editor 2. 配置 页面配置 <script> import quill/dist/quill.core.css; import quill/dist/quill.snow.css; import quill/dist/quill.bubble.css; import { quillEditor } from vue-quill-editor;export default {components: { …

机器人内部传感器阅读笔记及心得-位置传感器-旋转变压器、激光干涉式编码器

旋转变压器 旋转变压器是一种输出电压随转角变化的检测装置&#xff0c;是用来检测角位移的&#xff0c;其基本结构与交流绕线式异步电动机相似&#xff0c;由定子和转子组成。 旋转变压器的原理如图1所示&#xff0c;定子相当于变压器的一次侧&#xff0c;有两组在空间位置上…

【教程】 iOS混淆加固原理篇

摘要 本文介绍了iOS应用程序混淆加固的缘由&#xff0c;编译过程以及常见的加固类型和逆向工具。详细讨论了字符串混淆、类名、方法名混淆、程序结构混淆加密等加固类型&#xff0c;并介绍了常见的逆向工具和代码虚拟化技术。 引言 在iOS开发中&#xff0c;为了保护应用程序…

matlab|基于DistFlow潮流的配电网故障重构(输入任意线路)

目录 1 主要内容 2 部分代码 3 程序结果 4 下载链接 1 主要内容 程序采用适用于辐射状网络的DistFlow潮流模型&#xff0c;可输入任意故障线路编号&#xff0c;得到优化重构结果。这个程序是配电网故障重构可视化matlabyalmip的升级版&#xff0c;原来的程序是以电压质量作…

用39块钱的全志V851se视觉开发板做了个小相机,还可以物品识别、自动追焦!

用39块钱的V851se视觉开发板做了个小相机。 可以进行物品识别、自动追焦&#xff01; 这个超低成本的小相机是在V851se上移植使用全志在线开源版本的Tina Linux与OpenCV框架开启摄像头拍照捕获视频&#xff0c;并结合NPU实现Mobilenet v2目标分类识别以及运动追踪等功能…并最终…

CentOS删除除了最近5个JAR程序外的所有指定Java程序

帮我写一个shell脚本,ps -eo pid,lstart,cmd --sort=-start_time | grep "pgz-admin"查到的结果,返回的所有进程PID,第六个之上的,全部kill 当然,你可以创建一个简单的Shell脚本来完成这个任务。以下是一个例子: #!/bin/bash# 获取包含 "pgz-admin"…

SSM框架学习笔记07 | Spring MVC入门

文章目录 1. HTTP协议2. Spring MVC2.1. 三层架构2.2. MVC&#xff08;解决表现层的问题&#xff09;2.3. 核心组件 3. Thymeleaf3.1. 模板引擎3.2. Thymeleaf3.3. 常用语法 代码 1. HTTP协议 网址&#xff1a;https://www.ietf.org/ &#xff08;官网网址&#xff09; https:…

什么是系统工程(字幕)37

0 00:00:00,740 --> 00:00:03,200 但是呢&#xff0c;我们往后面看 1 00:00:04,100 --> 00:00:08,920 刚才我们讲到那个说&#xff0c;应该是组合关系 2 00:00:08,920 --> 00:00:09,522 对吧 3 00:00:09,522 --> 00:00:11,330 不是泛化关系 4 00:00:12,520 --&…

JavaWeb 自己给服务器安装SQL Server数据库遇到的坑

之前买的虚拟主机免费送了一个SQL Server数据库&#xff0c;由于服务器提供商今年下架我用的那款虚拟主机产品&#xff0c;所以数据库也被收回了。我买了阿里云云服务器&#xff0c;但是没有数据库&#xff0c;于是自己装了一个SQL Server数据库&#xff0c;总结一下遇到的坑。…

JAVA毕业设计129—基于Java+Springboot+thymeleaf的物业管理系统(源代码+数据库)

毕设所有选题&#xff1a; https://blog.csdn.net/2303_76227485/article/details/131104075 基于JavaSpringbootthymeleaf的物业管理系统(源代码数据库)129 一、系统介绍 本项目前后端分离&#xff0c;本系统分为管理员、小区管理员、用户三种角色 1、用户&#xff1a; 登…

栈和堆什么意思,Rust所有权机制又是什么

栈和堆什么意思 栈&#xff1a;存储基本数据类型和引用数据类型的指针引用(地址)&#xff0c;基本数据类型占据固定大小的内存空间。 堆&#xff1a;存储引用数据类型的值&#xff0c;引用数据类型包括对象&#xff0c;数组和函数&#xff0c;在堆中&#xff0c;引用数据类型…

WhatsApp Business API入门:功能、收费、申请方法全解析

WhatsApp Business API是为企业量身打造的一种高级服务&#xff0c;它提供了一组编程接口&#xff08;API&#xff09;&#xff0c;而不是一个可以直接操作的用户界面。与免费版的WhatsApp Business应用不同&#xff0c;WhatsApp Business API并不能在应用商店如App Store或Goo…

git之远程操作

一.分布式版本控制系统 分布式版本控制系统通常也有⼀台充当“中央服务器”的电脑&#xff0c;但这个服务器的作⽤仅仅是⽤来⽅便“交换”⼤家的修改&#xff0c;没有它⼤家也⼀样⼲活&#xff0c;只是交换修改不⽅便⽽已。有了这个“中央服务器”的电脑&#xff0c;这样就不怕…

01背包问题:组合问题

01背包问题&#xff1a;组合问题 题目 思路 将nums数组分成left和right两组&#xff0c;分别表示相加和相减的两部分&#xff0c;则&#xff1a; left - right targetleft right sum 进而得到left为确定数如下&#xff0c;且left必须为整数&#xff0c;小数表示组合不存在&…

osmnx笔记:从OpenStreetMap中提取点和边的shp文件(FMM文件准备内容)

1 导入库 import osmnx as ox import time from shapely.geometry import Polygon import os import numpy as np 2 提取Openstreetmap 的graph Gox.graph_from_place(Huangpu,Shanghai,China,network_typedrive,simplifyTrue) ox.plot_graph(G) 3 提取graph中的点和边 gdf…

2/22作业

1.按位置插入 void insert_pos(seq_p L,datetype value,int pos) { if(LNULL) { printf("入参为空\n"); return; } if(seq_full(L)) { printf("表已满\n"); return; } if(pos>L->len|…

软考45-上午题-【数据库】-数据操纵语言DML

一、INSERT插入语句 向SQL的基本表中插入数据有两种方式&#xff1a; ①直接插入元组值 ②插入一个查询的结果值 1-1、直接插入元组值 【注意】&#xff1a; 列名序列是可选的&#xff0c;若是所有列都要插入数值&#xff0c;则可以不写列名序列。 示例&#xff1a; 1-2、插…

100天精通Python(实用脚本篇)——第117天:基于selenium实现反反爬策略之代码输入账号信息登录网站

文章目录 专栏导读1. 前言2. 实现步骤3. 基础补充4. 代码实战4.1 创建连接4.2 添加请求头伪装浏览器4.3 隐藏浏览器指纹4.4 最大化窗口4.5 启动网页4.6 点击密码登录4.7 输入账号密码4.8 点击登录按钮4.9 完整代码4.10 GIF动图展示 五、总结 专栏导读 &#x1f525;&#x1f5…