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.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')
    在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一种基于道路分类特性的超快速车道检测算法

摘要&#xff1a; 本文介绍了一种新颖、简单但有效的车道检测公式。 车道检测是自动驾驶和高级驾驶员辅助系统 (ADAS) 的基本组成部分&#xff0c;在实际高阶驾驶辅助应用中&#xff0c;考虑车道保持、转向、限速等相关的控制问题&#xff0c;这种方式通常是通过受限的车辆计算…

【牛客】2024牛客寒假算法基础集训营6ABCDEGHIJ

文章目录 A 宇宙的终结题目大意主要思路代码 B 爱恨的纠葛题目大意主要思路代码 C 心绪的解剖题目大意主要思路代码 D 友谊的套路题目大意主要思路代码 E 未来的预言题目大意主要思路代码 G 人生的起落题目大意主要思路代码 I 时空的交织题目大意主要思路代码 J 绝妙的平衡题目…

Kotlin 进阶版 协程

kotlin是协程的一种实现 Dispatchers.IO&#xff1a;适用于执行磁盘或网络 I/O 操作的调度器&#xff0c;例如文件读写、网络请求等。在 Android 中&#xff0c;Dispatchers.IO 会使用一个专门的线程池来处理这些操作&#xff0c;以防止阻塞主线程。 Dispatchers.Main&#xf…

幻兽帕鲁服务器多少钱?有买过的吗?

幻兽帕鲁服务器多少钱&#xff1f;太卷了&#xff0c;降价到24元1个月&#xff0c;阿里云4核16G10M游戏服务器26元1个月、149元半年&#xff0c;腾讯云4核16G游戏服务器32元、312元一年&#xff0c;华为云26元&#xff0c;京东云主机也是26元起。云服务器吧yunfuwuqiba.com给大…

[RCTF2015]EasySQL1 题目分析与详解

一、题目介绍&#xff1a; 1、题目来源&#xff1a; BUUCTF网址 2、题目介绍&#xff1a; 拿到flag。 二、解题思路&#xff1a; 我们发现题目首页有登录和注册账号两个选项&#xff0c;我们首先尝试注册账号&#xff0c;尝试注册username为admin的账号&#xff0c;输入密码…

这10款设计工具,助你轻松搞定主视觉设计!

我们浏览网站、App或其他数字产品时&#xff0c;页面或屏幕上最显著最重要的部分&#xff0c;比如设计风格、颜色、排版、图片和元素等信息&#xff0c;就是数字产品的主视觉&#xff0c;也是用户首次接触产品时最能直观感受的部分。 由此可见&#xff0c;主视觉设计有多重要&…

【大数据】Flink 内存管理(四):TaskManager 内存分配(实战篇)

《Flink 内存管理》系列&#xff08;已完结&#xff09;&#xff0c;共包含以下 4 篇文章&#xff1a; Flink 内存管理&#xff08;一&#xff09;&#xff1a;设置 Flink 进程内存Flink 内存管理&#xff08;二&#xff09;&#xff1a;JobManager 内存分配&#xff08;含实际…

PyTorch中Tensor(张量)数据结构内部观察

上图中是一个张量embeds&#xff0c;打开其内部存储空间&#xff0c;我们可以看到内部的构成。在PyTorch中&#xff0c;Tensor 具有许多属性和方法。以下是其中一些关键的属性和方法&#xff1a; 属性&#xff1a; H&#xff1a; 在标准的PyTorch API中并没有直接表示为 .H 的…

IO进程线程:共享内存

shmsnd.c #include<myhead.h> #define PAGE_SIZE 4096 //一页的大小 int main(int argc, const char *argv[]) {//1.创建key值key_t key-1;if((keyftok("/",k))-1){perror("ftok error");return -1;}printf("key%d\n",key);//2.通过key…

【计算机网络】传输层——TCP和UDP详解

文章目录 一. TCP和UDP简介二. UDP 协议详解1. UDP报文格式2. UDP的使用场景 三. TCP 协议详解1. TCP报文格式2. TCP协议的重要机制确认应答&#xff08;保证可靠传输的最核心机制&#xff09;超时重传连接管理&#xff08;三次握手、四次挥手&#xff09;&#xff01;&#xf…

C语言 int和unsigned int逻辑比较

文章目录 测试1、测试 CMP (int,int)2、测试 CMP (int ,unsigned int)3、测试 CMP (unsigned int ,unsigned int) 总结 测试 在IAR(8.40.2)平台下测试单片机为STM32F103ZET6 1、测试 CMP (int,int) //a -2,b 3 int test_fun(int a, int b) {if(a>b){return 1;}else{re…

[力扣 Hot100]Day35 LRU 缓存

题目描述 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类&#xff1a; LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存 int get(int key) 如果关键字 key 存在于缓存中&#xff0c;则返回关键字的值&#xff0c;否…

Linux7.9环境源码编译安装ffmpeg6.x

1.官网ffmpeg下载源码 https://ffmpeg.org/download.html#build-windows 2.未安装x264库则先安装配置 可以先查询x264库: whereis libx264 安装编译工具和依赖库&#xff1a; sudo yum install gcc make cmake mercurial git yasm pkgconfig autoconf automake libtool sudo…

【每日一题】938. 二叉搜索树的范围和-2024.2.26

题目&#xff1a; 938. 二叉搜索树的范围和 给定二叉搜索树的根结点 root&#xff0c;返回值位于范围 [low, high] 之间的所有结点的值的和。 示例 1&#xff1a; 输入&#xff1a;root [10,5,15,3,7,null,18], low 7, high 15 输出&#xff1a;32示例 2&#xff1a; 输入…

Python实用技巧:输出列表(list)的倒序/逆序的几种方法

Python实用技巧&#xff1a;输出列表&#xff08;list&#xff09;的倒序/逆序的几种方法 &#x1f4c5;2024年02月25日 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质…

力扣随笔之寻找重复数(中等287)

思路1&#xff1a;暴力解法&#xff0c;根据要求不修改数组且只用常量级O(1)的额外空间&#xff0c;我们写两层嵌套循环&#xff0c;寻找重复的数;可以解决部分问题&#xff0c;但会超出时间限制无论Java还是C; Java实现&#xff1a; class Solution {public int findDuplicat…

第四节:Vben Admin登录对接后端getUserInfo接口

系列文章目录 第一节&#xff1a;Vben Admin介绍和初次运行 第二节&#xff1a;Vben Admin 登录逻辑梳理和对接后端准备 第三节&#xff1a;Vben Admin登录对接后端login接口 第四节&#xff1a;Vben Admin登录对接后端getUserInfo接口 文章目录 系列文章目录前言一、回顾Vben…

Elastic Search的RestFul API入门:使用SQL查询ES

确实,Elasticsearch 中也支持 SQL 语法,但我们通常使用 DSL 进行 API 操作,很少有人用 SQL 进行 Elasticsearch 的操作。然而,如果你刚开始学习 Elasticsearch,这一节的内容可以帮助你更快地理解 Elasticsearch(前提是你已经熟悉 SQL)。通过 SQL 查询,你可以进行一些简…

HTTPS对HTTP的加密过程

1、HTTPS是在HTTP的基础上&#xff0c;引入了一个加密层&#xff08;SSL&#xff09;&#xff0c;对数据进行保护&#xff0c;HTTP 是明文传输的&#xff08;不安全&#xff0c;很可能会被运营商通过referer劫持&#xff0c;或者黑客通过修改链接来窃数据&#xff09; 2、加密…

数字人的未来:数字人对话系统 Linly-Talker + 克隆语音 GPT-SoVITS

&#x1f680;数字人的未来&#xff1a;数字人对话系统 Linly-Talker 克隆语音 GPT-SoVITS https://github.com/Kedreamix/Linly-Talker 2023.12 更新 &#x1f4c6; 用户可以上传任意图片进行对话 2024.01 更新 &#x1f4c6; 令人兴奋的消息&#xff01;我现在已经将强…