如何在需要时在服务器上发送设备的位置

2024-03-06

我正在开发一个应用程序,其中我需要设备的当前纬度和经度。 获取纬度/经度的时间范围将由服务器决定。每当需要获取纬度/朗度时,服务器都会发送通知。当设备收到通知时 服务器,同时设备将其位置发送到服务器。

一些条件:

  • 即使设备没有 GPS,我也想要纬度/经度

  • 如果用户没有触摸或单击通知,那么我也想获取 纬度/经度,即即使设备处于睡眠模式。

  • 另外,我不想整天运行后台服务,因为 它会消耗设备的电池。


我肯定会建议使用Google Cloud Messaging这里。这样做的好处是,一旦设备运行您的应用程序,您就可以让它注册GCM您可以向他们发送一些消息,使他们将坐标注册到您的数据库中。

这种方法需要您实现一些服务器(例如,使用 PHP 的 Web 服务器)并使用户与其通信,因此流程将是:

  1. 您的服务器向所有已注册的设备发送一条广播消息,告诉它们必须针对GCM服务。

  2. 设备收到消息,然后您执行BroadcastReceiver获取纬度和经度并将其发送到远程服务器,例如http://www.mysuperserver.com/getlonglat.php, via a POST要求。

  3. 您的服务器获取这两个参数,您可以保存它们或执行您需要的任何操作。

如果您想遵循此方法,则必须遵循以下步骤:

  1. Go to https://console.developers.google.com https://console.developers.google.com。使用您的 Google 帐户注册一个新项目。这将为您提供 API 密钥和发件人 ID。

  2. 您需要在您的项目中注册设备GCM。您可以通过导入来实现这一点Google Play Services在您的项目中,完成后,执行类似的操作:

    GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(context);
    final String regid = gcm.register("YOUR_SENDER_ID");
    
  3. 此时,GCM服务器已经知道该用户已在您的项目中注册并给了他一个regid.

  4. 下一步是通知您自己的远程服务器用户已这样做,并将regid已提供,以便您稍后可以向他们发送消息。所以在客户端,做一个HTTP POST针对您的服务器发送的请求regid并用类似这样的方法处理它:

    $regid = $_POST['regid'];
    
    if (($regId) && ($ipAddr))
      sql_query("INSERT INTO gcm_subscribers(regid) VALUES($regid')");
    
  5. 完成后,您就知道谁已经在您的数据库中注册了。你可以SELECT所有用户并向他们发送信号以将他们的坐标发回给您。在以下示例中,参数首先是注册 ID 数组,其次是要发送的消息(例如,$messageData = "sendMeYourCoords!").

    function sendNotification($registrationIdsArray, $messageData) {
      $apiKey = "YOUR_API_KEY";
    
      $headers = array("Content-Type:" . "application/json", "Authorization:" . "key=" . $apiKey);
      $data = array(
        'data' => $messageData,
        'registration_ids' => $registrationIdsArray
      );
    
      $ch = curl_init();
    
      curl_setopt( $ch, CURLOPT_HTTPHEADER, $headers );
      curl_setopt( $ch, CURLOPT_URL, "https://android.googleapis.com/gcm/send" );
      curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, 0 );
      curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, 0 );
      curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
      curl_setopt( $ch, CURLOPT_POSTFIELDS, json_encode($data) );
    
      $response = curl_exec($ch);
      curl_close($ch);
    
      return $response;
    }
    
  6. 一旦进入你的客户,只需处理它GCM留言并再发一条POST到另一个URL在您的远程服务器上并将其传递给longitude and latitude。为了处理这些消息,我在下面添加了一些链接。

对于没有 GPS 的情况下获取坐标似乎没有太多解决方案,但还是有一些。这是一个例子:Android中如何在不使用GPS的情况下获取纬度经度值? https://stackoverflow.com/questions/13761367/how-to-get-latitute-longitude-value-without-using-gps-in-android

有关此的更多信息:

  • 参考谷歌云消息 http://developer.android.com/reference/com/google/android/gms/gcm/GoogleCloudMessaging.html

  • 使用 PHP 的 Google 云消息传递 http://distriqt.com/post/1273

  • 使用 HTTP 和 JSON 连接 PHP(服务器)和 Android(客户端) http://fahmirahman.wordpress.com/2011/04/21/connection-between-php-server-and-android-client-using-http-and-json/

  • Android 推送通知:Google Cloud Messaging (GCM)。实施客户(新版本) http://www.sgoliver.net/blog/?p=4126(西班牙语)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在需要时在服务器上发送设备的位置 的相关文章

  • 如何使用android canvas绘制一个只有左上角和右上角为圆角的矩形?

    我找到了一个用于所有 4 个角均为圆角的矩形的函数 但我只想将顶部 2 个角设为圆角 我能做些什么 canvas drawRoundRect new RectF 0 100 100 300 6 6 paint 对于 API 21 及更高版本
  • 在webview android上显示网页的一部分

    我想制作一个将网页内容加载到 webview 中的应用程序 我只想显示整个网页视图中的特定内容 而不是网页的全部内容 这是一个例子 如果我使用 作为 webview 的 URL 它会加载 webview 上页面的所有内容 但我想删除页面的横
  • 在 JellyBean 上使用 LogCat

    我有一个非常随机发生的错误 所以我依赖LogCat我从 Play 商店购买的监控应用程序 以查看发生时设备上抛出的异常 自从使用 Jelly Bean 以来 我没有看到任何日志记录 我读过 使用 Jelly Bean 应用程序只能看到Log
  • ProGuard SimException

    经过大约 4 个小时的随机尝试 我正在尝试让 ProGuard 正常工作 尝试让这个令人惊叹的软件正常工作 我的项目使用 LibGDX 和 KryoNet 这是我当前的 ProGuard 配置 verbose dontobfuscate d
  • 如何从 Java 中的 Native Android Activity 打开 React Native 应用程序的特定组件?

    Alert 这个问题基本上是关于一种方法 所以不会有任何可用的笔或代码可以共享 I was doing a POC where integrating an RN app into an Android App I did successf
  • “_Smi”不是“bool”类型的子类型 - Flutter MethodChannel

    收到这个奇怪的错误 似乎 MethodChannel 正在转换为 int 而不是 bool 06 07 00 16 26 589 3678 4993 E flutter ERROR topaz lib tonic logging dart
  • 如何将图片保存到文件中?

    我正在尝试使用标准意图来拍照 然后允许批准或重新拍摄 然后我想将图片保存到文件中 这是我正在使用的意图 Intent intent new Intent android provider MediaStore ACTION IMAGE CA
  • 在 Android Studio 中设置 Http 代理

    我已经阅读了多个类似的问题和文档 但我无法解决我的机器所在的公司防火墙的问题 我收到的错误是 无法刷新 Gradle 项目 未知主机 services gradle org 我所阅读和理解的所有内容都让我相信这是一个 http 代理问题 我
  • 自定义 AlertDialog - android.R.id.custom 的问题

    我确信我错过了这里的重点 所以我希望有人能解释一下 我想在用户触摸时创建一个弹出窗口ImageView 我看了一下AlertDialog文档说 如果您想显示更复杂的视图 请查找名为 custom 的 FrameLayout 并将您的视图添加
  • Android SIP 客户端 SipManager.open() 未打开

    我一直在使用 Android SDK 的本机 SIP 库编写 SIP 客户端 由于某种原因 我无法让我的帐户在服务器上注册 以下是测试场地 Linux Mint 17 XFCE 运行 Kamailio 服务器 启用 MySQL 和 TLS
  • 将 REST 服务与 Android 应用程序同步

    我使用一个 REST 服务来填充数据库中的信息 稍后由我的应用程序使用 我已经阅读了有关此事的多个主题 现在必须决定如何在 REST 服务和数据库之间实现同步 想象一个应用程序 它从谷歌金融 API 获取有关股票的信息并将其存储在数据库中
  • 类型“Null”不是类型“Widget”的子类型

    我正在编写一个关于 flutter 的代码 以便在 android ios 和 web 上使用 Google 登录 但我第一时间就遇到了这个错误 我在 Android 模拟器上运行它来检查它是否正常工作 我现在还没有将其设置为网络 在模拟器
  • Android Studio 无法解析存储库

    在我的项目中 我尝试使用设计支持库 我的 Gradle 文件中有 dependencies compile com android support design 当我尝试构建这个时 我收到错误 通常我会点击Install Repositor
  • TextView位于屏幕中央[重复]

    这个问题在这里已经有答案了 可能的重复 如何在 Android 中的 TextView 中水平和垂直居中文本 https stackoverflow com questions 432037 how do i center text hor
  • 提交后折叠搜索视图

    我在我的应用程序中使用 searchview 没有操作栏 提交查询文本后如何折叠搜索视图 我有这些听众 Override public boolean onQueryTextSubmit String query InputMethodMa
  • Firebird 和 Android JDBC 驱动程序

    火鸟有问题 我从未与 DB 合作过 服务器 firebird 1 5 上的数据库 添加库 firebird full 2 2 4到 libs 文件夹 将其添加到 Gradle implementation fileTree libs 将其添
  • Paint.setTextSize(float) 使用哪种测量单位?

    我想使用在视图上绘制具有特定高度 以像素为单位 的文本Canvas 你可以简单地使用Paint setTextSize float 与像素数或者这是使用dp or sp 它使用像素 但您可以使用以下代码将其转换为 dp double get
  • Android:制作/显示 9patch 图像时的对齐错误

    九号补丁 截屏 布局 XML
  • 使用 Nexus 10 在 Android 4.3 上滚动时性能不佳

    我的应用程序有一个带有一些滚动的列表视图 在我测试过的所有手机 Nexus One Nexus 4 和 Galaxy S3 4 上都表现得非常好 以 60fps 滚动 但 Nexus 10 上的表现很糟糕 大概在 15fps 左右 我已经将
  • 安卓框架?

    是否有任何框架比构建 Android 应用程序更容易 您会对其中一个感兴趣吗 很快就会有 我正在开发 DroidFu 一个 Android 共享库 它将为您提供 活动 和服务 中直接提供大量实用功能 例如生成列表和错误对话框 检查 Inte

随机推荐