需求详情

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

Android Studio注册service服务

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

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

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

android studio 获取本机代理ip android studio获取定位_android

具体创建并启动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; // 用户ID
    private int taskId;    // 周期任务ID
    private Context context=this;
    private TestThread locationThread; //定时动态获取经纬度线程
    private Boolean isInterrupted = true;
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        System.out.println("********SingASongService-->onCreate");
        super.onCreate();
        mMediaPlayer = MediaPlayer.create(this, R.raw.no_kill);
        mMediaPlayer.setLooping(true);
    }

    @Override
    public 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() {
            @Override
            public 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;
    }

    @Override
    public 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 获取本机代理ip android studio获取定位_Android定位_02

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的状态在可用、暂时不可用和无服务三个状态直接切换时触发此函数
            @Override
            public void onStatusChanged(String provider, int status,
                                        Bundle extras) {

            }

            // Provider被enable时触发此函数,比如GPS被打开
            @Override
            public void onProviderEnabled(String provider) {

            }

            // Provider被disable时触发此函数,比如GPS被关闭
            @Override
            public void onProviderDisabled(String provider) {

            }

            // 当坐标改变时触发此函数,如果Provider传进相同的坐标,它就不会被触发
            @Override
            public 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);
        }
    }
}