【问题标题】:How to make Android Java code call Node.js code?如何让 Android Java 代码调用 Node.js 代码?
【发布时间】:2017-02-10 07:48:51
【问题描述】:

我有一些代码,我想调用一些 Node.js 代码,但我不知道该怎么做。我想按照这篇博文中的描述实现这些Firebase 通知:

https://firebase.googleblog.com/2016/08/sending-notifications-between-android.html

但是有一些 Node.js 代码会监听我的 Firebase 数据库并检测是否有东西插入到我的数据库中。有什么办法可以在我的Android 应用程序的某个地方“部署”这段代码并拥有它以便调用这段代码?下面是我想从我的Android 应用程序中调用的 Node.js 代码:

var firebase = require('firebase');
var request = require('request');

var API_KEY = "..."; // Your Firebase Cloud Server API key

firebase.initializeApp({
  serviceAccount: ".json",
  databaseURL: "https://.firebaseio.com/"
});
ref = firebase.database().ref();

function listenForNotificationRequests() {
  var requests = ref.child('notificationRequests');
  ref.on('child_added', function(requestSnapshot) {
    var request = requestSnapshot.val();
    sendNotificationToUser(
      request.username, 
      request.message,
      function() {
        request.ref().remove();
      }
    );
  }, function(error) {
    console.error(error);
  });
};

function sendNotificationToUser(username, message, onSuccess) {
  request({
    url: 'https://fcm.googleapis.com/fcm/send',
    method: 'POST',
    headers: {
      'Content-Type' :' application/json',
      'Authorization': 'key='+API_KEY
    },
    body: JSON.stringify({
      notification: {
        title: message
      },
      to : '/topics/user_'+username
    })
  }, function(error, response, body) {
    if (error) { console.error(error); }
    else if (response.statusCode >= 400) { 
      console.error('HTTP Error: '+response.statusCode+' - '+response.statusMessage); 
    }
    else {
      onSuccess();
    }
  });
}

// start listening
listenForNotificationRequests();

我想我需要将代码托管在某个地方,但我觉得如果我只需要在某个地方托管一个文件,除非我弄错了,否则不一定要部署 Google App Engine 或 Heroku 之类的东西。我想我只是对如何在这个文件和我迄今为止编写的 Java Android 代码之间进行通信感到困惑。如果有人能指出我正确的方向,那就太好了。谢谢!

【问题讨论】:

    标签: javascript android node.js firebase firebase-notifications


    【解决方案1】:

    您可以在 android 上安装 Termux 之类的东西并在其上安装 node.js,然后在设备上本地托管您的代码,但我必须说使用 node.js 服务器似乎是一种奇怪的方式(但它听起来确实很有趣!)

    查看本指南以在您的 Android 上安装 Termux 和 node.js: https://medium.freecodecamp.com/building-a-node-js-application-on-android-part-1-termux-vim-and-node-js-dfa90c28958f#.z9zjw5o8w

    考虑到它是从 Android 上的某种模拟器内部托管的,我不确定网络流量从您的 node.js 服务器流向数据库并返回的情况如何,但值得一试。

    【讨论】:

    • 有趣。我会看看这个!问题是我想把它托管在云平台上,这样我就不必太担心网络流量,不必托管服务器并确保可扩展性。您还有其他解决方案吗?这很酷,虽然我会看看它
    • 抱歉,您是说要托管在云平台上还是不愿意?
    • 我想这样做是因为我觉得它消除了我自己维护它的所有麻烦。有没有免费的解决方案可以做到这一点?
    • 许多云平台都有免费试用(例如 Google Cloud 的 30-60 天,“花费”300 美元),您可以查看以下链接以获取更多免费托管 node.js 代码的资源(hostingadvice.com/blog/where-to-find-free-node-js-hosting) 但这提出了一个问题“你在托管什么?”因为如果你在你的 Android 应用程序中运行你的 node.js 代码,那么就没有什么可托管的了。我只会在本地编写你的 node.js 代码,然后将其部署到类似谷歌计算的地方(我在“微型”虚拟机上执行此操作,每月 4 美元)。这是你在想的那种事情吗?
    • 是的!当你提到你可以在你的 Android 应用程序中运行你的 nose.js 代码时,我会怎么做呢?我对此感到困惑。另一件事是您能否详细说明我如何托管这个“微型虚拟机”?我对 Google 计算不太熟悉
    【解决方案2】:

    有什么方法可以在我的 Android 应用程序的某个地方“部署”这段代码并拥有它以便调用这段代码?

    没有。您不会在 Android 应用程序中运行 node.js 代码。这会破坏分离代码的目的。

    Node.js 代码在所谓的应用服务器上运行。这样的应用服务器是您可以运行代码的受信任的地方。既然你控制着这样一个服务器(毕竟没有其他人可以访问它),你可以相信在服务器上运行的代码就是你放在那里的代码。

    您可以在用户的​​ Android 设备上运行代码。但是你永远不能相信在设备上运行的代码就是你发送到那里的代码。毕竟用户可以对应用进行更改。

    您不应将应用程序代码与在受信任服务器上运行的代码混用。我文章中的 Node.js 脚本需要 Firebase 云消息传递服务器密钥才能向设备发送消息。由于访问此密钥允许您代表您的项目发送消息,因此它应该只存在于受信任的服务上 - 例如您的应用服务器。

    【讨论】:

    • 我明白了。谢谢你。有什么可以用作免费应用程序服务器的示例,我可以使用 Node.js 代码对其进行测试?
    • 推荐此类服务对于 Stack Overflow 来说是题外话。但我希望搜索“可以运行节点的免费应用服务器”会得到一些好的结果。
    • @user1871869 这是一个比我更好的答案。只需将 node.js 用于它的用途,并使其远离 Android。
    • 啊当然哈哈抱歉。我不知道我是怎么错过的。忙着寻找我能回答的问题,我想哈哈。
    猜你喜欢
    • 1970-01-01
    • 2021-01-13
    • 2012-09-08
    • 1970-01-01
    • 2010-09-14
    • 2015-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多