Android:GPS跟踪系统,可在近距离内找到对方

时间:2013-12-02 05:44:14

标签: java android gps

我必须开发一个Android应用程序,这个应用程序应该做的是帮助人们在一个近距离区域找到对方,而不会浪费太多的力量。两个人都可以使用手机将手机朝向彼此找到。它可以使用gps给出行进的初始方向(向前,向左,向右,向后)。然后它可以使用蓝牙和wifi强度来让用户大致了解它们是越来越近。它不需要给出电话之间的特定距离。

我已经按照这个(http://www.androidhive.info/2012/07/android-gps-location-manager-tutorial/)教程进行了测试。但我不知道如何在我的应用程序中使用它。

我是开发Android应用程序的实习生,我是GPS跟踪系统的新手。实际上我对如何启动这个应用程序并不清楚。

这是我的尝试。

我的xml文件:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >

<Button
    android:id="@+id/button2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignBaseline="@+id/button1"
    android:layout_alignBottom="@+id/button1"
    android:layout_alignParentRight="true"
    android:onClick="stopNewService"
    android:text="Stop Service" />

<Button
    android:id="@+id/button1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true"
    android:layout_marginTop="23dp"
    android:onClick="startNewService"
    android:text="Start Service" />

这是我的MyService.java类

package com.example.service;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.widget.Toast;

public class MyService extends Service {

@Override
public IBinder onBind(Intent intent) {
    // TODO Auto-generated method stub
    return null;
}

@Override
public void onCreate() {
    Toast.makeText(this, "The new Service was Created", Toast.LENGTH_LONG)
            .show();

}

@Override
public void onStart(Intent intent, int startId) {
    // For time consuming an long tasks you can launch a new thread here...
    Toast.makeText(this, " Service Started", Toast.LENGTH_LONG).show();

}

@Override
public void onDestroy() {
    Toast.makeText(this, "Service Destroyed", Toast.LENGTH_LONG).show();

}

}

这是我的MainActivity.java类

package com.example.service;

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.widget.Button;

public class MainActivity extends Activity implements View.OnClickListener {
private Button bStart, bStop;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
}

// Start the service
public void startNewService(View view) {

    startService(new Intent(this, MyService.class));
}

// Stop the service
public void stopNewService(View view) {

    stopService(new Intent(this, MyService.class));
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
public void onClick(View v) {
    // TODO Auto-generated method stub
    switch (v.getId()) {
    case R.id.button1:
        startNewService(v);

        break;
    case R.id.button2:
        stopNewService(v);

        break;

    default:
        break;
    }
}

}

我已将该服务添加到清单文件中。

<service android:name=".MyService"></service>

此外,我可以获取每个设备的位置,但问题是我应该如何在两个设备之间发送和接收这些数据。

如果有人愿意帮助我澄清这一点,我将非常感激。

提前致谢。

2 个答案:

答案 0 :(得分:4)

如果您有服务器,则可以使用以下代码:

  1. 您可以定期运行service(大约15分钟左右)。此服务可以将设备的位置发送到服务器以及获取朋友设备的位置。因为服务将运行在周期性的背景下,它将是有效的,不会消耗太多的电力。

  2. 如果附近有朋友,此服务将每次检查。如果这样,可以生成通知。您可以使用以下内容进行检查:

    public static float distBetweenTwoPoints(float lat1, float lng1,
            float lat2, float lng2) {
        // returns distance (in meters) between two points
        double earthRadius = 3958.75;
        double dLat = Math.toRadians(lat2 - lat1);
        double dLng = Math.toRadians(lng2 - lng1);
        double a = Math.sin(dLat / 2) * Math.sin(dLat / 2)
                + Math.cos(Math.toRadians(lat1))
                * Math.cos(Math.toRadians(lat2)) * Math.sin(dLng / 2)
                * Math.sin(dLng / 2);
        double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
        double dist = earthRadius * c;
    
        int meterConversion = 1609;
    
        return new Float(dist * meterConversion).floatValue();
    }
    
  3. 您必须将这些位置存储在sqlite数据库中。Here是关于sqlite的教程。

  4. 对于gps跟踪,您可以参考此tutorial

  5. 注意:但请确保两台设备都启用了gps。

    编辑

    It can then use bluetooth and wifi strength to give the users a general idea of whether they are getting closer or farther
    

    一旦您的服务检查到附近有两个朋友(在大​​约蓝牙范围内)。您可以通过编程方式打开蓝牙并实现您想要做的事情。

答案 1 :(得分:0)

基本理念: 1)服务器中的设置数据库(MySQL,SQL等),其中包含具有thr位置数据的用户表和位置表

2)在Android Create Service中,将在15分钟内触发一次,请求当前位置。

3)创建SharedPreference / SQliteDB,它保存设备的最后一个坐标,该坐标也更新到服务器数据库。

4)如果当前位置与从SharedPreference中检索到的最后位置和/或在邻近区域内的位置匹配(取决于您提供多少30英尺或更多),则用户位于同一位置,因此不要将坐标上传到服务器数据库。

5)如果用户不在附近或最后位置与当前位置不匹配,则将坐标上传到服务器数据库。

6)将坐标上传到服务器后,也要更新SharedPreference ..

7)上传后的坐标后,服务器必须从您附近的数据库中返回用户详细信息。然后,您的应用会知道您附近的人并向您发送通知,说“您的好友XXX就在附近!”

8)在服务器中,上传坐标后,服务器还会使用“Google Cloud Messaging”向您附近的用户发送通知。

9)提示:在服务器中运行一个cron作业,该作业将每分钟执行一次并检查“谁接近谁”并向他们发送通知。

希望它有助于某人:)