需求详情

  • Service中每隔10秒执行一次定位操作(GPS+基站)
  • 定位的结果实时显示在E都市 上(要求得到经度、纬度)

Android Studio注册service服务

  • 切记android中的服务是需要在项目清单文件中注册的

首先新建service类,将所建的service添加到清单文件中

<service android:name="服务类坐所在的包名.MyService"></service>

具体创建并启动service方法可参考: Android Service与Activity的交互以及Android service服务

APP js中启动service服务示例代码

console.log("****************启动service服务:" + localStorage.getItem("$locationStatus"));
//获取Activity对象
var main = plus.android.runtimeMainActivity();
var Intent = plus.android.importClass('android.content.Intent');
var intent = new Intent();
// Activity绑定我们的service服务
intent.setClassName(main, "io.dcloud.HBuilder.wxapi.SingASongService");
// 设置需要传递的参数
intent.putExtra("userId", localStorage.getItem("$userId"));
intent.putExtra("url", CONFIG.server_url + "/apploginuser-apploginuser/apploginuser-save2.html");
// 启动service服务
main.startService(intent);
localStorage.setItem('$locationStatus','1');
console.log("****************启动service服务完毕:" +localStorage.getItem("$locationStatus"));

Android studio--Intent 介绍:关于启动service时的Intent介绍

service服务类逻辑示例代码

package io.dcloud.HBuilder.wxapi;import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.media.MediaPlayer;
import android.os.Build;
import android.os.Bundle;
import android.os.IBinder;
import android.support.v4.content.ContextCompat;import org.apache.commons.httpclient.HttpClient;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.math.BigDecimal;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;import io.dcloud.HBuilder.R;public class SingASongService extends Service {private MediaPlayer mMediaPlayer;private String url;   // 请求接口private String userId; // 用户IDprivate int taskId;    // 周期任务IDprivate Context context=this;private TestThread locationThread; //定时动态获取经纬度线程private Boolean isInterrupted = true;@Overridepublic IBinder onBind(Intent intent) {return null;}@Overridepublic void onCreate() {System.out.println("********SingASongService-->onCreate");super.onCreate();mMediaPlayer = MediaPlayer.create(this, R.raw.no_kill);mMediaPlayer.setLooping(true);}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {this.url = intent.getStringExtra("url");this.userId = intent.getStringExtra("userId");System.out.println("**********url:"+url);System.out.println("************userId:"+userId);new Thread(new Runnable() {@Overridepublic void run() {startPlaySong();}}).start();return START_NOT_STICKY;}//开始、暂停播放private void startPlaySong() {System.out.println("********SingASongService-->startPlaySong-->initLocation");if (null == locationThread){locationThread = new TestThread();locationThread.start();}else {locationThread.start();}if (mMediaPlayer == null) {mMediaPlayer = MediaPlayer.create(this, R.raw.no_kill);mMediaPlayer.start();} else {mMediaPlayer.start();}}/*** 动态获取用户经纬度位置并向后台发送请求更新用户地图位置显示*/public class TestThread extends Thread {public volatile boolean exit = false;public void run() {while (!exit){try{if (this.interrupted()) {System.out.println("**********************已经是停止状态了,我要退出了***********************");break;}//初始化定位工具类LocationUtils.initLocation(context);System.out.println("GPS **********Location经度:"+LocationUtils.longitude);System.out.println("GPS **********Location纬度:"+LocationUtils.latitude);sendPost(url,"latitude="+LocationUtils.latitude+"&longitude="+LocationUtils.longitude+"&userId="+userId);Thread.sleep(10000);//阻塞过程捕获中断异常来退出}catch(InterruptedException e){e.printStackTrace();System.out.println("*****************************捕获中断异常:跳出线程循环*********************");break;//捕获到异常之后,执行break跳出循环。}}}}/*** 向后台发送请求更新用户位置* @param url 请求接口* @param param 经纬度以及用户ID* @return*/public static String sendPost(String url, String param) {System.out.println("********param:"+param);System.out.println("********url:"+url);PrintWriter out = null;BufferedReader in = null;String result = "";if (null != url){try {URL realUrl = new URL(url);// 打开和URL之间的连接URLConnection conn = realUrl.openConnection();// 设置通用的请求属性conn.setRequestProperty("accept", "*/*");conn.setRequestProperty("connection", "Keep-Alive");conn.setRequestProperty("user-agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");// 发送POST请求必须设置如下两行conn.setDoOutput(true);conn.setDoInput(true);// 获取URLConnection对象对应的输出流out = new PrintWriter(conn.getOutputStream());// 发送请求参数out.print(param);// flush输出流的缓冲out.flush();// 定义BufferedReader输入流来读取URL的响应in = new BufferedReader(new InputStreamReader(conn.getInputStream()));String line;while ((line = in.readLine()) != null) {result += line;}System.out.println("********result"+result);} catch (Exception e) {System.out.println("发送 POST 请求出现异常!"+e);e.printStackTrace();}//使用finally块来关闭输出流、输入流finally{try{if(out!=null){out.close();}if(in!=null){in.close();}}catch(IOException ex){ex.printStackTrace();}}}return result;}@Overridepublic void onDestroy() {System.out.println("********SingASongService-->onDestroy");super.onDestroy();stopPlaySong();System.out.println("***********************调用方法终止线程");locationThread.exit = true;locationThread.interrupt();try {locationThread.join();} catch (InterruptedException e) {e.printStackTrace();}}//停止播放销毁对象private void stopPlaySong() {if (mMediaPlayer != null) {mMediaPlayer.stop();mMediaPlayer.release();mMediaPlayer = null;}}}

js 停止service服务代码示例

console.log("*******************关闭service服务开启:"+localStorage.getItem("$locationStatus"));
var main = plus.android.runtimeMainActivity();
var Intent = plus.android.importClass('android.content.Intent');
var intent = new Intent();
intent.setClassName(main, "io.dcloud.HBuilder.wxapi.SingASongService");
main.stopService(intent);
localStorage.setItem('$locationStatus','0');
console.log("*******************关闭service服务完毕:"+localStorage.getItem("$locationStatus"));

首先开启Android定位的相关权限

Android Studio中相关权限介绍:Android AndroidManifest 清单文件所有权限详解

LocationManager定位工具类示例代码

package io.dcloud.HBuilder.wxapi;import android.content.Context;
import android.content.pm.PackageManager;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.support.v4.content.ContextCompat;public class LocationUtils {// 纬度public static Double latitude = 0.0;// 经度public static Double longitude = 0.0;/*** 初始化位置信息** @param context*/public static void initLocation(Context context) {LocationListener locationListener = new LocationListener() {// Provider的状态在可用、暂时不可用和无服务三个状态直接切换时触发此函数@Overridepublic void onStatusChanged(String provider, int status,Bundle extras) {}// Provider被enable时触发此函数,比如GPS被打开@Overridepublic void onProviderEnabled(String provider) {}// Provider被disable时触发此函数,比如GPS被关闭@Overridepublic void onProviderDisabled(String provider) {}// 当坐标改变时触发此函数,如果Provider传进相同的坐标,它就不会被触发@Overridepublic void onLocationChanged(Location location) {if (location != null) {latitude = location.getLatitude();longitude = location.getLongitude();}}};LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);System.out.println("********locationManager:"+locationManager);// 检测GPS定位是否可用,不可用则进行网络定位(信号塔或WiFi定位的初略定位方式)if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {System.out.println("********locationManager.isProviderEnabled:"+LocationManager.GPS_PROVIDER);if (ContextCompat.checkSelfPermission(context, android.Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED|| ContextCompat.checkSelfPermission(context, android.Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED){Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);if (location != null) {latitude = location.getLatitude();longitude = location.getLongitude();}System.out.println("********initLocation-->isProviderEnabled-->after-->latitude:"+latitude);System.out.println("********initLocation-->isProviderEnabled-->after-->longitude:"+longitude);}} else {locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,1000, 0, locationListener);Location location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);if (location != null) {latitude = location.getLatitude(); // 经度longitude = location.getLongitude(); // 纬度}System.out.println("********initLocation-->after-->latitude:"+latitude);System.out.println("********initLocation-->after-->longitude:"+longitude);}}
}

关于Android Studio中获取经纬度的相关参考:

Android 定位的实现

Android Service获取当前位置(GPS+基站)

Android初级教程获取手机位置信息GPS与动态获取最佳方式

Android Studio 离线打包:Android平台本地(离线)打包指南

Android Studio 获取经纬度相关推荐

  1. 【Android Studio安装部署系列】十一、Android studio获取数字签名信息

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 下面介绍下调试版本和发布版本获取数字签名的方法,通过以下方法可以获取到SHA1和MD5. 一般在使用分享功能,在第三方平台中创建应用 ...

  2. Android获取电子签名内容,Android Studio 获取app签名

    今天在学习整合高德地图的时候,需要app的sha1码. image.png Android Studio 获取app签名的步骤如下: 1.Build下的Generate Signed APK imag ...

  3. Android Studio 获取应用签名 MD5和SHA1等

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.配置module的build.gradle 二.使用步骤 总结 前言 平时开发,很多第三方需要配置应用签名,比如百 ...

  4. Android Studio获取SHA-1 key的方法

    Android Studio获取SHA-1 key的方法: 首先去C盘的C:\Users\R.android(R是自己设置的电脑名称)找是否有.android文件夹: 若有就用cmd命令调出电脑的命令 ...

  5. Android studio获取服务器端json数据——天气预报(仅读取了json文件尚未分析)

    Android studio获取服务器端json数据--天气预报 MainActivity.java import androidx.appcompat.app.AppCompatActivity;i ...

  6. 错误 程序包android.app不存在,运行.app时Android Studio获取包名称错误

    运行.app时Android Studio获取包名称错误 我将程序包名称从com.mycompany.myapplication更改为com.mycompany.testapp. 一切都构建良好,但是 ...

  7. android studio 获取sha1keytool -list -v -keystore E:\PGY\keyStore\chunni.jks

    android studio 获取sha1值的方法 keytool -list -v -keystore E:\PGY\keyStore\xxxx.jks

  8. Android studio 获取MD5和SHA1

    一. 1.进入到自己的jdk中的bin目录中 2.执行命令keytool -v -list -keystore c:\Users\xxxx\.android\debug.keystore 这是获取An ...

  9. 使用andorid studio获取经纬度信息

    可以使用模拟器或者安卓真机_建议真机_ 小节简介 原理介绍 注意事项: 运行结果如下 小节简介 平台:andorid studio3.5.2 涉及文件:acticity_main.xml.Andori ...

最新文章

  1. 研究人员利用脑电ErrP信号实时控制机器人
  2. python对英语和数学的帮助-文科女生学Python:学过初中数学和英语就能懂的编程逻辑...
  3. python画笑脸图案-如何用Python画滑稽笑脸
  4. 推荐 7 个牛哄哄 Spring Cloud 实战项目
  5. 实现接口与显示实现接口的区别
  6. ubuntu 如何转换 ppk ,连接 amazon ec2
  7. java.util.Collections类使用(很多秘密,网上资料亲测)
  8. Viliv N5 GPS安装及使用方法
  9. 2008-2011大股东增持专题
  10. 戴尔计算机没有硬盘驱动,如果Dell计算机无法从硬盘驱动器启动怎么办
  11. SSM框架利用Filter实现页面不登陆拦截,禁止跳过登录页面不登陆强制访问
  12. 蓝桥杯国信长天单片机--原理图详解(四)
  13. 前阿里P10员工赵海平加入字节跳动,职级或为4+
  14. 范德堡计算机科学硕士,美国范德堡大学计算机科学专业怎么样?
  15. 网络爬虫法即将出台!!!小爬怡情,大爬over
  16. directx安装后找不到_如何下载,安装,更新到最新的DirectX
  17. html怎么引用网页链接,网页中各种链接引用方法小结
  18. “她经济”时代,兜售少女心的乙女游戏将成新风口?
  19. 05月11日三支有望飙涨股与操盘策略分析
  20. 网站开启https后很慢_安装SSL证书会导致网站访问速度变慢?

热门文章

  1. 华为无线设备配置静态负载均衡
  2. shell编程发送按键
  3. 蓝桥杯2014年省赛[第五届]-JavaB组赛题解析
  4. 幸福地生活 -哈佛幸福公开课
  5. 【学习笔记】零基础入门NLP - 新闻文本分类实战
  6. 计算机专业的专科生能找到好工作吗?|猿代码科技
  7. verilog计数器
  8. 数字取证一 证据固定、文件过滤、文件类型、文件签名、文件哈希
  9. 手机锂电池充电什么时候好?
  10. Type-C、USB-C、USB3.1 三者关系