【笔记】React-Native跟Android交互--简单示例

/**
* 使用命令 npx react-native@latest init DemoRN创建项目
* 
* "react": "18.2.0",
* "react-native": "0.73.2"
* 
* 官网有详细教程:https://reactnative.dev/docs/native-modules-android
*/

一、RN invoke android

1、使用Android studio 打开DemoRN项目的android项目创建文件(SendDataToAndroidModule.kt),JavaScript如果要调用原生方法需要用@ReactMethod注解

package com.demorn

import android.util.Log

import com.facebook.react.bridge.ReactApplicationContext
import com.facebook.react.bridge.ReactContextBaseJavaModule
import com.facebook.react.bridge.ReactMethod

class SendDataToAndroidModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaModule(reactContext) {

    override fun getName(): String = "SendDataToAndroidModule"

    @ReactMethod fun sayHelloEvent(name: String, msg: String) {
        Log.d("Mortal", "Hi! I'm $name, $msg")
    }
}

2、需要将native modules注册到react native中

package com.demorn

import android.view.View
import com.facebook.react.ReactPackage
import com.facebook.react.bridge.NativeModule
import com.facebook.react.bridge.ReactApplicationContext
import com.facebook.react.uimanager.ReactShadowNode
import com.facebook.react.uimanager.ViewManager

class MyAppPackage : ReactPackage {

    override fun createViewManagers(
        reactContext: ReactApplicationContext
    ): MutableList<ViewManager<View, ReactShadowNode<*>>> = mutableListOf()

    override fun createNativeModules(
        reactContext: ReactApplicationContext
    ): MutableList<NativeModule> = listOf(SendDataToAndroidModule(reactContext)).toMutableList()
}

3、完成原生模块的注册后,就可以在RN的JS上验证,新建组件TestAndroidModuleButton.tsx

import React from 'react';
import { NativeModules, Button } from 'react-native';

const { SendDataToAndroidModule } = NativeModules;

const TestAndroidModuleButton = () => {
  const onPress = () => {
    // console.log('We will invoke the native module here!');
    SendDataToAndroidModule.sayHelloEvent('Monica', 'How do I use AI');
  };

  return (
    <Button
      title="Say Now"
      color="#841584"
      onPress={onPress}
    />
  );
};

export default TestAndroidModuleButton;

4、然后import组件

5、改到android原生代码,需要重新运行项目npm run android

6、最后就是回到Android studio 打开Logcat面板,选择模拟器/真机,测试有没有调用原生方法

二、回调(Callback)

1、不管是处理线上应用奔溃/用户问题反馈,还是给不同用户群体推送广告,RN作为移动端也是避免不了要上报用户的设备信息。昨天试了直接npm install react-native-device-info(或expo-device),暂时用不了,所以放弃了,直接自己实现。

 新建模块DeviceModule.kt,reject需要去优化,不然后面报错拿到错误信息还要再处理

package com.demorn.nativeinvoke

import android.provider.Settings
import android.util.Log
import com.demorn.view.MainApplication
import com.facebook.react.bridge.Callback
import com.facebook.react.bridge.Promise
import com.facebook.react.bridge.ReactApplicationContext
import com.facebook.react.bridge.ReactContextBaseJavaModule
import com.facebook.react.bridge.ReactMethod

/**
 * 选择Callback还是Promise根据实际场景而定
 * */
class DeviceModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaModule(reactContext) {

    override fun getName(): String = "DeviceModule"

    /**
     * 方式一 Callback
     * @ReactMethod
     * fun getAndroidId(callback: Callback) {
     *     callBack.invoke(Settings.Secure.getString(MainApplication.MAIN_APPLICATION!!.contentResolver, Settings.Secure.ANDROID_ID))
     * }
     * 调用处:
     * DeviceModule.getBrand((brand: any) => {
     *   console.log('Mortal', brand);
     * })
     * */

    /**
     * 方式二 Promise
     * 设备ID
     * */
    @ReactMethod
    fun getAndroidId(promise: Promise) {
        // Settings.Secure.getString(this.getContentResolver(),Settings.Secure.ANDROID_ID);
        try {
            promise.resolve(Settings.Secure.getString(MainApplication.MAIN_APPLICATION!!.contentResolver, Settings.Secure.ANDROID_ID))
        } catch (e: Throwable) {
            promise.reject("Create Event Error", e)
        }
    }

    /**
     * 系统版本号
     * */
    @ReactMethod
    fun getSystemVersion(promise: Promise) {
        try {
            promise.resolve(android.os.Build.VERSION.RELEASE)
        } catch (e: Throwable) {
            promise.reject("Create Event Error", e)
        }
    }

    /**
     * 手机厂商
     * */
    @ReactMethod
    fun getBrand(promise: Promise) {
        try {
            promise.resolve(android.os.Build.BRAND)
        } catch (e: Throwable) {
            promise.reject("Create Event Error", e)
        }
    }

    /**
     * 手机型号
     * */
    @ReactMethod
    fun getSystemModel(promise: Promise) {
        try {
            promise.resolve(android.os.Build.MODEL)
        } catch (e: Throwable) {
            promise.reject("Create Event Error", e)
        }
    }

    /**
     * API版本
     * */
    @ReactMethod
    fun getApiLevel(promise: Promise) {
        try {
            promise.resolve(android.os.Build.VERSION.SDK_INT.toString())
        } catch (e: Throwable) {
            promise.reject("Create Event Error", e)
        }
    }
}

临时写了static,拿全局实例

3、然后稍微封装了下DeviceInfo

4、34点这个是根据自己情况去取值

/**打包签名,后续另外文章再记录*/

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

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

相关文章

大创项目推荐 题目:基于深度学习的中文汉字识别 - 深度学习 卷积神经网络 机器视觉 OCR

文章目录 0 简介1 数据集合2 网络构建3 模型训练4 模型性能评估5 文字预测6 最后 0 简介 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于深度学习的中文汉字识别 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &a…

C 变量

目录 1. C变量 2. C变量定义 2.1 变量初始化 2.2 C中的变量声明 3. C中的左值&#xff08;Lvalues&#xff09;和右值&#xff08;Rvalues&#xff09; 1. C变量 在C语言中&#xff0c;变量可以根据其类型分为以下几种基本类型&#xff1a; 整型变量&#xff1a;用…

2.室内设计学习 - CAD 2021 调整经典界面教程及基本设置

设置经典界面 1.在第二行的空白处右击&#xff0c;弹出对话框&#xff0c;并点击【关闭】&#xff0c;关闭掉。 2.菜单栏没有显示的情况下&#xff0c;在最上面的一排&#xff0c;点击向下的箭头展开下拉框&#xff0c;勾选 【显示菜单栏】 3.点击菜单【工具】-【工具栏】-【a…

【Docker】在Windows下使用Docker Desktop创建nginx容器并访问默认网站

欢迎来到《小5讲堂》&#xff0c;大家好&#xff0c;我是全栈小5。 这是《Docker容器》序列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对…

AI人工智能可以怎么应用?——GPT4v图文识别问答功能

沃卡 AI 已支持 AI识图问答TTS语音对话文档总结对话Dall E3 对话文生图国内大模型集合AI 绘画思维导图&#xff0c;而且功能还在不断更新优化&#xff0c;丰富好用&#xff01;一个系统满足您多个需求&#xff01; 大家可以通过收藏网页www.woka.chat 直接进行访问&#xff0c…

10s 内得到一个干净、开箱即用的 Linux 系统

安装 使用官方脚本安装我的服务器不行 官方脚本 mkdir instantbox && cd $_ bash <(curl -sSL https://raw.githubusercontent.com/instantbox/instantbox/master/init.sh) 下面是我的完整安装过程 mkdir /opt/instantbox cd /opt/instantbox 1.脚本文件 (这个没…

Asp.net移除Server, X-Powered-By, 和X-AspNet-Version头

移除X-AspNet-Version很简单,只需要在Web.config中增加这个配置节: <httpRuntime enableVersionHeader"false" />移除Server在Global.asax文件总增加&#xff1a; //隐藏IIS版本 protected void Application_PreSendRequestHeaders() {HttpContext.Current.Res…

数据结构day7

1.思维导图 1.二叉树递归创建 2.二叉树先中后序遍历 3.二叉树计算节点 4.二叉树计算深度。 5.编程实现快速排序降序

C# Onnx yolov8 水表读数检测

目录 效果 模型信息 项目 代码 训练数据 下载 C# Onnx yolov8 水表读数检测 效果 模型信息 Model Properties ------------------------- date&#xff1a;2024-01-31T10:18:10.141465 author&#xff1a;Ultralytics task&#xff1a;detect license&#xff1a;AGPL-…

Linus Torvalds的20个事实

Linus Torvalds 是 Linux 操作系统的创造者&#xff0c;至今还在维护内核。本文是他的自传《Just for fun》的简短摘录&#xff0c;关于他个人的20个事实&#xff0c;比如他的老婆是他的学生。 Brief: Some known, some lesser known – here are 20 facts about the Linus Tor…

【Maven基础】依赖插件管理工具

Maven Maven 作用Maven 安装Maven 目录Maven config settings创建 Maven 项目运行 Java 文件Maven 坐标导入 Maven 项目依赖管理依赖配置 依赖传递排除依赖 依赖范围生命周期test跳过 Test Maven 作用 Maven 安装 Maven 目录 bin 存放可执行文件 config 存放 Maven 的配置文件 …

C++ 数论相关题目,博弈论,SG函数,集合-Nim游戏

给定 n 堆石子以及一个由 k 个不同正整数构成的数字集合 S 。 现在有两位玩家轮流操作&#xff0c;每次操作可以从任意一堆石子中拿取石子&#xff0c;每次拿取的石子数量必须包含于集合 S &#xff0c;最后无法进行操作的人视为失败。 问如果两人都采用最优策略&#xff0c;…

C++入门学习(二十一)选择结构-if语句

1、单行if语句 假设有个人去酒吧&#xff0c;但是酒吧不允许18岁以下的人进入&#xff0c;此时可以使用if语句判断. #include <iostream> #include <string> using namespace std;int main() { int a;cout<<"请输入您的年龄&#xff1a;"<…

软考复习之数据结构篇

算法设计 迭代法&#xff1a;用于求方程的近似根。 1、若方程无解&#xff0c;则算法求出的近似根序列就不会收敛&#xff0c;迭代过程会变成死循环&#xff0c;因此在使用迭代算法前应先考查方程是否有解&#xff0c;并在程序中对迭代的次数给予限制。 2、方程虽有解&#…

PyTorch深度学习实战(34)——Pix2Pix详解与实现

PyTorch深度学习实战&#xff08;34&#xff09;——Pix2Pix详解与实现 0. 前言1. 模型与数据集1.1 Pix2Pix 基本原理1.2 数据集分析1.3 模型构建策略 2. 实现 Pix2Pix 生成图像小结系列链接 0. 前言 Pix2Pix 是基于生成对抗网络 (Convolutional Generative Adversarial Netwo…

Fog Volume 3

仅支持内置渲染管线 Fog Volume 3是一个体积雾渲染器,旨在模拟各种大气效果。它提供了大量的控制,以帮助您在外观和性能方面满足您的需求。有关详细信息,请查看文档。 下载: ​​Unity资源商店链接 资源下载链接 效果图:

springBoot - mybatis 多数据源实现方案

应用场景: 多数据源 小型项目 或者 大项目的临时方案中比较常用.在日常开发中,可能我们需要查询多个数据库,但是数据库实例不同,导致不能通过 指定schema的方式 区分不同的库, 这种情况下就需要我们应用程序配置多数据源 实现方式: 首先自定义实现 datasource数据源 为当前…

基于SSM的二手车交易网站设计与实现(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的二手车交易网站设计与实现&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过…

【C++初阶】C++入门(2)

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《C》 《Linux》 《Cpolar》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 文章目录 一、函数重载1.1 函数重载的概念1.2 函数重载的种类1.3 C支持函数重载的原理 二…

AI技术的机遇与挑战

现在&#xff0c;企业对人工智能&#xff08;AI&#xff09;技术人员的需求高涨&#xff0c;对人工智能项目大幅投入预算。全球新冠肺炎疫情等驱动因素促进了数字化转型&#xff0c;极大地加快了AI和机器学习&#xff08;ML&#xff09;技术的发展。越来越多的企业正在研究如何…