我必须开发一个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>
此外,我可以获取每个设备的位置,但问题是我应该如何在两个设备之间发送和接收这些数据。
如果有人愿意帮助我澄清这一点,我将非常感激。
提前致谢。
答案 0 :(得分:4)
如果您有服务器,则可以使用以下代码:
您可以定期运行service(大约15分钟左右)。此服务可以将设备的位置发送到服务器以及获取朋友设备的位置。因为服务将运行在周期性的背景下,它将是有效的,不会消耗太多的电力。
如果附近有朋友,此服务将每次检查。如果这样,可以生成通知。您可以使用以下内容进行检查:
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();
}
您必须将这些位置存储在sqlite数据库中。Here是关于sqlite的教程。
对于gps跟踪,您可以参考此tutorial。
注意:但请确保两台设备都启用了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作业,该作业将每分钟执行一次并检查“谁接近谁”并向他们发送通知。
希望它有助于某人:)