#android #gps
#Android #gps
Вопрос:
Я хочу создать приложение, подобное:
- Я в городе X
- Я хочу получать уведомления (например, о звонке будильника или вибрации и т.д.), Когда я достигаю города Y.
У меня уже есть база данных sqlite, содержащая информацию (широта, долгота) о многих городах.
Я искал Google и SO, но не нашел правильного решения.
Пока что мои исследования говорят об этом:
Что мне нужно сделать, так это создать Service
или BroadcastReceiver
получить текущее местоположение мобильного телефона с помощью GPS.
Поправьте меня, если я ошибаюсь.
Я хочу получить текущее местоположение мобильного телефона с интервалом в 10 минут. И на основе этих значений широты и долготы я сравню это с запланированной долготой широты города.
Если происходит совпадение, оно должно уведомить пользователя.
То, что я сделал:
-
Я знаю, как получить текущее местоположение пользователя. (Но не путем создания сервиса. Это то, что я хотел знать! )
-
Я могу добавлять задачи в базу данных sqlite.
Пожалуйста, подскажите мне, как я могу подойти к этому приложению.
Запускает его, когда пользователь запускает приложение:
Intent i = new Intent(context, MyLocationApps.class);
context.startService(i);
public class MyLocationApps extends Service{
LocationManager locMan;
Location curLocation;
Boolean locationChanged;
LocationListener gpsListener = new LocationListener() {
public void onLocationChanged(Location location) {
// Log.w("GPS", "Started");
if (curLocation == null) {
curLocation = location;
locationChanged = true;
}
if (curLocation.getLatitude() == location.getLatitude() amp;amp; curLocation.getLongitude() == location.getLongitude())
locationChanged = false;
else
locationChanged = true;
curLocation = location;
if (locationChanged)
locMan.removeUpdates(gpsListener);
}
public void onProviderDisabled(String provider) {
}
public void onProviderEnabled(String provider) {
// Log.w("GPS", "Location changed", null);
}
public void onStatusChanged(String provider, int status,
Bundle extras) {
if (status == 0)// UnAvailable
{
} else if (status == 1)// Trying to Connect
{
} else if (status == 2) {// Available
}
}
};
@Override
public void onCreate() {
Toast.makeText(getBaseContext(),"Inside onCreate of Service", Toast.LENGTH_LONG).show();
Log.e(TAG, "Inside onCreate of Service");
super.onCreate();
locMan = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
locMan.requestLocationUpdates(LocationManager.GPS_PROVIDER,0, 0, gpsListener);
/*if (locMan.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
locMan.requestLocationUpdates(LocationManager.GPS_PROVIDER,20000, 1, gpsListener);
} else {
this.startActivity(new Intent("android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS"));
}
*/
if (curLocation != null) {
double lat = curLocation.getLatitude();
double lng = curLocation.getLongitude();
Toast.makeText(getBaseContext(),"Lat : " String.valueOf(lat) "n Long : " String.valueOf(lng), Toast.LENGTH_LONG).show();
}
else
{
Toast.makeText(getBaseContext(),"Didn Get any location", Toast.LENGTH_LONG).show();
}
}
final String TAG="LocationService";
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Toast.makeText(getBaseContext(),"Inside onStartCommand of Service", Toast.LENGTH_LONG).show();
Log.e(TAG, "Inside onStartCommand of Service");
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onLowMemory() {
// TODO Auto-generated method stub
super.onLowMemory();
}
@Override
public void onStart(Intent i, int startId)
{
Toast.makeText(getBaseContext(),"Inside onStart of Service", Toast.LENGTH_LONG).show();
Log.e(TAG, "Inside onStart of Service");
}
public IBinder onBind(Intent arg0) {
Log.e(TAG, "Inside onBind of Service");
return null;
}
}
Проблема в коде
Когда я запускаю приложение в первый раз, оно отображает всплывающие сообщения. Но оно никогда не отображает всплывающее сообщение, даже если я отправляю местоположение через DDMS..
Где я ошибаюсь, можете ли вы, пожалуйста, сказать мне?
Ответ №1:
Взгляните на код здесь:android-mycycle/MyLocationManager.java
Я реализовал это для своего приложения. Я пытаюсь исправить GPS, прежде чем начну получать местоположение.
Ответ №2:
Наконец-то у меня получилось: (Спасибо Ганапати и Фархану)
public class MyLocationApps extends Service{
LocationManager locMan;
Location curLocation;
Boolean locationChanged;
Handler handler = new Handler();
LocationListener gpsListener = new LocationListener() {
public void onLocationChanged(Location location) {
// Log.w("GPS", "Started");
if (curLocation == null) {
curLocation = location;
locationChanged = true;
}
if (curLocation.getLatitude() == location.getLatitude() amp;amp; curLocation.getLongitude() == location.getLongitude())
locationChanged = false;
else
locationChanged = true;
curLocation = location;
if (locationChanged)
locMan.removeUpdates(gpsListener);
}
public void onProviderDisabled(String provider) {
}
public void onProviderEnabled(String provider) {
// Log.w("GPS", "Location changed", null);
}
public void onStatusChanged(String provider, int status,
Bundle extras) {
if (status == 0)// UnAvailable
{
} else if (status == 1)// Trying to Connect
{
} else if (status == 2) {// Available
}
}
};
@Override
public void onCreate() {
Toast.makeText(getBaseContext(),"Inside onCreate of Service", Toast.LENGTH_LONG).show();
Log.e(TAG, "Inside onCreate of Service");
super.onCreate();
locMan = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
locMan.requestLocationUpdates(LocationManager.GPS_PROVIDER,0, 0, gpsListener);
/*if (locMan.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
locMan.requestLocationUpdates(LocationManager.GPS_PROVIDER,20000, 1, gpsListener);
} else {
this.startActivity(new Intent("android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS"));
}
*/
if (curLocation != null) {
double lat = curLocation.getLatitude();
double lng = curLocation.getLongitude();
Toast.makeText(getBaseContext(),"Lat : " String.valueOf(lat) "n Long : " String.valueOf(lng), Toast.LENGTH_LONG).show();
}
else
{
Toast.makeText(getBaseContext(),"Didn Get any location", Toast.LENGTH_LONG).show();
}
}
final String TAG="LocationService";
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Toast.makeText(getBaseContext(),"Inside onStartCommand of Service", Toast.LENGTH_LONG).show();
Log.e(TAG, "Inside onStartCommand of Service");
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onLowMemory() {
// TODO Auto-generated method stub
super.onLowMemory();
}
@Override
public void onStart(Intent i, int startId)
{
Toast.makeText(getBaseContext(),"Inside onStart of Service", Toast.LENGTH_LONG).show();
Log.e(TAG, "Inside onStart of Service");
handler.postDelayed(GpsFinder,5000);// will start after 5 seconds
}
public IBinder onBind(Intent arg0) {
Log.e(TAG, "Inside onBind of Service");
return null;
}
public Runnable GpsFinder = new Runnable()
{
public void run()
{
// TODO Auto-generated method stub
if (locMan.isProviderEnabled(LocationManager.GPS_PROVIDER))
{
locMan.requestLocationUpdates(LocationManager.GPS_PROVIDER,0, 0, gpsListener);
}
else
{
getApplicationContext().startActivity(new Intent("android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS"));
}
if (curLocation != null) {
double lat = curLocation.getLatitude();
double lng = curLocation.getLongitude();
Toast.makeText(getBaseContext(),"Lat : " String.valueOf(lat) "n Long : " String.valueOf(lng), Toast.LENGTH_LONG).show();
}
handler.postDelayed(GpsFinder,5000);// register again to start after 5 seconds...
}
};
}
Комментарии:
1. Я подумал, что эта GPS-сигнализация могла бы стать для меня новой идеей для реализации. Но вы внедрили его раньше меня!!! Можем ли мы получить значение GPS для места (когда я держу свой мобильный телефон в этом месте) без подключения к Интернету?
2. ДА. вам нужно будет использовать сетевое местоположение (местоположение вышки сотовой связи).
3. Спасибо. Сталкивались ли вы с каким-либо подобным приложением для сигнализации GPS для Android, готовым к загрузке и бесплатному использованию?
4. ДА. Я разработал такое приложение. Но не поместил его в Google Play.. В Google Play вы найдете множество приложений.
Ответ №3:
Я думаю, вам следует использовать Geofence
наряду с intentservice
. Обратитесь к официальной документации для получения дополнительной информации.